[OS-๋ฐํจ๊ฒฝ] Process Synchronization(Concurrency control)
Race Condition, Critical Section, Atomic Instruction, Semaphore, Monitor..๐ค

์ปดํจํฐ์์ ๋ฐ์ดํฐ์ ์ ๊ทผ(์ฐ์ฐ)์ ์คํ ์ฃผ์ฒด(E-box)์ ๋ฐ์ดํฐ ์ ์ฅ ๊ณต๊ฐ(S-box)์ ์ํธ์์ฉ์ผ๋ก ์ด๋ฃจ์ด์ง๋๋ค.
ํ๋์ ํ๋ก์ธ์ค๊ฐ ๋ฐ์ดํฐ์ ์ ๊ทผํ ๋๋ ์๋ฌด๋ฐ ๋ฌธ์ ๊ฐ ์์ง๋ง, ์ฌ๋ฌ ์คํ ์ฃผ์ฒด๊ฐ ํ๋์ ๊ณต์ ์์(S-box)์ ๋์์ ์ ๊ทผํ ๋ Race Condition์ด๋ ๋ฐ์ดํฐ ๋ถ์ผ์น๊ฐ ๋ํ๋ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ ์ด์์ฒด์ ๋ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ๋ง๊ณ ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ์ ์ ์งํ๊ธฐ ์ํด ํ๋ก์ธ์ค ๊ฐ์ ์คํ ์์๋ฅผ ์กฐ์จํ๋ ๋ฉ์ปค๋์ฆ์ด ํ์์ ์ ๋๋ค. ์ด๋ฒ ํฌ์คํ ์์๋ ์ด์ ๊ฐ์ ํ๋ก์ธ์ค ๋๊ธฐํ ๋ฌธ์ ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
Race Condition
Race Condition์ ์ฌ๋ฌ ์คํ ์ฃผ์ฒด๊ฐ ๊ฐ์ ๊ณต์ ์์์ ๋์์ ๋ค๋ฃฐ ๋, ์์ ๋ฐ ํ์ด๋ฐ์ ๋ฐ๋ผ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง๋ ๋ฌธ์ ์ ๋๋ค. ์ด์์ฒด์ ์์ Race Condition์ ๋ค์๊ณผ ๊ฐ์ ์ํฉ์์ ๋ฐ์ํ ์ ์์ต๋๋ค.
- Kerenl ์ํ ์ค ์ธํฐ๋ฝํธ ๋ฐ์ ์
- Process๊ฐ System Call์ ํ์ฌ Kernel mode๋ก ์ํ ์ค์ธ๋ฐ Context Switch๊ฐ ์ผ์ด๋ ๊ฒฝ์ฐ
- Multiprocessor์์ Shared Memory ๋ด์ Kernel Data์ ์ ๊ทผํ ๋
๋จผ์ ์ปค๋ ์ํ ์ค ์ธํฐ๋ฝํธ๊ฐ ๋ฐ์ํ๋ค๋ฉด Race Condition์ด ๋ฐ์ํ ์ ์์ต๋๋ค.

๊ณ ๊ธ ์ธ์ด์์ count++์ ๊ฐ์ ์ฆ๊ฐ ์ฐ์ฐ์ ํ ์ค์ ์ฝ๋์ง๋ง, ์ค์ ๊ธฐ๊ณ์ด์์๋ load, inc, store ๋ช
๋ น์ด๋ก ๋๋์ด ๋
๋ฆฝ์ ์ผ๋ก ์คํ๋ฉ๋๋ค.
๋ฌธ์ ๋ ์ด 3๋จ๊ณ ๊ณผ์ ์ด atomic1ํ์ง ์๊ธฐ ๋๋ฌธ์, ๋ช
๋ น์ด๊ฐ ์คํ๋๋ ๋์ค ๋ค๋ฅธ ๋ช
๋ น์ด๋ก ์ธํฐ๋ฝํธ๊ฐ ๋ฐ์ํ๋ฉด ๊ฒฐ๊ณผ๊ฐ ์ ์ฉ์ด ์๋ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด ์ปค๋์ด count++๋ฅผ ์ํํ๊ธฐ ์ํด load โ inc โ store ์์๋ก ๋ช
๋ น์ด๋ฅผ ์คํํ๋ค๊ณ ํด๋ณด๊ฒ ์ต๋๋ค.
๊ทธ๋ฐ๋ฐ load๋ก count ๊ฐ์ ๋ ์ง์คํฐ์ ์ฌ๋ฆฐ ์งํ ์ธํฐ๋ฝํธ๊ฐ ๋ฐ์ํ๊ณ , ์ธํฐ๋ฝํธ ํธ๋ค๋ฌ๊ฐ count--๋ฅผ ์ํํ ๋ค ๋ณต๊ทํ๋ฉด, ํด๋น ๊ฐ์ ์ฐ์ฐ์ด count ๋ณ์์ ๋ฐ์์ด ์๋ฉ๋๋ค.
์ปค๋์ ์ธํฐ๋ฝํธ ๋์ count ๊ฐ์ด ๋ณ๊ฒฝ๋๋ค๋ ์ฌ์ค์ ์ ์ ์์ด์, ๋ ์ง์คํฐ์ ๋จ์ ์๋ ๊ฐ์ inc๋ฅผ ์ ์ฉํ ๋ค ๊ทธ๋๋ก storeํ๊ธฐ ๋๋ฌธ์
๋๋ค.
์ด์ฒ๋ผ ์ปค๋ ์ํ ์ค ์ธํฐ๋ฝํธ๊ฐ ๋ฐ์ํ๋ฉด Race Condition์ด ๋ฐ์ํ ์ ์๊ธฐ ๋๋ฌธ์, ๊ณต์ ๋ฐ์ดํฐ๋ฅผ ๊ฐฑ์ ํ๋ ๊ตฌ๊ฐ์์๋ ์ธํฐ๋ฝํธ๋ฅผ ์ ์ disableํ์ฌ ํด๋น ์ฝ๋๊ฐ ๋๊ธฐ์ง ์๋๋ก ๋ณด์ฅํ๋ฉด ๋ฉ๋๋ค.
ํ๋ก์ธ์ค๊ฐ ์์คํ ์ฝ์ ํ์ฌ ์ปค๋ ๋ชจ๋๋ก ์ํ ์ค์ธ๋ฐ ๋ฌธ๋งฅ ๊ตํ์ด ์ผ์ด๋ ๊ฒฝ์ฐ์๋ Race Condition์ด ๋ฐ์ํ ์ ์์ต๋๋ค.

์ ์ฌ์ง์ด ์ง๊ด์ ์ด๊ณ ์ด์ Race Condition์ด ๋ํ๋๋ ๊ฒฝ์ฐ์ ๊ฑฐ์ ๋น์ทํ ๋ด์ฉ์ด๋ผ์ ์ถ๊ฐ์ ์ธ ์ค๋ช ์ ์๋ตํ๊ฒ ์ต๋๋ค. ์ปค๋ ๋ชจ๋์์ CPU๋ฅผ preemptํ์ง ์๊ณ , ์ ์ ๋ชจ๋๋ก ๋์ ์์ ๋ preemptํ๋ฉด ๋ฉ๋๋ค.
๋ง์ง๋ง์ผ๋ก ๋ฉํฐ ํ๋ก์ธ์์์ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ๋ด ์ปค๋ ๋ฐ์ดํฐ์ ์ ๊ทผํ๋ค๋ฉด Race Condition์ด ๋ฐ์ํ ์ ์์ต๋๋ค.

๋จ์ผ CPU์์๋ ์ปค๋์ด ๊ณต์ ๋ฐ์ดํฐ๋ฅผ ๊ฐฑ์ ํ๋ ๋์ ์ธํฐ๋ฝํธ๋ฅผ ์ ์ disableํ๋ฉด Race Condition์ ๋ฐฉ์งํ ์ ์์ต๋๋ค. ํ์ง๋ง ๋ฉํฐํ๋ก์ธ์๋ ํ CPU์์ ์ธํฐ๋ฝํธ๋ฅผ disableํด๋ ๋ค๋ฅธ CPU๋ ๊ณ์ ์ปค๋ ๋ฐ์ดํฐ์ ์ ๊ทผํ ์ ์๊ธฐ ๋๋ฌธ์ Race Condition์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
์ด๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ์ปค๋ ๋ฐ์ดํฐ์ ํ ๋ฒ์ ํ๋์ CPU๋ง ์ ๊ทผํ ์ ์๋๋ก ์ ํํ๋ ๊ฒ์
๋๋ค.
๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ๊ณต์ ์ปค๋ ๋ฐ์ดํฐ์ ์ ๊ทผํ ๋๋ง๋ค lock์ ๊ฑธ๊ณ ์์
์ด ๋๋๋ฉด unlock์ ํด, ๋์์ ์ ๊ทผํ์ง ๋ชปํ๋๋ก ๋ง๋ ๊ฒ์
๋๋ค.
๊ฒฐ๊ตญ Race Condition์ ๋ง์ผ๋ ค๋ฉด, ๊ณต์ ์์์ ์ ๊ทผ/๊ฐฑ์ ํ๋ ์ฝ๋ ๊ตฌ๊ฐ์ โ๋์์ ์คํ๋์ง ์๊ฒโ ๋ง๋ค์ด์ผ ํฉ๋๋ค. ์ด์์ฒด์ ์์๋ ์ด ๊ตฌ๊ฐ์ Critical Section2์ด๋ผ๊ณ ํฉ๋๋ค.
The Critical Section Problem
Critical Section ๋ฌธ์ ๋ ์ฌ๋ฌ ์คํ ์ฃผ์ฒด๊ฐ ๊ณต์ ์์์ ๋์์ ์ ๊ทผํ์ง ์๋๋ก, ํ ๋ฒ์ ํ๋๋ง ์ง์
ํ๊ฒ ๋ณด์ฅํ๋ ๋๊ธฐํ ๋ฌธ์ ์
๋๋ค.
Critical Section ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด Mutual Exclusion, Progress, Bounded Waiting์ ๋ชจ๋ ๋ง์กฑํด์ผ ํฉ๋๋ค.
Mutual Exclusion: ํ ์์ ์ Critical Section์๋ ํ๋์ ์คํ ์ฃผ์ฒด๋ง ๋ค์ด๊ฐ ์ ์์ด์ผ ํจProgress: Critical Section์ ๋ค์ด๊ฐ ํ๋ก์ธ์ค๋ฅผ ๊ณ ๋ฅด๋ ๊ฒฐ์ ์ด ๋ฌดํํ ๋ฏธ๋ค์ง๋ฉด ์๋จBounded Waiting: ์ด๋ค ํ๋ก์ธ์ค๊ฐ Critical Section์ ๋ค์ด๊ฐ๊ณ ์ถ์ด์ ์์ฒญ์ ํ์ผ๋ฉด, ๊ทธ ์ดํ๋ก๋ ์ธ์ ๊ฐ ๋ฐ๋์ ๋ค์ด๊ฐ ์ ์์ด์ผ ํจ
Initial Attempts to Solve Problem
Critical Section ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๊ณ ์๋ํ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
do { entry section critical section exit section remainder section} while (1);critical section๊ณผ ์๋ ์์ญ์ผ๋ก ๊ตฌ๋ถํ๊ณ , ๋๊ธฐํ๋ฅผ ์ํด ๋๊ธฐํ ๋ณ์๋ฅผ ์ค์ ํฉ๋๋ค.
Critical Section์ ์ ๊ทผํ๊ธฐ ์ ๋๊ธฐํ ๋ณ์๋ฅผ ํ์ธํ์ฌ Critical Section์ ์ง์
์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๊ณ , Critical Section์ ์ง์
ํ ์ดํ์ ๋๊ธฐํ ๋ณ์๋ฅผ ํด์ ํ๋ ๋ฐฉ์์ผ๋ก ๋๊ธฐํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๊ณ ํ์ต๋๋ค.
์ข ๋ ๊ตฌ์ฒด์ ์ธ ์ค๋ช
์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Algorithm 1
int turn;initially turn = 0;๋๊ธฐํ ๋ณ์(turn)๋ ์์ ์ ์ฐจ๋ก๋ผ๋ ๊ฒ์ ์๋ ค์ฃผ๋ ๋ณ์์
๋๋ค.
do { while (turn != 0); /* My turn? */ critical section turn = 1; /* Now it's your turn */ remainder section} while (1);์ด์ฒ๋ผ ์์ ์ ์ฐจ๋ก๊ฐ ๋๋ฉด critical section์ ์ ๊ทผํ๊ณ , ์ ๊ทผ ์ดํ์๋ ๋๊ธฐํ ๋ณ์๋ฅผ ํด์ ํ์ฌ ๋๊ธฐํ๋ฅผ ์งํํฉ๋๋ค.
์ด ๋ฐฉ์์ ์๋ก ๋ฐ๋์ ๊ต๋๋ก ๋ค์ด๊ฐ์ผ๋ง ํ๊ธฐ ๋๋ฌธ์ Critical Section์ ์์ฃผ ์ ๊ทผํด์ผํ๋ ํ๋ก์ธ์ค๊ฐ ์๋ค๋ฉด ๋นํจ์จ์ ์
๋๋ค.
Algorithm 2
boolean flag[2];initially flag[๋ชจ๋] = false; /* no one is in CS */ํ๋ก์ธ์ค๋ง๋ค ๋๊ธฐํ ๋ณ์(flag)๋ฅผ ์ค์ ํ์ฌ critical section์ ๋ค์ด๊ฐ๊ณ ์ถ๋ค๋ฉด true๋ก ๊ฐ์ ๋ณ๊ฒฝํ์ต๋๋ค.
do { flag[i] = true; /* Pretend I am in */ while (flag[j]); /* Is he also in? then wait */ critical section flag[i] = false; /* I am out now */ remainder section} while (1);์ด ๋ฐฉ๋ฒ์ Mutual Exclusion์ ๋ง์กฑํ์ง๋ง, ํ๋ก์ธ์ค๋ค์ด ๋ชจ๋ flag๋ฅผ ์ค์ ํ๋ค๋ฉด Progress์ Bounded Waiting์ ๋ง์กฑํ์ง ๋ชปํฉ๋๋ค.
๊ทธ๋์ ํ๋ก์ธ์ค๋ค์ด while (flag[j]);์์ ๋์์์ด ์๋ณดํ๋ ์ํฉ์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
Algorithm 3(Petersonโs Algorithm)
do { flag[i] = true; turn = j; /* Set to his turn */ while (flag[j] && turn == j); /* wait only if.. */ critical section flag[i] = false; remainder section} while (1);์ด๋ Algorithm 1๊ณผ Algorithm 2๋ฅผ ๊ฒฐํฉํ ๋ฐฉ๋ฒ์
๋๋ค.
๋ง์ฝ ์๋ก ๋ค๋ฅธ ํ๋ก์ธ์ค๋ค์ด critical section์ ์ ๊ทผํ๊ณ ์ถ์ ๋, ์ฐ์ ๊ถ(turn = j)์ด ์๋ค๋ฉด ์ฐ์ ๊ถ์ด ์๋ ํ๋ก์ธ์ค๊ฐ ๋จผ์ ์ง์
ํฉ๋๋ค.
๊ทธ ์ดํ, ์ฐ์ ๊ถ์ด ์๋ ํ๋ก์ธ์ค๊ฐ critical section์์ ๋์๋ค๋ฉด critical section์ ์ ๊ทผํ๋ ์๊ณ ๋ฆฌ์ฆ ์
๋๋ค.
Mutual Exclusion, Progress, Bounded Waiting์ ๋ชจ๋ ๋ง์กฑํ ์๊ณ ๋ฆฌ์ฆ์ด์ง๋ง, while (flag[j] && turn == j);์กฐ๊ฑด์ด ํ๋ฆด ๋๊น์ง while์์ ๊ณ์ ์กฐ๊ฑด์ ํ์ธํ๋ฏ๋ก CPU๋ฅผ ๊ณ์ ์๋ชจํฉ๋๋ค.
์ด๋ฅผ Busy Waiting์ด๋ผ ํ๋ฉฐ Spin lock์ด๋ผ๊ณ ๋ ํฉ๋๋ค.
Synchronization Hardware
์ง๊ธ๊น์ง๋ ์ํํธ์จ์ด์ ์ผ๋ก Critical Section ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด์์ต๋๋ค. ํ๋์จ์ด์ ์ผ๋ก Critical Section ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ์ํคํ ์ฒ์์ atomic ๋ช ๋ น์ด๋ฅผ ์ ๊ณตํ๋ฉด ํด๊ฒฐํ ์ ์์ต๋๋ค.
Semaphore
์ธ๋งํฌ์ด๋ ์์ ๋์จ ์๊ณ ๋ฆฌ์ฆ๊ณผ atomic ๋ช
๋ น์ด๋ฅผ ์ถ์ํ ํ ๊ฐ๋
์
๋๋ค.
์ฆ, ์ธ๋งํฌ์ด๋ ์ฌ๋ฌ ํ๋ก์ธ์ค๊ฐ ๊ณต์ ์์์ ๋์์ ์ ๊ทผํ๋ ๊ฒ์ ์ ์ดํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ํ๋ก์ธ์ค ๋๊ธฐํ ๋ฉ์ปค๋์ฆ์ผ๋ก P์ V์ฐ์ฐ์ด ์์ต๋๋ค.
while (S โค 0) do no-op;S--;P์ฐ์ฐ์ ์์์ ํ๋ํ๋ ์ฐ์ฐ์ผ๋ก lock์ ์๊ฐํ๋ฉด ๋ฉ๋๋ค.
S++;V์ฐ์ฐ์ ์์์ ๋ฐ๋ฉํ๋ ์ฐ์ฐ์ผ๋ก unlock์ ์๊ฐํ๋ฉด ๋ฉ๋๋ค.
do { P(mutex); critical section V(mutex); remainder section} while (1);์ด๋ ๊ธฐ๋ณธ์ ์ธ ์ธ๋งํฌ์ด๋ฅผ ํ์ฉํ ์ฝ๋์
๋๋ค.
ํผํฐ์จ ์๊ณ ๋ฆฌ์ฆ์ while (...)๋ก ์กฐ๊ฑด์ ๊ณ์ ํ์ธํด์ผ ํ๋ฏ๋ก Critical Section์ ๋ค์ด๊ฐ์ง ๋ชปํ ํ๋ก์ธ์ค๊ฐ CPU๋ฅผ ์ ์ ํ ์ฑ๋ก ๋๊ธฐํ๋ Busy Waiting์ด ๋ฐ์ํ์ต๋๋ค.
ํ์ง๋ง ์ธ๋งํฌ์ด๋ ์์์ด ์์ ๋ ํ๋ก์ธ์ค๋ฅผ Blockํ๊ณ , ์์์ด ๋ฐํ๋๋ฉด ํ๋ก์ธ์ค๋ฅผ Wakeupํ๋ Block/Wakeup ๋ฐฉ์์ ๊ตฌํํ ์ ์์ต๋๋ค.
Block/Wakeup Implementation
typedef { int value; /* semaphore */ struct process *L; /* process wait queue */} semaphore- ์ธ๋งํฌ์ด ์ ์
S.value--; /* prepare to enter */if (S.value < 0) /* Oops, negative, I cannot enter */{ add this process to S.L; block();}- P์ฐ์ฐ ์ ์
S.value++;if (S.value <= 0) { remove a process P from S.L; wakeup(P);}- V์ฐ์ฐ ์ ์
์ด๋ ๊ฒ ์ธ๋งํฌ์ด๋ฅผ Block/Wakeup ๋ฐฉ์์ผ๋ก ๊ตฌํํ ์ ์์ต๋๋ค. Block/Wakeup ๋ฐฉ์์ CPU ๋ญ๋น๋ฅผ ์ค์ผ ์ ์์ง๋ง, ๋์ Block/Wakeup ๊ณผ์ ์์ ์ค๋ฒํค๋๊ฐ ๋ฐ์ํฉ๋๋ค.
๋ฐ๋ผ์ Busy Waiting ๋ฐฉ์๊ณผ Block/Wakeup ๋ฐฉ์์ ์ํฉ์ ๋ฐ๋ผ ์ ์ ํ ์ ํ์ด ๋ฌ๋ผ์ง๋ฉฐ, ์ด๋ค ๊ฒฝ์ฐ์ ์ด๋ค ๋ฐฉ์์ด ๋ ์ ๋ฆฌํ์ง ๋น๊ตํด๋ณผ ํ์๊ฐ ์์ต๋๋ค.
Critical Section์ ๊ธธ์ด๊ฐ ๊ธด ๊ฒฝ์ฐ Block/Wakeup ๋ฐฉ์์ด ์ ๋ฆฌํฉ๋๋ค. Critical Section์ ๊ธธ์ด๊ฐ ์งง์ผ๋ฉด Block/Wakeup ์ค๋ฒํค๋๊ฐ Busy waiting ์ค๋ฒํค๋ ๋ณด๋ค ๋ณดํต ๋ ํฌ๊ธฐ ๋๋ฌธ์ ๋๋ค.
Deadlock, Starvation
์ธ๋งํฌ์ด๋ Critical Section ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง๋ง, Deadlock๊ณผ Starvation ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
Deadlock์ ๋ ์ด์์ ํ๋ก์ธ์ค๊ฐ ์๋ก๊ฐ ๊ฐ์ง ์์์ ๊ธฐ๋ค๋ฆฌ๋ฉฐ, ๋ชจ๋๊ฐ ์์ํ ์งํํ์ง ๋ชปํ๋ ์ํ์
๋๋ค.
์๋ฅผ ๋ค์ด ํ๋ก์ธ์ค A๊ฐ S1์ ํ๋ํ ๋ค S2๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ณ , ๋์์ ํ๋ก์ธ์ค B๊ฐ S2๋ฅผ ํ๋ํ ๋ค S1์ ๊ธฐ๋ค๋ฆฌ๋ฉด ๋ ํ๋ก์ธ์ค ๋ชจ๋ block๋ ์ฑ๋ก ๋ฉ์ถ๊ฒ ๋ฉ๋๋ค.
Starvation์ ํน์ ํ๋ก์ธ์ค๊ฐ ๊ณ์ ์ฐ์ ์์์์ ๋ฐ๋ฆฌ๊ฑฐ๋ ์์์ ์ป์ง ๋ชปํด, ๋ฌดํํ ๋๊ธฐํ๋ ์ํ์
๋๋ค.
Race Condition์์ ๋งค๋ฒ ๋ค๋ฅธ ํ๋ก์ธ์ค๊ฐ ๋จผ์ P(mutex)์ ์ฑ๊ณตํด ์๊ณ ๊ตฌ์ญ์ ๋ค์ด๊ฐ๋ฉด, ์ด๋ค ํ๋ก์ธ์ค๋ ๊ณ์ ๊ธฐ๋ค๋ฆฌ๊ธฐ๋ง ํ๊ณ ์คํ ๊ธฐํ๋ฅผ ์ป์ง ๋ชปํ ์ ์์ต๋๋ค.
๋ ์์ธํ ๋ด์ฉ์ ๋ค์ ํฌ์คํ ์์ ๋ค๋ฃจ๊ธฐ ๋๋ฌธ์ ์งง๊ฒ ์ค๋ช ํ๊ณ ๋์ด๊ฐ๊ฒ ์ต๋๋ค.
๋๊ธฐํ์ ๊ด๋ จ๋ ์ ํต์ ์ธ ๋ฌธ์ 3๊ฐ์ง
๋๊ธฐํ์ ๊ด๋ จ๋ ์ ํต์ ์ธ ๋ฌธ์ ๊ฐ 3๊ฐ ์์ต๋๋ค.
- Bounded-Buffer Problem(Producer-Consumer Problem)
- Readers and Writers Problem
- Dining-Philosophers Problem
ํด๋น ๋ฌธ์ ๋ค์ ์์ ๋ถํฐ ๋ง์ ์ฌ๋๋ค์ด ๋ค๋ค์๊ณ ์ข์ ์๋ฃ๋ค์ด ๋ง๊ธฐ ๋๋ฌธ์ ๋ณธ ํฌ์คํ ๊ธ์์๋ ์๊ฐ๋ง ํ๊ณ ์ค๋ช ์ ๋์ด๊ฐ๊ฒ ์ต๋๋ค. ๊ฐ ๋ฌธ์ ์ํฉ์ ๋ํ ์๋ฃ๋ฅผ ๋งํฌ๋ฅผ ํจ๊ป ๊ฑธ์ด๋์๊ธฐ ๋๋ฌธ์ ์ฐธ๊ณ ํ์๋ฉด ๋ฉ๋๋ค.
Monitor
์ธ๋งํฌ์ด๋ ๊ฐ๋ ฅํ ๋๊ธฐํ ๋๊ตฌ์ด์ง๋ง, P์ V๋ฅผ ํธ์ถํ๋ ์์๊ฐ ์กฐ๊ธ๋ง ๊ผฌ์ฌ๋ Deadlock์ด๋ Starvation ๊ฐ์ ๋ฌธ์ ๊ฐ ์ฝ๊ฒ ๋ฐ์ํ ์ ์์ต๋๋ค.
๋ํ ๊ณต์ ์์์ ๋ณดํธํ๊ธฐ ์ํ ์ฝ๋๊ฐ ์ฌ๊ธฐ์ ๊ธฐ ํฉ์ด์ง๊ธฐ ๋๋ฌธ์, ํ๋ก๊ทธ๋จ์ด ์ปค์ง์๋ก ๋๊ธฐํ ๋ก์ง์ ์ฌ๋ฐ๋ฅด๊ฒ ์ ์งํ๊ธฐ๊ฐ ์ด๋ ต์ต๋๋ค.
์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ฑ์ฅํ ๊ฐ๋
์ด Monitor์
๋๋ค.
Monitor๋ ๊ณต์ ์์๊ณผ ๊ทธ ์์์ ์ ๊ทผํ๋ ์ฐ์ฐ๋ค์ ํ๋์ ๋ชจ๋๋ก ๋ฌถ๊ณ , Critical Section ์ง์
์ ์ธ์ด/๋ฐํ์ ์์ค์์ ๊ด๋ฆฌํด ๋๊ธฐํ๋ฅผ ๋ ์์ ํ๊ฒ ์ ๊ณตํฉ๋๋ค.
์ฆ, ํ๋ก๊ทธ๋๋จธ๊ฐ lock/unlock์ ์ง์ ๋ง์ถฐ์ฃผ๊ธฐ๋ณด๋ค, Monitor ๋ด๋ถ์์ ์๋์ผ๋ก Mutual Exclusion์ ๋ณด์ฅํ๊ณ ํ์ํ ๊ฒฝ์ฐ์๋ง ์กฐ๊ฑด์ ๋ฐ๋ผ Block/Wakeup์ ์ํํฉ๋๋ค.
Conclusion
์ด๋ฒ ํฌ์คํ ์์๋ ํ๋ก์ธ์ค ๋๊ธฐํ ๋ฌธ์ ์ ๋ํด ๋ค๋ค ๋ดค์ต๋๋ค. Race Condition, Critical Section, Atomic Instruction, Semaphore, Monitor ๋ฑ ๋ง์ด ๋ฏ์ค๊ณ ์ด๋ ค์ด ๊ฐ๋ ๋ค์ด ๋์์ง๋ง ์ ๋๋ก ์ดํดํ๊ณ ๋์ด๊ฐ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค. ๋ค์ ํฌ์คํ ์์๋ Deadlock์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
References
[1] KCOW ์ด์์ฒด์ ๋ฐํจ๊ฒฝ ๊ฐ์
[2] Operating System Concepts(Silberschatz, Galvin and Gagne)
[3] Classical Problems of Synchronization with Semaphore Solution