ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Pintos Project #1 : Pintos 환경 구축 (3/3)
    Computer Science/OS 2020. 5. 29. 14:57
    728x90

    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

    댓글

kxmjhwn@gmail.com