๊ธฐ์ค: ํ๋ก์ธ์ค, ์ค๋ ๋, ๋๊ธฐํ ๊ธฐ๋ฒ ๋ฑ์ ๊ดํ ๊ธฐ๋ณธ ๊ฐ๋
โ ๋ชจ๋ฒ ๋ต์:
โ ๋ชจ๋ฒ ๋ต์:
READY
: CPU๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ์ํ (์: thread_unblock ํธ์ถ)RUNNING
: ํ์ฌ CPU๋ฅผ ์ ์ ํ ์ํBLOCKED
: ์
์ถ๋ ฅ ๋๋ ๋๊ธฐํ ์์์ ๊ธฐ๋ค๋ฆฌ๋ ์ํ (์: lock_acquire ์คํจ ์)READY โ RUNNING (schedule)
/ RUNNING โ BLOCKED (thread_block)
โ ๋ชจ๋ฒ ๋ต์:
๋ฌธ๋งฅ ์ ํ์ ํ์ฌ ์คํ ์ค์ธ ์ค๋ ๋์ ์ํ๋ฅผ ์ ์ฅํ๊ณ , ๋ค๋ฅธ ์ค๋ ๋์ ์ํ๋ฅผ ๋ณต์ํด ์คํ์ ์ ํํ๋ ๊ฒ์ด๋ค.
๋ฐ์ ์กฐ๊ฑด:
yield()
๋ฅผ ํธ์ถํ ๋block()
๋ ๋exit()
ํ์ฌ ์ข
๋ฃ๋ ๋โ ๋ชจ๋ฒ ๋ต์:
Lock
, Semaphore
, Condition Variable
โ ๋ชจ๋ฒ ๋ต์:
Lock
์ ๋จ์ผ ์์ ๋ณดํธ์ฉ ๋ฎคํ
์ค๋ก, ํ๋์ ์ค๋ ๋๋ง ์ ๊ทผ ๊ฐ๋ฅํ๋๋ก ์ ํํจSemaphore
๋ ์ ์ํ ์นด์ดํฐ๋ก ์์์ ๊ฐ์๋ฅผ ๋ํ๋ด๋ฉฐ, sema_down()
/ sema_up()
์ผ๋ก ์ ๊ทผ์ ์ ์ดโ ๋ชจ๋ฒ ๋ต์:
โ ๋ชจ๋ฒ ๋ต์:
sema_down()
์ ํธ์ถํ๋ฉด ์ธ๋งํฌ์ด ๊ฐ์ด ๊ฐ์ํ๋ฉฐ, ๊ฐ์ด 0์ด๋ฉด BLOCKED ์ํ๊ฐ ๋๋คsema_up()
์ ํธ์ถํ๋ฉด ๊ฐ์ด ์ฆ๊ฐํ๊ณ , BLOCKED ์ค๋ ๋๊ฐ ์๋ค๋ฉด ํ๋๋ฅผ READY ์ํ๋ก ๊นจ์ด๋คโ ๋ชจ๋ฒ ๋ต์:
cond_wait()
์ ํธ์ถํ๋ฉด, ๋ฝ์ ๋๊ณ BLOCKED ์ํ๊ฐ ๋๋ฉฐcond_signal()
๋๋ cond_broadcast()
๊ฐ ํธ์ถ๋๋ฉด ๊นจ์ด๋์ ๋ฝ์ ๋ค์ ํ๋ํ๋คproducer-consumer
๋ฌธ์ ํด๊ฒฐ์ ์ฌ์ฉ๋จthread_yield()
ํจ์๋ ์ด๋ค ์ญํ ์ ํ๋ฉฐ ์ธ์ ํธ์ถ๋๋๊ฐ?โ ๋ชจ๋ฒ ๋ต์:
thread_yield()
๋ ํ์ฌ ์ค๋ ๋๊ฐ ์๋ฐ์ ์ผ๋ก CPU๋ฅผ ์๋ณดํ๊ณ READY ์ํ๋ก ์ ํ๋๋๋ก ํ๋คโ ๋ชจ๋ฒ ๋ต์:
๋ด์ผ 13์์ ์ฝ์ด์ผ์ง