본문 바로가기
C언어/Pintos

Understanding Threads

by lacuca9 2024. 9. 25.

쓰레드 생성, 쓰레드 종료, 쓰레드 간에 스위치를 하는 간단한 스케줄러, 동기화 함수가 구현 되어있음

- 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에 놓이게 하기.

 

 

'C언어 > Pintos' 카테고리의 다른 글

WIL3 (1)  (0) 2024.10.10
WIL  (0) 2024.10.01
Synchronization  (0) 2024.09.25
개요  (0) 2024.09.25