목차
- 현재 구현 방식(busy_wait): 왜 비효율적인가?
- Our Solution: Sleep-awake! 왜 더 효율적인가? (개념/코드)
Reference
Alarm Clock
- Reimplement
timer_sleep()
, defined in devices/timer.c
.
- 위의 timer_sleep() 함수는 busy-wait 방식으로 구현되어 있다.
- busy-wait? thread가 CPU를 점유하면서 대기하는 상태를 말한다. CPU 자원이 낭비되고 소모 전력이 불필요하게 낭비될 수 있음.
- process synchronization 문제! 공유 자원에 서로 다른 프로세스가 동시에 접근해서 둘 다 고치려고 한다면? ⇒ 에러 발생! 각 execution은 경쟁 관계이다.
- 이를 막기 위한 방법 중 하나로 busy-wait! but 이 방식은 매번 thread가 running 상태로 올라갔다가 다시 ready로 내려오는 작업을 시간이 만료될 때까지 반복한다. 따라서 비효율적임.
1. busy wait: 현재 구현 방식! 왜 비효율적?
- 여기서 잔다? timer_sleep() ⇒ 엄밀히 말하면 잔다기보다 양보하는 것!
- thread_yield() ⇒
- while문 돌면서 ready_list에 있는 애들을 계속 체크하면서 CPU 시간을 소모!
- 무한 while 루프 돌아 (지정된 시간까지)
- ready list 말고 별도 리스트 만들어서 ready list 애들 일일이 체크할 필요 없이!
2. Sleep-awake
- ready_list와 별도로 sleep_list를 만든다. ⇒
- thread_sleep ⇒ 깨어날 시간을 알려줘!
- 여기서 timer_sleep에 각자가 내가 깨어날 시간을 기억하고 있어. 그러기 위해서는 자료구조가 필요함.
- → thread.h에 thread 구조체 내 새로운 멤버를 만들어줘야! wakeup_tick ⇒ int64_t!