pintos์ ์ฒซ๋ฒ์งธ ๋ฉ์ด thread๋ฅผ ํตํด, os๊ฐ ์ด๋ป๊ฒ thread๋ค์ scheduling ํ๊ณ , synchronization ์ํค๋์ง ์ ์ ์์๋ค. ๊ฐ chapter๋ฅผ ํตํด ์ด๋ค ๊ธฐ๋ฅ๋ค์ด ์ด๋ค ์๊ตฌ์ ์๊ฒจ๋๊ฒ ๋์๋์ง๋ฅผ ์ค์ ์ผ๋ก ์ดํดํ๊ณ ์ ๋
ธ๋ ฅํ์๋ค. ๋ชจ๋ ์ผ์ด์ค๋ฅผ ์๊ฐํ๊ณ ๊ณ ๋ คํ๋ ๊ฒ์ ํตํด OS์ ์์ด์ generality๊ฐ ์ผ๋ง๋ ์ค์ํ๊ฐ๋ฅผ ๋๋ ์ ์์๋ค....

๊ธฐ์กด์ timer sleep ํจ์๋ busy waiting์ผ๋ก ์ค์ ํ sleep time์ด ์ง๋ฌ๋์ง ํ์ธํ์๋ค. ๊ทธ๋์ cpu๋ฅผ ๊ณ์ ์ก์๋จน๊ณ ์๋ค. ์ด๋ฅผ ready list๋ฅผ ํตํด busy waiting์ ํ์ง์๊ณ idle thread๋ก ํจ์จ์ ๋์ด๋ ๊ฒ์ด ๋ชฉํ์ด๋ค.
์ด๋ฅผ ์ํด, thread ๊ตฌ์กฐ์ฒด์ wake up thread tick์ ๊ณ์ฐํ์ฌ ๋ฃ์ด์ฃผ์๋ค. ๋ํ ํ์ฌ ์๊ณ ์๋ thread๋ค ์ค์ ๊ฐ์ฅ ๋นจ๋ฆฌ ์ผ์ด๋์ผํ thread tick์ ์ ์ฅํ๋ ๋ณ์(min_wake_up_tick)๋ฅผ ๋ง๋ค์ด์, ๋งค tick๋ง๋ค sleep list๋ฅผ ์ผ์ผํ ํ์ธํ์ง ์๋๋ก ํ์๋ค. ๊ทธ๋ฌ๊ธฐ ์ํด ready list์ ๋ค์ด๊ฐ๊ธฐ ์ ์ ์ด min_wake_up_tick์ ๊ฐฑ์ ํ์ฌ ์ฃผ์๋ค.
๊ธฐ์กด์ pintos๋ FIFO ์ค์ผ์ฅด๋ง์ผ๋ก, ๋จผ์ ์ ๋ ์์๋๋ก ์ผ์ด๋๊ณ ์์๋ค. ๋ํ ready list๋ค๋ Round robin ๋ฐฉ๋ฒ์ผ๋ก 4 ticks๋ง๋ค ์์๋๋ก ์คํ๋๊ณ ์์๋ค. ํ์ง๋ง, ์ค๋ ๋๋ง๋ค ์ค์์ฑ์ด ๋ค๋ฆ์ ๋ถ๋ช ํ๋ค. ์ด pintos๋ฅผ ์ ์ ๊ฐ ์ํ๋ priority ์์๋๋ก ๋จผ์ ์คํ๋๋๋ก ํ๋ ๊ฒ์ด ๋ชฉํ์ด๋ค.
์ด๋ฅผ ์ํด, thread์ priority๋ฅผ ์ ๋ ฅ๋ฐ์(pintos์ ์ด๋ฏธ ์ ํ ๋์ด ์์๋ค.) priority๊ฐ ๋์ thread๋ถํฐ ๋จผ์ ์คํ๋์ด ๋ง์ณ์ง ์ ์๋๋ก ํ์๋ค. ๋ํ, thread๊ฐ ์์ฑ๋์์ ๋, thread๊ฐ unblock ๋ ๋, ์ ์ ๊ฐ priority์ ๋ค์ ์ค์ ํ์ ๋์ ํ์ฌ ์คํ์ค์ธ thread์ ์ฐ์ ์์์ ๋น๊ตํ์ฌ, ์๋ก์ด priority๊ฐ ๋ ๋๋ค๋ฉด ๋ฐ๋ก ์คํ๋ ์ ์๋๋ก ํ์๋ค.
ํํธ thread์ ๋์์ฑ ๋๋ฌธ์ ๊ฐ์ ์์์ ์ ๊ทผํ๋ค๊ฐ๋ ์๋ฌ๊ฐ ์ผ์ด๋ ์ ์๋ค. ์ด๋ฅผ ๋ง๊ธฐ์ํด ๋๊ธฐํ(synchronize)๋ฅผ ํตํด ๊ฐ์ critical area์ ํ thread์ฉ ๋ค์ด๊ฐ ์ ์๋๋ก, ์ํธ ๋ฐฐ์ (Mutual exclusion)๋ฅผ ๋ณด์ฅํด์ค์ผ ํ๋ค. ์ด๋ฅผ ์ํด pintos์์๋ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ค.
Disabling interrupts : interrupts๋ฅผ ์ฐจ๋จ์ํด
Semaphore : ์์์ ์ ์๋ฅผ ์ฌ์ฉํด, ์ ๊ทผ์ ์ ํํ๊ณ ๋๊ธฐ์ํด (๋ค๋ฅธ thread๊ฐ sema up (release) ๊ฐ๋ฅ)
Lock : boolean์ ํตํด, ์ ๊ทผ์ ์ ํํ๊ณ ๋๊ธฐ์ํด, (lock holder๋ง release ๊ฐ๋ฅ)
Monitor : lock๊ณผ (monitor์ ๋ํ ์ ๊ทผ locks), condition variables์ ํตํด ์กฐ๊ฑด์ด ๋๋ฉด ๊นจ์, ์ ์ฒด๋ฅผ ๊นจ์ธ ์๋ ์๋ค.(pintos์์๋ ์ด๋ฅผ semaphore๋ฅผ ํ์ฉํด ๊ตฌํ)
Optimization barriers - complier์๊ฒ memory assumption์ ํ์ง ์๋๋ก ๋ง๋ ์์ญ ์ง์
synchronization ํด์ ๋ค์๋ priority ๋์ ์์๋๋ก ๋ฐ๋ก ์คํ๋ ์ ์๋๋ก ๊ตฌํํ์๋ค. ํ์ง๋ง, ์ด๋ฐ synchronization์ ์ํด priority๊ฐ ๋์ thread๊ฐ ์คํ๋์ง ๋ชปํ๋ priority inversion์ด ๋ฐ์ํ๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด donation์ ๊ตฌํํ๋ค. (Pintos์์๋ lock์ ๋ํด์๋ง donation์ ๊ตฌํํ๋ค.) donation์ ๋ด๊ฐ ๋ฌถ์ฌ ์๋ lock holder์ priority๊ฐ ๋๋ณด๋ค ๋ฎ๋ค๋ฉด ๋์ priority๋ฅผ ๋น๋ ค์ค์ผ๋ก์จ, ๋นจ๋ฆฌ ์คํ๋์ด lock์ releaseํ๊ฒํ๊ณ , ๋๋ ์ ๋ ์คํ๋ ์ ์๋๋ก ํ๋ค. nested donation์ ๋ด๊ฐ ๋ฌถ์ฌ์๋ lock holder๋ค์ lock holder๋ค๊น์ง ์ฌ๊ท์ ์ผ๋ก ๋์ priority๋ณด๋ค ๋ฎ๋ค๋ฉด ๋์ priority๋ฅผ ๋น๋ ค์ฃผ๋ ๊ฒ์ด๋ค. multiple donation์ ํ thread๋ค์ ์ฌ๋ฌ lock๋ค์ด ๊ฑธ๋ ค์์ ๋ ๋ชจ๋ lock๋ค์ด lock holder ์๊ฒ ํ์ํ๋ค๋ฉด priority๋ฅผ ๋น๋ ค์ฃผ๊ณ donation list์ ์ ์ฅํ๋ค. ์ดํ ์ด๋ ํ lock์ด release ๋์ด๋ donation list์์ ๋จ์ ์๋ lock๋ค ์ค ๋์ priority๋ก ๊ต์ฒดํ๋ค.
priority sheduler๋ฅผ ํตํด thread ๊ฐ์ ์ฐ์ ์์๋ฅผ ๊ณ ๋ คํ์ง๋ง, ๋ฎ์ priority๋ฅผ ๊ฐ์ง thread๋ ์์นซ ์์ํ ์คํ๋ ์ ์๋ starvation ๋ฌธ์ ๋ฅผ ๊ฐ์ง๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด Multi level feedback queue์ธ 4BSD๋ฅผ ๊ตฌํํ์๋ค. thread๋ค์ recent_cpu(cpu ์ฌ์ฉ์๊ฐ), load_avg(๋๊ธฐ์ค์ธ thread ์), nice(์๊ตฌ๋ ์ค์๋)๋ฅผ ๋ชจ๋ ๊ณ ๋ คํด ์ฃผ์ด์ง ์๊ฐ๋ง๋ค priority๋ฅผ ๋ค์ ๊ณ์ฐํ๋๋ก ํ์๋ค. ์ด๋ฅผ ํตํด overhead๋ ๋์ด๋๊ฒ ๋์ง๋ง ๋ชจ๋ thread๋ค์ด balnced, ์ฆ ์ ๋์ ์ด๊ณ ํ์์ ์ํด ์คํ๋ ์ ์์๋ค.
์ถ๊ฐ์ ์ผ๋ก ๋น ๋ฅธ ์ฐ์ฐ์ ์ํด ๊ณ ์ ์์์ ์ฐ์ฐ์ ๊ตฌํํ์๋ค.