/* Suspends execution for approximately TICKS timer ticks. */
void timer_sleep (int64_t ticks) {
int64_t start = timer_ticks ();
ASSERT(intr_get_level() == INTR_ON);
while (timer_elapsed (start) < ticks)
thread_yield ();
}
ํ์ฌ while๋ฌธ ์์์ ์ธ์๋ก ๋ฐ์ ticks ๋งํผ ๊ณ์ํด์ ํ์ฌ CPU ์ ์ ๋ฅผ ๋ค๋ฅธ ์ค๋ ๋์๊ฒ ์๋ณดํ๊ณ ready_list์ ์ ์ผ ๋ค๋ก ๋ฃ์ด์ฃผ๊ณ ์๋ค.
์ฆ, ๊ณ์ํด์ ๋ฌดํ ๋ฃจํ๋ฅผ ๋๋ฉด์ ์ฒดํฌ๋ฅผ ํ๊ธฐ ๋๋ฌธ์ CPU ์์์ ๋ญ๋นํ๊ฒ ๋๋ค.
๐ ์ฐธ๊ณ ์ฌํญ
๊ธฐ๋ณธ์ ์ผ๋ก system timer๋ ์ด๋น 100ํ์ ticks์ ๋ฐ์์ํจ๋ค (์ฆ, 1 tick = 10ms )
1. thread ๊ตฌ์กฐ์ฒด ์์
2. ์ ์ญ๋ณ์ ์ถ๊ฐ
3. ๊ตฌํํ ํจ์ ์ ์ธ
4. thread_init() ํจ์ ์์
5. timer_sleep() ํจ์ ์์
6. thread_sleep() ํจ์ ๊ตฌํ
์ฌ๊ธฐ์ ํ์ฌ ์ค๋ ๋๊ฐ idle thread ์ด๋ฉด sleep ๋์ง ์๋๋ก ํด์ผํ๋ค. idle ์ค๋ ๋๋ ์ด์์ฒด์ ๊ฐ ์ด๊ธฐํ๋๊ณ ready_list๊ฐ ์์ฑ๋ ๋ ์ฒซ๋ฒ์งธ๋ก ์ถ๊ฐ๋๋ ์ค๋ ๋์ด๋ค. ๊ตณ์ด ์ด ์ค๋ ๋๋ฅผ ๋ง๋ค์ด์ค ์ด์ ๋ CPU๋ฅผ ์คํ์ํ๋ก ์ ์งํ๊ธฐ ์ํจ์ด๋ค.
CPU๊ฐ ํ ์ผ์ด ์์ผ๋ฉด ์์ ๊บผ์ ธ๋ฒ๋ฆฌ๊ณ , ํ ์ผ์ด ์๊ธฐ๋ฉด ๋ค์ ์ผ์ง๋ ๋ฐฉ์์ด๋ฏ๋ก ์๋ชจ๋๋ ์ ๋ ฅ๋ณด๋ค ๋ฌด์๋ฏธํ ์ผ์ด๋ผ๋ ๊ทธ๋ฅ ๊ณ์ ํ๊ณ ์๋๊ฒ ๋ ์ ์ ์ ๋ ฅ์ ์๋ชจํ๋ค.
7. timer_interrupt() ํจ์ ์์
8. thread_awake() ํจ์ ๊ตฌํ
9. update_next_tick_to_awake() ํจ์ ์ถ๊ฐ
10. get_next_tick_to_awake() ํจ์ ์ถ๊ฐ
busy waiting์ ์ ๊ฑฐํ ํ์๋ sleep ์ํ์์ CPU๋ฅผ ์ ์ ํ์ง ์๊ธฐ ๋๋ฌธ์ idel tick์ด ์ฆ๊ฐํจ.
Q : timer_interrupt๋ฅผ ํ๋ ๊ฒ์ ํ๋์จ์ด์์ ์ผ์ด๋๋ ๋ ๋ฆฝ์ ์ธ main ๋ฌธ์ผ๋ก ๋ณด์๋ ๋๋๊ฐ? ์๋ฅผ ๋ค๋ฉด timer_sleep ํจ์์์ busy waiting ์์ while๋ฌธ ์์ ์์์๋ timer tick์ด ๊ณ์ ์ฆ๊ฐํ๋ ์ .
A : ๋น์ทํ ๋๋์ผ๋ก ์๊ฐ ํ๋ฉด ๋๋ค. Interrupt๊ฐ enable ๋์ด์๋ค๋ฉด kenel code์ ์ด๋ ๋ถ๋ถ์ ์คํ ์ค์ด๋ timer_interrupt๊ฐ ๋ฐ์ํ ์ ์๋ค.
์๋ฅผ๋ค์ด
1 int main () {
2 int i = 0;
3 i += 1;
4 i -= 10;
5 return 0;
6 }
์ด๋ฐ ์ฝ๋๊ฐ ์๊ณ , timer interrupt handler๊ฐ
7 void timer_intr_handler () {
8 timer_ticks ++;
9 }
์ด๋ฐ ์์ผ๋ก ์๊ฒผ๋ค๋ฉด, main ํจ์๋ฅผ ์คํ์ค์ผ ๋ 1~2๋ฒ ์ค ์ฌ์ด, 2~3๋ฒ ์ค ์ฌ์ด ๋ฑ ์ด๋ ์์น์์๋ interrupt๊ฐ ๋ฐ์ํ ์ ์๋ค. ๋ง์ฝ 2~3๋ฒ ์ค ์ฌ์ด์์ timer iinterrupt๊ฐ ๋ฐ์๋์๋ค๋ฉด, ์ค์ ๋ก ์ฝ๋๋ 1 -> 2 -> 7 -> 8 -> 9 -> 3 -> 4 -> 5 -> 6 ์์ผ๋ก ์คํ๋๋ค.