Pintos lab1 thread review

์กฐ์„ฑํ˜„ยท2021๋…„ 2์›” 3์ผ

OS

๋ชฉ๋ก ๋ณด๊ธฐ
3/9

๐Ÿ“• Thread

pintos์˜ ์ฒซ๋ฒˆ์งธ ๋žฉ์ด thread๋ฅผ ํ†ตํ•ด, os๊ฐ€ ์–ด๋–ป๊ฒŒ thread๋“ค์„ scheduling ํ•˜๊ณ , synchronization ์‹œํ‚ค๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๊ฐ chapter๋ฅผ ํ†ตํ•ด ์–ด๋–ค ๊ธฐ๋Šฅ๋“ค์ด ์–ด๋–ค ์š”๊ตฌ์— ์ƒ๊ฒจ๋‚˜๊ฒŒ ๋˜์—ˆ๋Š”์ง€๋ฅผ ์ค‘์ ์œผ๋กœ ์ดํ•ดํ•˜๊ณ ์ž ๋…ธ๋ ฅํ•˜์˜€๋‹ค. ๋ชจ๋“  ์ผ€์ด์Šค๋ฅผ ์ƒ๊ฐํ•˜๊ณ  ๊ณ ๋ คํ•˜๋Š” ๊ฒƒ์„ ํ†ตํ•ด OS์— ์žˆ์–ด์„œ generality๊ฐ€ ์–ผ๋งˆ๋‚˜ ์ค‘์š”ํ•œ๊ฐ€๋ฅผ ๋А๋‚„ ์ˆ˜ ์žˆ์—ˆ๋‹ค....

๐Ÿ‘‰ 1. Alarm clock

๊ธฐ์กด์˜ 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์„ ๊ฐฑ์‹ ํ•˜์—ฌ ์ฃผ์—ˆ๋‹ค.

๐Ÿ‘‰ 2. Priority Scheduling

๊ธฐ์กด์˜ 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๋กœ ๊ต์ฒดํ•œ๋‹ค.

๐Ÿ‘‰ 3. Advanced scheduler

priority sheduler๋ฅผ ํ†ตํ•ด thread ๊ฐ„์˜ ์šฐ์„  ์ˆœ์œ„๋ฅผ ๊ณ ๋ คํ–ˆ์ง€๋งŒ, ๋‚ฎ์€ priority๋ฅผ ๊ฐ€์ง„ thread๋Š” ์ž์นซ ์˜์›ํžˆ ์‹คํ–‰๋  ์ˆ˜ ์—†๋Š” starvation ๋ฌธ์ œ๋ฅผ ๊ฐ€์ง„๋‹ค.
์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Multi level feedback queue์ธ 4BSD๋ฅผ ๊ตฌํ˜„ํ•˜์˜€๋‹ค. thread๋“ค์˜ recent_cpu(cpu ์‚ฌ์šฉ์‹œ๊ฐ„), load_avg(๋Œ€๊ธฐ์ค‘์ธ thread ์ˆ˜), nice(์š”๊ตฌ๋œ ์ค‘์š”๋„)๋ฅผ ๋ชจ๋‘ ๊ณ ๋ คํ•ด ์ฃผ์–ด์ง„ ์‹œ๊ฐ„๋งˆ๋‹ค priority๋ฅผ ๋‹ค์‹  ๊ณ„์‚ฐํ•˜๋„๋ก ํ•˜์˜€๋‹ค. ์ด๋ฅผ ํ†ตํ•ด overhead๋Š” ๋Š˜์–ด๋‚˜๊ฒŒ ๋˜์ง€๋งŒ ๋ชจ๋“  thread๋“ค์ด balnced, ์ฆ‰ ์œ ๋™์ ์ด๊ณ  ํ•„์š”์— ์˜ํ•ด ์‹คํ–‰๋  ์ˆ˜ ์žˆ์—ˆ๋‹ค.
์ถ”๊ฐ€์ ์œผ๋กœ ๋น ๋ฅธ ์—ฐ์‚ฐ์„ ์œ„ํ•ด ๊ณ ์ •์†Œ์ˆ˜์  ์—ฐ์‚ฐ์„ ๊ตฌํ˜„ํ•˜์˜€๋‹ค.

profile
Jazzing๐Ÿ‘จโ€๐Ÿ’ป

0๊ฐœ์˜ ๋Œ“๊ธ€