-
Pintos Project #1 : Pintos 환경 구축 (3/3)Computer Science/OS 2020. 5. 29. 14:57728x90
3-2. 자료구조 분석
1. Thread의 tcb의 구조
1) Tid_t tid : thread의 고유한 id이다. Allocate_tid()함수에 의해 생성된다.
2) Enum thread_status status : thread의 상태를 나타낸다.
번호 이름 설명 1 THREAD_RUNNING thread가 run상태임을 나타내고, 한 시점에 cpu를 가지는 thread, 즉 run하는 thread는 1개이다. 2 THREAD_READY run인 thread가 interrupt로 인해 ready상태가 됨을 나타낸다. 또는 새로 만들어진 thread가 바로 실행(run)되지 않고, ready상태가 됨을 나타낸다. 이 상태의 thread는 ready queue에서 run하기를 기다린다. 본격적으로 Scheduling의 대상이 되는thread 상태이기도 하다. 3 THREAD_BLOCK run인 thread에 i/o 또는 특정 event로 인해 이 상태로 바뀌면서 cpu를 반납한다. 4 THREAD_DYING thread의 종료가 됨을 나타내는 상태이다. 3) Char name[16] : thread의 이름을 나타내는 문자열이다.
4) *stack : run하던 thread가 context switching이 발생될 때, 기존의 register들을 stack에 저장하고, 이 위치를 *stack에 저장한다. 즉, *stack에 저장된 값을 따라가면 기존의 context를 찾을 수 있다.
5) Int priority : thread의 우선순위를 나타낸다. Pintos에서는 0에 가까울수록 우선순위가 낮음을 뜻한다.
6) Struct list_elem elem : “thread가 queue에서 줄을 선다”는 의미는 “thread의 tcb가 queue에 줄을 선다”는 의미이다. 이때 linked list형태로 줄을 서는데 이때 사용되는 필드값이다.
7) Unsigned magic : thread의 tcb는 stack의 하나의 영역을 차지한다. 이 영역의 침범여부를 확인하기 위해 이 필드값을 이용한다. 예를 들어 이 필드의 값이 1234인데 특정 작업 후 확인해보았을 때 값의 변경이 있다면, 영역이 침범 당한 적이 있다고 판단할 수 있다.
2. Kernel thread의 구조
1) Kernel_thread()함수에서 사용되는 frame이다.
2) Eip register에는 return address를 저장한다.
3) Thread_func *function : Thread_create()함수의 변수 중, 생성할 thread에서 실행될 함수를 정의한다.
3. Switch thread frame의 구조
1) Switch_thread()함수에서 사용되는 frame이다.
2) Cur argument와 next argument를 정의한다.
4. Switch entry frame의 구조
1) Switch_entry()함수에서 사용되는 frame이다.
2) Cur과 next값을 pop하고, thread를 initializing한다.
5. intr frame의 구조
1) Vec_no : interrupt의 고유번호이다. 이 번호를 통해 외부 Interrupt인지, 내부 interrupt인지 판단한다.
2) ss부터 eip까지는 interrupt 발생 직후 cpu에 의해 저장된다.
3) ebp(frame pointer)부터 vec_no까지는 intrNN_stub()함수에 의해 저장된다.
4) 남은 register는 intr_entry()함수에 의해 저장된다.
5) Interrupt의 발생 시점에서의 running thread와 interrupt간의 관계가 무관할 경우가 대부분이다. 그렇다 하여도 intr_frame은 직전에 run인 thread의 context를 저장한다.
3-3. 프로그램 실행 경로 분석
1. Main()의 주요 함수를 보면 다음과 같다.
1) Thread_init() : kernel이 자기 자신을 하나의 thread로 만드는 과정의 함수이다.
2) Palloc_init(), malloc_init(), paging_init() : 메모리의 초기화과정의 함수이다.
3) Intr_init() : interrupt의 초기화과정의 함수이다.
4) Timer_init(), kbd_init() : 입출력장치인 타이머와 키보드를 초기화하는 함수이다.
5) Thread_start() : thread의 본격적인 시작이자 운영체제의 동작의 시작을 의미하는 함수이다.
6) Run_actions(argv) : 위의 주요 함수들의 실행은 부팅과정에서 실행된다. 부팅 이후에 추가적인 testing을 할 경우 이 함수가 실행된다. 다시 말해, thread들이 잘 만들어졌는지 특정 프로그램(alarm-multiple 등)을 test하는 단계이다.
7) Shutdown(), thread_exit() : 조건이 만족되면 정상종료한다.
2. 위의 6)에서 alarm-multiple 프로그램이 실행된다. 실행 결과화면은 다음과 같다.
1) Pintos run : pintos를 부팅하는 명령어
2) alarm-multiple : alarm-multiple 테스트 프로그램을 실행하는 명령어
3) bochs는 cpu 애뮬레이터이다. 즉 hardware를 흉내내는 프로그램이다.
4) Pintos booting with 4,096KB RAM : 부팅의 본격적인 시작을 나타낸다. 4KB단위로 tcb가 생성된다.
5) Boot complete : 부팅이 완료됨을 뜻한다. 이후 문장들은 테스트 프로그램의 실행을 의미한다.
6) Alarm-multiple 프로그램은 thread 5개를 만들어 알람기능을 하는 테스트 프로그램이다.
7) Thread 0은 duration=10의 간격으로 7번 출력된다. Thread 1은 duration=20의 간격으로 7번 출력된다. 같은 방식으로 thread 2,3,4도 작동된다.
8) Duration이란 clock_interrupt의 발생 횟수이다.
9) Execution of ‘alarm-multiple’ complete : 테스트 프로그램이 종료됨을 나타낸다.
10) 이후에는 idle thread가 실행된다. 이때 ctrl+c를 누르면 빠져나올 수 있다.
728x90'Computer Science > OS' 카테고리의 다른 글
CS : OS : Process (0) 2021.03.25 Pintos Project #3 : Thread scheduling (2) 2020.05.29 Pintos Project #2 : Alarm Clock의 개선 (0) 2020.05.29 Pintos Project #1 : Pintos 환경 구축 (2/3) (0) 2020.05.29 Pintos Project #1 : Pintos 환경 구축 (1/3) (0) 2020.05.29