์ฃผ์ : MLFQS (Multi-Level Feedback Queue Scheduler)
์ํ์๊ฐ: 14:00 ~ 15:00
MLFQS์์ ์ฌ์ฉํ๋ ์ธ ๊ฐ์ง ์ฃผ์ ๋ณ์(nice, recent_cpu, load_avg)์ ์ญํ ์ ์ค๋ช ํ์์ค. (1์ )
โ ๋ชจ๋ฒ๋ต์:
nice: ์ค๋ ๋๊ฐ CPU๋ฅผ ์๋ณดํ๋ ค๋ ์ฑํฅrecent_cpu: ์ต๊ทผ ์ผ๋ง๋ CPU๋ฅผ ์ฌ์ฉํ๋์ง ์ถ์ load_avg: ์ ์ฒด ์์คํ
์ CPU ๋ถํ (์ค๋น ์ค์ธ ์ค๋ ๋ ์ ๊ธฐ๋ฐ)๋ค์ ์์์ ๋น์นธ์ ์ฑ์ฐ์์ค. (load_avg ๊ฐฑ์ ์)
load_avg = ____ * load_avg + ____ * ready_threads;
โ ๋ชจ๋ฒ๋ต์:
load_avg = (59/60) * load_avg + (1/60) * ready_threads;
recent_cpu ๊ณ์ฐ ์์ ์์ฑํ์์ค.
recent_cpu = ((__) * load_avg) / ((__) * load_avg + 1) * recent_cpu + nice;
โ ๋ชจ๋ฒ๋ต์:
recent_cpu = ((2) * load_avg) / ((2) * load_avg + 1) * recent_cpu + nice;
์ค๋ ๋์ priority๋ฅผ ๊ณ์ฐํ๋ ์์ ์์ฑํ์์ค.
โ
๋ชจ๋ฒ๋ต์:
priority = PRI_MAX - (recent_cpu / 4) - (nice * 2)
MLFQS๊ฐ ํ์ฑํ๋ ๊ฒฝ์ฐ thread_set_priority() ํธ์ถ์ด ๋ฌด์๋๋ ์ด์ ๋?
โ
๋ชจ๋ฒ๋ต์:
์ฐ์ ์์๊ฐ ์๋ ๊ณ์ฐ๋๊ธฐ ๋๋ฌธ์, ์ฌ์ฉ์ ์๋ ์ค์ ์ ๋ฌด์๋๋ค.
MLFQS์์ priority donation์ด ๋์ํ์ง ์๋ ์ด์ ๋ฅผ ์ค๋ช
ํ์์ค.
โ
๋ชจ๋ฒ๋ต์:
priority donation์ ์๋ priority๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋์ํ์ง๋ง, MLFQS์์๋ ์๋ ๊ณ์ฐ๋๋ฏ๋ก donation์ด ์๋ฏธ ์์ด์ง
๋ค์ ์ํฉ์์ load_avg๋ ์ผ๋ง๊ฐ ๋๋๊ฐ?
์ด๊ธฐ๊ฐ = 0, ready_threads = 3
โ
๋ชจ๋ฒ๋ต์:
load_avg = (59/60)*0 + (1/60)*3 = 0.05
recent_cpu๋ ์ธ์ , ๋๊ตฌ์๊ฒ ์ฆ๊ฐํ๋๊ฐ?
โ
๋ชจ๋ฒ๋ต์:
๋งค tick๋ง๋ค running ์ํ์ ์ค๋ ๋์ ๋ํด recent_cpu++ ๋๋ค. idle ์ ์ธ
priority๋ ์ด๋ค ๊ฒฝ์ฐ์ ์ฌ๊ณ์ฐ๋๋๊ฐ? (๋ชจ๋ ๊ณ ๋ฅด์์ค)
MLFQS ์ฌ์ฉ ์ฌ๋ถ์ ๋ฐ๋ผ thread_set_priority() ํจ์์ ๋์ ์ฐจ์ด๋ฅผ ์ค๋ช
ํ์์ค.
โ
๋ชจ๋ฒ๋ต์:
load_avg์ recent_cpu๋ ์ด๋ค ์ฃผ๊ธฐ๋ก ๊ณ์ฐ๋๋๊ฐ? ๊ฐ๊ฐ ์ค๋ช
ํ์์ค.
โ
๋ชจ๋ฒ๋ต์:
nice ๊ฐ์ด ์ฆ๊ฐํ๋ฉด priority๋ ์ด๋ป๊ฒ ๋ณํ๋๊ฐ? ๊ทธ ์ด์ ๋?
โ
๋ชจ๋ฒ๋ต์:
nice ๊ฐ์ด ์ปค์ง๋ฉด priority๋ ๋ฎ์์ง๋ค. โ CPU ์๋ณด ์ฑํฅ์ ๋ฐ์ํ ๊ฐ์ด๋ฏ๋ก
MLFQS์์ recent_cpu, priority๊ฐ ์ค๋ฒํ๋ก ์์ด ๊ณ์ฐ๋๊ธฐ ์ํด ์ด๋ค ๋ฐฉ์์ ์ฌ์ฉํ๋๊ฐ?
โ
๋ชจ๋ฒ๋ต์:
๊ณ ์ ์์์ (Fixed-point) ์ฐ์ฐ ๋ฐฉ์์ ์ฌ์ฉํ์ฌ ์ค์๋ฅผ ์ ์๋ก ๋ณํํด ์ ๋ฐ๋ ํ๋ณด
recent_cpu๊ฐ ๋์ ์ค๋ ๋๋ ์ฐ์ ์์๊ฐ ์ด๋ป๊ฒ ๋๋๊ฐ? ์ด์ ๋?
โ
๋ชจ๋ฒ๋ต์:
๋ฎ์์ง๋ค. recent_cpu๋ CPU๋ฅผ ๋ง์ด ์ด ์ ๋์ด๋ฏ๋ก, fairํ ๋ถ๋ฐฐ๋ฅผ ์ํด priority๋ฅผ ๋ฎ์ถ๋ค.
MLFQS์์ ์ฐ์ ์์๊ฐ ๋์ผํ ์ค๋ ๋๊ฐ ์ฌ๋ฌ ๊ฐ ์๋ ๊ฒฝ์ฐ, ์ด๋ค ์ค๋ ๋๊ฐ ๋จผ์ ์คํ๋๋๊ฐ?
โ
๋ชจ๋ฒ๋ต์:
FIFO ๋ฐฉ์์ผ๋ก, ๋จผ์ ready ์ํ๊ฐ ๋ ์ค๋ ๋๊ฐ ๋จผ์ ์คํ๋๋ค.
๐ง ์ ๋ฆฌํ
| ํญ๋ชฉ | ์ค๋ช |
|---|---|
nice | CPU ์๋ณด ์ฑํฅ, ํด์๋ก priority ๋ฎ์ |
recent_cpu | ์ต๊ทผ CPU ์ฌ์ฉ๋, ๋ง์์๋ก priority ๋ฎ์ |
load_avg | ์ ์ฒด ์์คํ ๋ถํ ์งํ |
priority | ์๋ ๊ณ์ฐ: PRI_MAX - (recent_cpu / 4) - (nice * 2) |
| ์ฌ๊ณ์ฐ ์์ | 1์ด๋ง๋ค, 4ํฑ๋ง๋ค, ์์ฑ ์, nice ๋ณ๊ฒฝ ์ |
| donation | โ ๋นํ์ฑํ๋จ |
| set_priority | โ ๋ฌด์๋จ (MLFQS ์ผ์ ธ ์์ ๊ฒฝ์ฐ) |