ABOUT ME

-

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

    12.      thread_yield()

    1)      thread_yield() : thread switching에 의해 실행되는 첫 번째 경우의 함수이다. 이 함수는 run하던 thread가 time slice expired로 인해 cpu를 빼앗겨야 하는 경우에 실행되는 함수이다. 

     

     

    2)     If구문을 보면, 현재 thread가 idle thread가 아니라면, 현재 thread를 ready queue에 넣고, 상태를 ready상태로 바꾼다. 

     

     

    3)     Schedule() : shcedule함수로 인해 shceduling을 한다. 이 함수를 기준으로 run하는 thread와 다음 run할 thread의 context가 바뀐다.


    13.     thread_block()

    1)      thread_block() : thread switching에 의해 실행되는 두 번째 경우의 함수이다. run인 thread가 i/o 등 특정 event가 발생되면, thread는 wait상태로 바뀌는데 이 때 실행되는 함수이다. 

     


    2)     
    ASSERT(intr_get_level()==INTR_OFF) : i/o 등 특정 event는 외부로 부터 발생되므로, intr_off를 하여 추가적인 interrupt를 끈다.

     

     

    3)     Thread_currunt()->status=THREAD_BLOCKED : thread의 상태를 wait(block)으로 한다.


    14.     thread_exit()

    1)      세 번째 경우의 함수이다. run인 thread의 실행이 정상종료될 때, 이 함수를 호출하므로써, run인 thread는 정상종료가 되고, 다음 thread가 run하게 된다. 

     

     

    2)     List_remove (&thread_current()->allelem) : 모든 queue에 thread를 삭제한다.  

     

     

    3)     Thread_current()->status=THREAD_DYING : 현재 thread의 실행이 종료되었으므로, thread_dying으로 한다. 

     

     

    4)     NOT_REACHED() : schedule 이후 run이었던 thread의 context는 실행되지 않는다.


    15.     Schedule()

    1)      Schedule() : 이 함수는 첫째로, run할 다른 thread를 찾는다. 둘째로, 현재 run할 thread와 다음 run할 thread의 context의 switch를 한다. 이 때, interrupt는 off되어야 한다. 

     

     

    2)     *cur=running_thread() : 현재 run인 thread의 tcb를 cur포인터가 가리킨다. 

     

     

    3)     *next=nex_thread_to_run() : ready queue에서 다음 run할 thread를 특정 우선순위에 따라 찾아, 그 thread의 tcb를 next포인터가 가리킨다.  

     

     

    4)     Prev=switch_threads(cur,next) : switch_threads(cur,next)에 의해, context switch가 일어나고 그로 인해 발생된 값을 prev포인터에 저장한다. 사실 이 값은 eax register 값이고 그 값이 prev에 저장되는데 이는 다음 switch_thread()함수에서 자세히 다루도록 하겠다. 

     

     

    5)     Thread_schedule_tail(prev) : schedule의 마무리작업을 하는 함수이고, 변수로 prev를 받는다.


    16.      Switch_thread()

     1)      Switch_thread() : 현재 run인 thread와 다음에 run할 thread간의 context switch를 하는 함수이다. 현재 run인 thread는 cur, 다음에 run할 thread는 next이다. 

     

     

    2)     pushl %ebx ~ pushl %edi : cur thread의 context를 cur thread의 stack에 저장(push)한다. 

     

     

    3)     movl thread_stacks_ofs, %edx : thread_stacks_ofs는 thread의 시작 주소와 stack pointer가 있는 주소(=tcb의 stack 필드 주소)간의 간격(offset)을 나타낸다. 이 값을 통해, stack pointer가 어디있는지 알 수 있고, 따라서 직전의 context의 위치를 알 수 있다. 이를 edx에 저장한다. 

     

     

    4)     movl SWITCH_CUR(%esp), %eax : 현재 esp는 stack의 top을 가리킨다. SWITCH_CUR(%esp)를 통해, esp는 cur의 tcb의 시작 주소를 가리키게 되고, 이 값을 eax에 저장한다. Switch_thread()함수가 마무리 될 때 return 값으로 eax에 저장된 값이 return된다. 다시 말해, switch_thread()함수가 끝나면 cur thread의 tcb의 시작 주소를 return한다. 

     

     

    5)     movl %esp, (%eax, %edx, 1) :esp는 cur의 tcb에서 stack 필드 주소를 가리킨다. 

     

     

    6)     movl SWITCH_CUR(%esp), %ecx : SWITCH_CUR(%esp)를 통해, esp는 next thread의 tcb의 시작 주소를 가리키고, 이 값을 ecx에 저장한다. 

     

     

    7)     movl (%ecx, %edx, 1), %esp : esp는 next의 tcb에서 stack 필드 주소를 가리킨다. 최종적으로 esp는 next thread의 top을 가리킨다. 

     

     

    8)     popl %edi ~ popl %ebx : next thread의 stack에 있는 next thread의 context를 복원(pop)한다. 

     

     

    9)     ret : eax값을 return한다. 즉 cur thread(context switch 이전의 run인 thread)의 tcb의 시작 주소값을 return한다.


    17.     Thread_schedule_tail()

    1)      Thread_schedule_tail() : schedule의 마무리 작업을 하는 함수이다. 변수로 prev포인터를 받는데 이것은 직전에 run하던 thread의 tcb의 시작 주소 값이다. 

     

     

    2)     Thread *cur=running_thread() : context switch이후에 run하는 thread를 cur로 한다. 

     

     

    3)     Cur->status=THREAD_RUNNING : cur thread의 상태를 run으로 한다. 

     

     

    4)     Thread_ticks=0 : thread_tick을 0으로 초기화한다. Thread_tick()함수에서 이 값을 이용하여 이후에 thread의 time slice expired 여부를 확인한다. 

     

     

    5)     If문의 조건은 prev의 상태, 즉 직전에 run하던 thread의 상태가 정상종료이고, initial_thread가 아니라면, palloc_free_page(prev)를 통해 종료된 thread의 메모리를 반납한다. 이로써 tcb가 초기화된다.


    18.      Switch_entry:

    1)      Switch_entry : 만약, context switch의 대상 thread가 처음으로 실행되는 thread라면, thread_create()함수에 의해, stack_frame에는 fake_stack_frame으로 되어있다. 이 때, stack의 return address는 switch_entry()함수를 가리키고, 이 함수가 실행된다.

     

     

    2)     addl $8, %esp : esp값에 8을 더함으로써, cur과 next가 저장된 stack을 제거한다.(건너뛴다)

     

     

    3)     ret : 이 함수가 return할 때는 eip가 저장된 주소로 jump하게 되는데 eip는 kernel_thread()함수를 가리킨다.


    19.     Kernel_thread()

    1)      Kernel_thread()함수는 모든 thread가 처음 실행될 때 실행되는 thread이다.

     

     

    2)     Function(aux) : thread 함수를 실행한다.


    20.     Run_action()

    1)      Run_action() : 테스트 프로그램을 실행하는 함수이다. 

     

     

    2)     Struct action : action 구조체를 선언한다. 

              (1)    *name : 수행 동작의 이름이다. 

              (2)   Argc : 명령의 옵션의 갯수이다. 

              (3)   Function : 수행 동작의 함수이다. 

     

     

    3)     For문은 보면, action 구조체의 name요소와 옵션을 비교하면서 action name을 찾는다. 

     

     

    4)    A->function : 테스트 프로그램을 실행한다. 

    728x90

    댓글

kxmjhwn@gmail.com