νΈμΆν νλ‘μΈμ€λ₯Ό μ ν΄μ§ μκ° νμ λ€μ μμνλ 컀λ λ΄λΆ ν¨μλ₯Ό Alarm
μ΄λΌ νλ€.
νμ¬ νν μ€μλ Busy waitingμ μ΄μ©νμ¬ κ΅¬νλμ΄ μλ€.
λ³Έ νλ‘μ νΈμμλ μλ κΈ°λ₯μ sleep/wake up
μ μ΄μ©νμ¬ λ€μ ꡬννλ€.
Threadκ° CPUλ₯Ό μ μ νλ©΄μ λκΈ°νκ³ μλ μν
CPU μμμ΄ λλΉ λκ³ , μλͺ¨ μ λ ₯μ΄ λΆνμνκ² λλΉλ μ μμ
9μμ μΌμ΄λλ €κ³ μλμ λ§μΆ°λ¨λλ° 1λΆλ§λ€ κΉ¨μ μκ°μ νμΈνλ κ±°λΌκ³ μκ°νλ©΄ μ΄ν΄νκΈ° μ½λ€.
μ΄λ° νλ μνμΈ Busy waitingμ κΉ° μκ°κΉμ§ νΉ μ¬μ°κ³ , κΉ° μκ°μ κΉ¨μ°λ λ°©μμ΄ sleep/wake up λ°©μμ΄λ€.
νλ‘μΈμ€λ μλ νμ κ°μ΄ 5κ°μ§μ μνλ₯Ό κ°μ§ μ μλ€.
νν μ€μμλ νλ‘μΈμ€μ μ€λ λλ₯Ό λμΌμνκ³ μλ€. κ·Έλμ μμ νλ‘μΈμ€ μν
λ₯Ό μ€λ λλ λκ°μ΄ κ°λλ€.
μ΅μ μ΄μ체μ μμλ λΉμ°ν λ©ν°μ€λ λ©μ μ§μνμ§λ§,
κ΅μ‘μ© OSμΈ νν μ€λ νλ‘μΈμ€λΉ νλμ μ€λ λλ‘ κ΅¬μ±λμ΄μλ€!
κ·Έλμ νλ‘μΈμ€μ μ€λ λλ₯Ό λμΌνκ² μ¬κΈ°κ³ ꡬννλ κ²μ΄λ€.
void timer_sleep(int64_t ticks)
{
int64_t start = timer_ticks();
ASSERT(intr_get_level() == INTR_ON);
// busy waiting μ λ° μ½λ
while (timer_elapsed (start) < ticks)
thread_yield ();
}
νμ¬λ μ μ½λμ κ°μ΄, κ³μ νμΈνκ³ ν¨μλ₯Ό μ€ννλ busy waiting
λ°©μμΌλ‘ ꡬνλμ΄ μλ€.
whileλ¬Έμ μ€ννλ©΄μ thread_yield()λ₯Ό νΈμΆνμ¬ ready list μ μλ λ€λ₯Έ μ€λ λλ₯Ό μν΄ CPU μ μ λ₯Ό λ°ννκ³ ready list κ°μ₯ λ€λ‘ μ΄λνλ€. μ΄ κ³Όμ μ ticks λμ λ°λ³΅λλ€.
νΉ μ¬μ§ λͺ»νλ μ€λ λλ₯Ό μ¬κ² ν΄μ£Όκ³ μΆλ€.
μμΌν μ λ€μ λ³ΈμΈμ΄ block(sleep) μνλ‘ λ§λ€μ΄ sleep_listμ λ£μ΄λλ€. -> κΉ° μκ°μ΄ λλ©΄ μ°Ύμκ°μ λ€μ Ready μνλ‘ λ°κΏμ€λ€.
wakeup_ticks
λ³μλ₯Ό μ μΈνλ€.sleep
νλ μ λ€μ λ΄μ sleep_list
λ₯Ό μ μνλ€.thread_init
ν¨μμμ sleep_list
λ₯Ό μ΄κΈ°νν΄μΌνλ€.)next_tick_to_awake
λ³μλ₯Ό μΆκ°νλ€.next_tick_to_awake
μ λν getterμ setter μν μ νλ update_next_tick_to_awake
, get_next_tick_to_awake
ν¨μλ₯Ό μΆκ°νλ€.thread_sleep
, thread_awake
ν¨μλ₯Ό μΆκ°νλ€.thread_sleep
μ¬μΈ μ λ€μ sleep_list
μ μΆκ°νκ³ blockμνλ‘ λ§λ λ€.
μ΄ κ³Όμ μμ μΈν°λ½νΈμ λ°©ν΄λ₯Ό 무μνκ³ μ¨μ ν ν¨μ λ΄λΆλ₯Ό μ€νν μ μμ΄μΌνκΈ° λλ¬Έμ μ²μμ intr_disable()
ν¨μλ₯Ό ν΅ν΄ μΈν°λ½νΈλ₯Ό λ°μλ€μ΄μ§ μλλ‘ νκ³ λ΄λΆκ° λ€ μ€νλκ³ λ§μ§λ§ λΆλΆμ λ€μ intr_set_level(old_level)
ν¨μλ₯Ό ν΅ν΄ μΈν°λ½νΈλ₯Ό λ°μλ€μ΄λλ‘ νλ€.
thread_awake
sleep list
μ λͺ¨λ entryλ₯Ό μννλ©΄μ νμ¬ tickμ΄ κΉ¨μμΌ ν tick 보λ€
μλ€λ©΄ μ¬λ¦½ νμμ μ κ±°νκ³ unblockνλ€.
ν¬λ€λ©΄ next_tick_to_awake
λ³μλ₯Ό κ°±μ νκΈ° μν΄ update_next_tick_to_awake()
λ₯Ό νΈμΆνλ€.
Thread : 0 idle ticks ...
->Thread : 550 idle ticks ...
idle μ€λ λλ CPU κ° μ무 ν μΌλ μμ λ μ€νλλ μ€λ λλ‘ idle tickλ idle μ€λ λκ° μ€νλ tickμ, μκ°μ μλ―Ένλ€.
Busy-Waiting
λ°©μμμλ κ³μ CPUκ° μ μ λκ³ μμ΄ idle μ€λ λκ° μ€νλ μΌμ΄ μμμ§λ§, Sleep / Wake up
λ°©μμΌλ‘ λ³κ²½ν νμλ CPUκ° μ μλ μ€λ λλ₯Ό μ μ νμ§ μκ³ idle μ€λ λκ° μ μ νμμ μ μ μλ€.
μ΄κ²μ μ€λ λκ° μ μλ λμ μμ€ν μμμ λλΉνμ§ μλλ‘ ν κ²μ΄λ€.
μ.. μ½μ§ μλ€...
μ κΈμ μ€κ³ λμ 맀μΌλ§€μΌμ΄ μλ‘μ§λ§, OSμ μ
λͺ
μ λ§μ΄ λ€μμ§λ§, μ΄λ κ²κΉμ§ μλ‘μΈ μ€μ λͺ°λλ€. OS μμ μ , 3μ£Όλμ B+νΈλ¦¬, malloc lab, μΉμλ² κ΅¬νμ νλ©΄μ λλ¦ μμν κ°λ
μ λ§μ£Όνλ λ°μ μ΅μν΄μ‘λ€κ³ μκ°νλλ° μ ν μλμλ€. λΉμ₯ νλ‘μΈμ€, μ€λ λκ° κ΅¬λΆλ μκ°λ μνμμ OSλ₯Ό ꡬννλΌλμ.. μμ² λ§λ§νμ§λ§ μμλ μ½μ λ€κ³ νλ€λ³΄λ©΄ μ΄λ»κ²λ λλ€. μ²μμ νν μ€ git cloneμ λ°κ³ μ΄λλΆν° λ΄μΌνλμ§λ λͺ°λλλ°, μΌμ£ΌμΌμ΄ μ§λ μ§κΈμ project1μ μλ£νκ³ project2 μμμ μλκ³ μλ€. νν μ€ μμνκ³ νκ· μλ©΄μκ°μ΄ ν μ€μλ€. μμ΄λ¬λν κ²μ μ λ§ νλ€μ§λ§ μ¬λ°λ€λ μ .
μ΄μ¬ν 곡λΆν΄μ project4κΉμ§ μ¬λ°κ², 무μ¬ν λ§μ³€μΌλ©΄!
μ½μ§ μλ€... νμ΄ν