Process Synchronization = Concurrency Control
-> ํ๋ก์ธ์ค๊ฐ ๋์์ ์คํ๋๋ฉด์ ๋ฐ์ํ๋ ๋ฌธ์ ์ ์ ์๋ฏธํจ.
-> ๋์ ์คํ๋ ๋ ์ ์ดํ์ฌ ๋ฌธ์ ์ ์ด ๋ฐ์ํ์ง ์๋๋ก ํ๋ ๊ฒ์ ์๋ฏธํจ.
synchronization์ ํด๊ฒฐํ ์ ์๋ ๋ฐฉ์์ผ๋ก ํ๋ก๊ทธ๋๋จธ ๊ด์ ์์ ์ด๋ป๊ฒํ๋ฉด Concurrency Control์ ์ํ ์ ์๋๊ฐ
-> ๊ทธ๋ฐ๊ฑธ ์ ๊ณตํ๊ธฐ ์ํ ์๋จ์ผ๋ก semaphore์ ๋ฐฐ์ ๋ค.
Semaphore์ P์ฐ์ฐ๊ณผ V์ฐ์ฐ์ผ๋ก ๊ตฌ์ฑ๋๋ ์ถ์์๋ฃํ์ด๋ค.
-> P์ฐ์ฐ : ์๋ฃ๋ฅผ ํ๋ํ๋ ์ฐ์ฐ
-> V์ฐ์ฐ : ์์์ ๋ฐ๋ฉํ๋ ์ฐ์ฐ
s = 1์ด๋ผ๊ณ ํ์ ๋ ๋ง์ P์ฐ์ฐ์ ํ๋๋ผ๋ ํ๋๋ง critical section์ ๋ค์ด๊ฐ ์ ์์ผ๋ฉฐ ๋๋จธ์ง๋ ๋ชจ๋ ๊ธฐ๋ค๋ ค์ผ ํ๋ ๋ฐฉ๋ฒ์ผ๋ก ์งํ๋๋ค.
Process synchronization์ ํด๊ฒฐํ๊ธฐ ์ํด Monitor๋ผ๋ ๊ฒ์ ์ง์ํ๊ณ ์๋ค.
-> semaphore๊ฐ P,V์ฐ์ฐ์ ํตํด ํ๋ก์ธ์ค ๋๊ธฐํ๋ฅผ ์ํํ์ง๋ง ๋๊ธฐํ ํ๋ ๋ฒ์ ํ๋ก๊ทธ๋๋จธ์๊ฒ ์๋ ค์ฃผ๊ณ ํ๋ก๊ทธ๋๋จธ๋ ๊ทธ๊ฒ์ ํตํด ํ๋ก๊ทธ๋๋ฐ์ ํ๋ค.
-> ํ๋ก๊ทธ๋๋จธ๊ฐ ์ค์๋ฅผ ํ๊ฒ ๋๋ฉด ๋๊ธฐํ๊ฐ ๊นจ์ด์ ธ์ ์น๋ช
์ ์ธ ๊ฒฐ๊ณผ๊ฐ ์ด๋๋ ์ ์๋ค.
๋ฐ๋ฉด์ Monitor๋ผ๋ ๊ฒ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ฐจ์์์ ๋์์ ๊ทผ๊ณผ ๊ด๋ จ๋ ๊ณต์ ๋ฐ์ดํฐ๋ฅผ ์ ๊ทผํ๋ ๋ฌธ์ ๋ฅผ Monitor๊ฐ ์๋์ ์ผ๋ก ํด๊ฒฐํด์ค์ผ๋ก์จ ํ๋ก๊ทธ๋๋จธ์ ๋ถ๋ด์ ์ค์ฌ์ฃผ๋ ๋ฐฉ๋ฒ์ด๋ค.
๊ณต์ ๋ฐ์ดํฐ๋ฅผ ์ ๊ทผ ํ ๋๋ ์ ๊ทผํ๋ ์ฝ๋๊ฐ ์กด์ฌํ ๊ฒ์ด๊ณ ๊ทธ ์ฝ๋๋ฅผ Monitor์์๋ค๊ฐ ๊ณต์ ๋ฐ์ดํฐ์ ์ ๊ทผ ์ฝ๋๋ฅผ ์ ์ํด์ ๋ง์ฝ์ ํ๋ก์ธ์ค๊ฐ ๊ณต์ ๋ฐ์ดํฐ๋ฅผ ์ ๊ทผํ๋ ค๊ณ ํ๋ฉด ์ด Monitor์์ ์ ์๋ ๊ทธ๋ฌํ ์ฝ๋๋ฅผ ์ด์ฉํด์๋ง ์ ๊ทผ ํ ์ ์๊ฒ ๋ง๋ค์ด ๋๊ณ ๊ณต์ ๋ฐ์ดํฐ๋ค์ ์ฝ๋๋ค์ด ๋์์ ์ ๊ทผํ๊ฒ ๋๋ฉด ์ฆ, ํ๋ก์ธ์ค A๊ฐ ๊ณต์ ๋ฐ์ดํฐ๋ฅผ ์ ๊ทผํ๋ค๊ฐ CPU๋ฅผ ์๊ณ ํ๋ก์ธ์ค B๊ฐ ๊ณต์ ๋ฐ์ดํฐ๋ฅผ ์ ๊ทผํ๋ฉด ๋ฌธ์ ๊ฐ ๋๋ ๊ฒ์ธ๋ฐ Monitor๊ฐ ์ด๋ฅผ ์์ฒ์ ์ผ๋ก ๋ง๊ณ ์๋ค.
Monitor๋ผ๋ ๊ฒ์ Activeํ ํ๋ก์ธ์ค ํ๋๋ง์ด Monitor์์ ์๋ ์ฝ๋๋ง์ ์คํํ ์ ์๊ฒ Monitor์์ ๋ค์ด์์ Activeํ ํ๋ก์ธ์ค๋ ํ๋ ๋ฐ์ ์๋๋ก Monitor์์ฒด๊ฐ ์ ์ด๋ฅผ ํด์ฃผ๋ ๋ฐฉ์์ด๋ค.
ํ๋ก๊ทธ๋๋จธ๋ ๊ณต์ ๋ฐ์ดํฐ๋ฅผ Aํ๋ก์ธ์ค๊ฐ ์ ๊ทผํ๋ ์ฝ๋๋ฅผ ๋ง๋ค์ด ๋๊ณ B๋ผ๋ ํ๋ก์ธ์ค๊ฐ ๊ณต์ ๋ฐ์ดํฐ์ ์ ๊ทผํ๋ ์ฝ๋๋ฅผ ๋ง๋ค์ด ๋๋๋ผ๋ ๊ตณ์ด ๋ค์ด๊ฐ๊ธฐ ์ ์ lock์ ๊ฑธ๊ณ ๋น ์ ธ๋์ฌ ๋ lock์ ํ๊ณ ํ ํ์๊ฐ ์๋ค.
-> Monitor๊ฐ ์์์ ์ ์ด๋ฅผ ํด์ฃผ๊ธฐ ๋๋ฌธ์ด๋ค.
์๋ฅผ ๋ค์ด, ํ๋ก์ธ์ค๊ฐ monitor์์ ์์ ๊ณต์ ๋ฐ์ดํฐ๋ฅผ ์ ๊ทผํ๋ ์ฝ๋๋ฅผ ์คํํ๊ณ ์๋ค๊ณ ํ๋ฉด ์ ๊ทผํ๋ ๋์ค์ CPU๋ฅผ ๋นผ์๊ฒจ์ ๋๋ค๋ฅธ ํ๋ก์ธ์ค๊ฐ Monitor๋ฅผ ์ ๊ทผํ๋ ์ฝ๋์ ๋ค์ด์ค๋ ค๊ณ ํ๋ค๊ทธ๋ฌ๋ฉด CPU๋ฅผ ๋นผ์๊ธด ํ๋ก์ธ์ค๊ฐ ์ด monitor ์ ๊ทผ ์ฝ๋, ์ฆ ์ฝ๋๋ฅผ ์คํํ๋ ๋์ค์ CPU๋ฅผ ๋นผ์๊ฒผ๊ธฐ ๋๋ฌธ์ ์ฌ์ ํ ๊ทธ ํ๋ก์ธ์ค๋ Activeํ ์ํ๋ก Monitor์์ ๋จ์์๋ค.
-> ๋ค๋ฅธ ํ๋ก์ธ์ค๊ฐ monitor์์ ์๋ ์ฝ๋๋ฅผ ์คํํ์ง ๋ชปํ๊ณ monitor ๋ฐ์ queue์ ์ค์์ ๊ธฐ๋ค๋ฆฌ๊ฒ ๋๋ ๊ฒ์ด๋ค.
์ค์์๋ ํ๋ก์ธ์ค๋ ์ธ์ Monitor๋ด๋ถ์ ๋ค์ด์์ ๊ณต์ ๋ฐ์ดํฐ ์ ๊ทผ ์ฝ๋๋ฅผ ์คํํ ์ ์๋๋ ํ๋ฉด ์์ Activeํ ํ๋ก์ธ์ค ์๊ฐ 0์ด ๋ ๋
-> ์ง๊ธ monitor๋ฅผ ์ฐ๊ณ ์๋ ๊ทธ ํ๋ก์ธ์ค๊ฐ CPU๋ฅผ ์ป์ด์ ๋ค ์ฐ๊ณ ๋๊ฐ๋์ง ๋๋ ์ด ํ๋ก์ธ์ค๊ฐ ์ด ๋ด๋ถ์์ ๋ฌด์ธ๊ฐ ์ถฉ์กฑ์ด ๋์ง ์์์ ์ ๋ค ์ ์๋ค.
-> ์ฆ, ์์ ๋ค์ด์๋ ํ๋ก์ธ์ค๊ฐ Activeํ์ง ์์ ์ํ(๋น ์ ธ๋๊ฐ๋์ง, ์ ๋ค๋์ง)๊ฐ ๋๋ฉด ๋ฐ์์ ๊ธฐ๋ค๋ฆฌ๋ ํ๋ก์ธ์ค๊ฐ ๋ค์ด์์ ์ฝ๋๋ฅผ ์คํํ ์ ์๊ฒ ๋๋ค.
-> ์์น์ ์ผ๋ก monitor์์ lock์ ๊ฑธ๊ณ ํ ํ์๊ฐ ์๋ค.
-> ํ๋ก๊ทธ๋๋จธ ์
์ฅ์์๋ ํจ์ฌ ์์ํ ๊ฒ์ด๋ค.
Monitor์์๋ condition variable์ด๋ผ๋ ๊ฒ์ ๋ ์ ์๋๋ฐ monitor ์์์ ์ด๋ค ์ฝ๋๋ฅผ ์คํํ๋ค๊ฐ ์ง๊ธ ๋ฌด์ธ๊ฐ ์ถฉ์กฑ์ด ๋์ง ์์์ ์ค๋ ๊ธฐ๋ค๋ ค์ผ ํ๋ค๋ฉด ๊ทธ ํ๋ก์ธ์ค๋ฅผ ์ ๋ค๊ฒ ํด์ผํ๋ค.
-> ์ด๋ค ์กฐ๊ฑด์ด ์ถฉ์กฑ์ด ์๋์ ์ ๋ค๊ฒ ํ๋์ง์ ๋ฐ๋ผ์ ์กฐ๊ฑด์ ํด๋นํ๋ ๊ฒ์ ๋ณ์๋ก ๋ ์ ์๋ค.
-> ์ด๊ฒ์ 'condition varialbe'์ด๋ผ๊ณ ํ๋ค.
-> condition variable์ semaphore์ฒ๋ผ ์ด๋ค ๊ฐ์ ๊ฐ์ง๋ ๋ณ์๊ฐ ์๋๋ผ ์ด๋ค ํ๋ก์ธ์ค๋ฅผ ์ ๋ค๊ฒ ํ๊ณ ์ค์ธ์ฐ๊ธฐ ์ํ ๋ณ์์ด๋ค.
-> ๊ฐ์๋ฅผ ์นด์ดํธํ๊ฑฐ๋ ๊ฐ์ ๊ฐ์ง๋ ์๋ฏธ๋ฅผ ๊ฐ์ง๊ณ ์์ง ์๋ค.
condition variable์ ๋ํด์๋ ์ฐ์ฐ์ด ๋๊ฐ์ง ์ ํด์ง๋๋ฐ ํ๋๋ wait(), ๋ค๋ฅธ ํ๋๋ signal()์ด๋ค.
-> condition variable์ ์ด๋ค ์กฐ๊ฑด์ ๋ง์กฑ์ํค์ง ์์์ ์ค๋ ๊ธฐ๋ค๋ ค์ผ ํ ๋ ๊ทธ ํ๋ก์ธ๋ฅผ ์ ๋ค๊ฒ ํ๋ ์ฉ๋๋ก ์ฌ์ฉํ๋ค.
-> ์ด๋ค ํ๋ก์ธ์ค๋ฅผ ์ ๋ค๊ฒ ํด์ผ๊ฒ ๋ค. : x.wait()์ ํธ์ถํ๋ฉด ๋๋ค.
-> ์ด ํ๋ก์ธ์ค๋ x๋ผ๋ condition variable์ ๊ฐ์ ์ค์ ์ค๊ฒ ๋๋ค.
-> x.signal ์ฐ์ฐ : ๋๊ตฐ๊ฐ x๋ฅผ ๋ค์ฐ๊ณ ๋น ์ ธ๋์์ ํน์ ์ ๋ค์ด ์๋ ํ๋ก์ธ์ค๊ฐ ์์ผ๋ฉด ๊ทธ์ค์ ํ๋๋ฅผ ๊นจ์์ค๋ผ!
full : ๋ฐ์ดํฐ๊ฐ ๋ค์ด์๋ ๋ฒํผ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ํ๋ก์ธ์ค๋ฅผ ์ค์ธ์ ๋๋ ๋ณ์
empty : ๋น ๋ฒํผ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ํ๋ก์ธ์ค๋ฅผ ์ค์ธ์ ๋๋ ๋ณ์
empty.wait()์ ํ๋ฉด empty ๋ณ์์ ์ค์๊ฒ ๋๋ฉด์ Activeํ ํ๋ก์ธ์ค๊ฐ ์์ด์ง๊ฒ ๋๊ณ ๋ฐ์์ ๊ธฐ๋ค๋ฆฌ๋ ํ๋ก์ธ์ค๊ฐ ๋ค์ด ์ฌ ์ ์๊ฒ๋๋ค.
Monitor.ver
monitor๋ก ๊ตฌํํ์๊ธฐ ๋๋ฌธ์ ์ ๊ฐ๋ฝ์ ์ง๋ ๋ช ๋ น์ monitor๋ด๋ถ์ ์กด์ฌํ๋ค.
[์ถ์ฒ] ๋ฐํจ๊ฒฝ ๊ต์๋ ๊ฐ์