쓰레드 생성, 쓰레드 종료, 쓰레드 간에 스위치를 하는 간단한 스케줄러, 동기화 함수가 구현 되어있음
- semaphores, locks, condition variables, and optimization barriers
어떤 함수를 실행하고자 하는 경우, thread_create() 의 인자로 실행하고자 하는 함수를 넣으면 됨.
미니 프로그램처럼 thread_create()하면 main()이 실행 되는 것처럼 쓰레드에 전달된 함수가 실행됨.
언제나 하나의 쓰레드만 실행되고 나머진 비활성화. 다음이 없으면 idle()로 실행. 기다려야 할 때 문맥교환 강제 진행.
문맥교환 방식은 threads/thread.c 의 thread_launch() 에 정의되어 있다.
이는 현재 실행중인 쓰레드의 상태를 저장하고, 스위칭 할 즉 다음으로 실행할 쓰레드의 상태를 복원함.
gdb로 문맥교환에서 뭔 일이 일어나는지 추적해보기
schedule() 함수에서 breakpoint 설정부터 시작.
스레드의 주소, 상태, 각각의 스레드에 대해 어떤 프로시저가 콜 스택에 있는 지를 추적.
하나의 스레드가 iret과 do_iret()을 실행할 때, 또 다른 스레드가 실행을 시작한다는 것을 알게됨.
목표 :
devices/timer.c 에 있는 이미 구현된 timer_sleep() 을 busy wait 방식이 아니게 수정.
반복문을 돌면서 현재 시간을 확인하고 충분한 시간이 경과할 때까지 thread_yield()를 호출
void timer_sleep (int64_t ticks);
timer가 적어도 x번 tick 할때까지 thread 호출의 실행을 일시 중단.
시스템이 idle(다음 thread가 없는) 상태가 아니면, thread가 정확히 x번의 tick이 발생한 직후에 wake up
할 필요가 없음. thread가 적절한 시간동안 대기 한 후 ready queue에 놓이게 하기.