κ³Όμ λ₯Ό μμ±νλ κ²μ΄ λ§μ΄ λ² μ°¨μ§λ§, ꡬννλ©΄μ μκ²λ μ μ μ‘°κΈμ©μ΄λΌλ λ¨κ²¨λ³΄λ €κ³ νλ€.
pintosμ λΆν μ, κΈ°λ³Έμ μΌλ‘ λ©μΈ μ€λ λμ idle μ€λ λκ° μμ±λλ€.
λ©μΈ μ€λ λλ init.cμ μλ main()
ν¨μκ° μ€λ λ 루ν΄μ΄ λλ€.
run_actions()
ν¨μλ₯Ό ν΅ν΄ μΈμλ‘ λ겨λ°μ ν
μ€νΈ μ΄λ¦κ³Ό μΌμΉνλ ν
μ€νΈλ₯Ό μννλ€.idle μ€λ λλ thread.cμ μλ idle()
ν¨μκ° μ€λ λ 루ν΄μ΄ λλ€.
block()
μν€λ©΄μ μ€μΌμ€ λ μ μλ λ€λ₯Έ μ€λ λμκ² cpuλ₯Ό μ보νλ€.λ©μΈ μ€λ λλ idle_started
λΌλ μΈλ§ν¬μ΄λ₯Ό μμ±νκ³ , 0μΌλ‘ μ΄κΈ°ν νλ€.
λ©μΈ μ€λ λλ thread_create()
ν¨μλ₯Ό ν΅ν΄ idle μ€λ λλ₯Ό μμ±νλ€. idleμ μ€λ λ 루ν΄μΌλ‘ idle()
ν¨μλ₯Ό λ±λ‘νκ³ , 루ν΄μ μΈμλ‘ 1μμ λ§λ idle_started
μΈλ§ν¬μ΄λ₯Ό μ λ¬νλ€. thread_create()
λ΄μ unblock()
μ΄ μκΈ° λλ¬Έμ, idle μ€λ λλ ready_listμ μΆκ°λλ€.
λ©μΈμ€λ λ μμ μ, idle_started
μΈλ§ν¬μ΄μ λν΄ down μ μλνλ©΄μ block()
λλ€.
β‘οΈ λ©μΈμ€λ λκ° block λλ©΄μ ready_listμ μλ idle μ€λ λκ° μ€μΌμ€ λλ©΄μ κ·Έμ μ€λ λ 루ν΄μΈ idle()
ν¨μκ° μ€νλλ€.
idle μ€λ λλ μμ μ idle_thread
μ μλ³μμ λ±λ‘νλ€.
idle_started
μΈλ§ν¬μ΄λ₯Ό up ν΄μ£Όλ©΄μ, 3μμ block()
λ main μ€λ λλ₯Ό unblock()
μμΌμ€λ€. μ΄λ‘ μΈν΄ λ©μΈ μ€λ λλ ready_listμ λ€μ΄κ°κ² λλ€.
idle μ€λ λλ μμ μ block()
μν€κ³ , ready_listμ μλ λ©μΈ μ€λ λκ° μ€μΌμ€ λλ©΄μ λ€μ μ€νλλ€. λ©μΈ μ€λ λλ μμ μ΄ μ§ννλ μ΄κΈ°νλ€μ λ€μ μ¬κ°νλ€. μ¦, μ΄ μ΄νμ λ©μΈμ€λ λλ, λ©μΈμ€λ λ μμ μ΄ μμ±νλ μ€λ λλ€κ³Ό ν¨κ» cpuλ₯Ό μ보νκ³ λΊμΌλ©΄μ ready_listμ cpu μ¬μ΄λ₯Ό μ€κ° κ²μ΄λ€.
β‘οΈ μ£Όλͺ©ν μ μ ,μ΄ν idle μ€λ λμ λν unblock()
μ΄ λͺ
μμ μΌλ‘ μ€νλμ§ μλλ€λ μ μ΄λ€. idle μ€λ λκ° 4 ticks (time_slice) μ΄μ cpuμμ μ¬λΌμ¨ μνκ° λμ΄ thread_yield()
κ° μ€νλλλΌλ, thread_yield()
λ idle μ€λ λλ₯Ό ready_listμ μ¬λ €μ£Όμ§ μλλ€(쑰건문μΌλ‘ ꡬνλμ΄ μμ). λ€λ§ μ΄λ€ μ€λ λκ° μ€νλλ μμ€μ μ΄λ€ μ΄μ λ‘λ schedule()
μ΄ μ€νλμμ λ, ready_listκ° λΉμ΄μλ€λ©΄, κ·Έμ μμΌ idle μ€λ λκ° cpuμ μ¬λΌκ°κ² λλ€.
μ΄λ κ² κ³μ idle μ€λ λμ κ΄μ¬μ κ°μ‘λ μ΄μ λ, alarm-clock ꡬν μ threadλ€μ busy waitλ₯Ό sleepμΌλ‘ κ°μ ν΄μΌ νκ³ , κ°μ μ΄ λμλμ§λ₯Ό νμΈνκΈ° μν΄ idle_ticks
κ° μ¬μ©λμκΈ° λλ¬Έμ΄μλ€. idle_ticks
λ ready_listμ λ μ΄μ ready μνμΈ μ€λ λκ° μμ΄ μ€μΌμ€λ λ€μ μ€λ λκ° μλ μν, μ¦ cpuκ° λΉμ΄μκ² λλ μνλ₯Ό 체ν¬νκΈ° μν λ³μμ΄λ€. cpuκ° λΉμ΄μλ tickλ§νΌ ν΄λΉ κ°μ΄ μ¦κ°νλλ°, λ°λ‘ μ΄ μ§μ μμ idle μ€λ λκ° interruptλ₯Ό λ°μμν€λ κ²μ΄ μλκ° νλ μ°©κ°μ νκ² λμ΄ λ§μ νΌλμ΄ μμλ€. κ·Έλμ interruptμ λν΄ μ’ λ μ΄ν΄λ³Ό νμκ° μμλ€.
μ΄λ² νλ‘μ νΈμμ κ³μ λ°μνλ timer interrupt
λ external interruptμ μΌμ’
μ΄λ€.
external interruptλ cpu μΈλΆμ μ₯μΉμμ λ°μμν€λ interruptμ΄λ€. μ΄λ 곧, external interruptλ μ€λ λκ° λ°μμν€μ§ μλλ€λ λ§κ³Ό κ°λ€.
λ€λ§, external interruptκ° λ°μνμ λ λ°©κΈ μ κΉμ§ cpuμμμ μ€νλκ³ μμλ μ€λ λκ° μ‘΄μ¬ν λΏμ΄λ€.idle_ticks
κ° μ¦κ° ν μ μμλ μ΄μ κ° λ°λ‘ μ¬κΈ°μ μλ€. timer interruptλ₯Ό μ²λ¦¬νλ timer_interrupt()
λΌλ μΈν°λ½νΈ νΈλ€λ¬λ thread_tick()
ν¨μλ₯Ό μ€ννλλ°, κ·Έ ν¨μλ νμ¬ cpuμμ μ¬λΌκ° μλ μ€λ λλ₯Ό νμΈν΄ ν΄λΉ μ€λ λμ μμνλ μ μλ³μ (idle_ticks
or kernel_ticks
)λ₯Ό 1 μ¦κ°μμΌ μ€λ€. μ΄λ₯Ό ν΅ν΄ μ°λ¦¬λ idle_ticks
μ κ°μ μ¦κ°μν€κ³ ν
μ€νΈ μ’
λ£ ν νμΈν μ μμλ κ²μ΄λ€.
λͺ
μμ μΈ μμ± νΈμΆ(thread_create()
)μ μ½κ² κ΄μ°°ν μ μλ μ¬ν μ€λ λλ€κ³Ό λ¬λ¦¬, pintos λΆν
μ κΈ°λ³Έμ μΌλ‘ μμ±λμ΄ κ°κ³ΌνκΈ° μ¬μ΄ μ€λ λ(λ©μΈ μ€λ λ, idleμ€λ λ)λ€μ΄ μ΄λμ μ μ₯λκ³ μ΄λ»κ² κ΄λ¦¬λλμ§λ₯Ό μμ λ³Ό μ μλ κΈ°νμλ€.
κ²°κ΅ μ΄ λͺ¨λ μ΄μΌκΈ°μ κ²°λ‘ μ, μ€λ λλ νμ μ μ₯λλ , μ μ λ³μμ λ±λ‘λλ κΈ°μ΅λκ³ μμ΄μΌ νλ€λ μ μ΄λ€. μ΄μ¨λ μ€λ λλ€μ΄ μ΄λκ°μ κΈ°μ΅λκ³ μμ΄μΌ, νμ¬ μμ€ν μ μ±νλ schedule λ°©λ²μ μ μ©νμ¬ μ€λ λλ€μ κ΄λ¦¬ν μ μλ κ²μ΄λ€.
μλ ꡬνμ΄ μ΄λ°νλ€λ³΄λ, μμΌλ‘λ μ€κ°μ€κ° 짧μ λ©λͺ¨ νμμΌλ‘ μκ²λ λ΄μ©μ μ μ΄ λ³Ό μμ μ΄λ€.