๊ณต์ ๋ ์์์ ์ฌ๋ฌ ํ๋ก์ธ์ค๊ฐ ๋์์ ์ ๊ทผํ๋ฉด์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค. ์ด๋ ๊ณต์ ๋ ์์์ ๋ฐ์ดํฐ๋ ํ ๋ฒ์ ํ๋์ ํ๋ก์ธ์ค๋ง ์ ๊ทผํ ์ ์๋๋ก ์ ํ์ ๋ฌ์ผ ํ๋ค.
์ด๋ฅผ ์ํด ๋์จ ๊ฒ์ด ๋ฐ๋ก '์ธ๋งํฌ์ด'
์ธ๋งํฌ์ด : ๋ฉํฐํ๋ก๊ทธ๋๋ฐ ํ๊ฒฝ์์ ๊ณต์ ์์์ ๋ํ ์ ๊ทผ์ ์ ํํ๋ ๋ฐฉ๋ฒ
์ฌ๋ฌ ํ๋ก์ธ์ค๊ฐ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ๋ฉฐ ์ํ๋ ๋, ๊ฐ ํ๋ก์ธ์ค์์ ๊ณต์ ๋ฐ์ดํฐ๋ฅผ ์ ๊ทผํ๋ ํ๋ก๊ทธ๋จ ์ฝ๋ ๋ถ๋ถ
๊ณต์ ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ ํ๋ก์ธ์ค๊ฐ ๋์์ ์ ๊ทผํ ๋ ์๋ชป๋ ๊ฒฐ๊ณผ๋ฅผ ๋ง๋ค ์ ์๊ธฐ ๋๋ฌธ์, ํ ํ๋ก์ธ์ค๊ฐ ์๊ณ ๊ตฌ์ญ์ ์ํํ ๋๋ ๋ค๋ฅธ ํ๋ก์ธ์ค๊ฐ ์ ๊ทผํ์ง ๋ชปํ๋๋ก ํด์ผ ํ๋ค.
P : ์๊ณ ๊ตฌ์ญ ๋ค์ด๊ฐ๊ธฐ ์ ์ ์ํ ( ํ๋ก์ธ์ค ์ง์ ์ฌ๋ถ๋ฅผ ์์์ ๊ฐ์(S)๋ฅผ ํตํด ๊ฒฐ์ )
V : ์๊ณ ๊ตฌ์ญ์์ ๋์ฌ ๋ ์ํ ( ์์ ๋ฐ๋ฉ ์๋ฆผ, ๋๊ธฐ ์ค์ธ ํ๋ก์ธ์ค๋ฅผ ๊นจ์ฐ๋ ์ ํธ )
P(S);
// --- ์๊ณ ๊ตฌ์ญ ---
V(S);
procedure P(S) --> ์ต์ด S๊ฐ์ 1์
while S=0 do wait --> S๊ฐ 0๋ฉด 1์ด ๋ ๋๊น์ง ๊ธฐ๋ค๋ ค์ผ ํจ
S := S-1 --> S๋ฅผ 0๋ก ๋ง๋ค์ด ๋ค๋ฅธ ํ๋ก์ธ์ค๊ฐ ๋ค์ด ์ค์ง ๋ชปํ๋๋ก ํจ
end P
--- ์๊ณ ๊ตฌ์ญ ---
procedure V(S) --> ํ์ฌ์ํ๋ S๊ฐ 0์
S := S+1 --> S๋ฅผ 1๋ก ์์์น์์ผ ํด์ ํ๋ ๊ณผ์
end V
์ด๋ฅผ ํตํด, ํ ํ๋ก์ธ์ค๊ฐ P ํน์ V๋ฅผ ์ํํ๊ณ ์๋ ๋์ ํ๋ก์ธ์ค๊ฐ ์ธํฐ๋ฝํธ ๋นํ์ง ์๊ฒ ๋๋ค. P์ V๋ฅผ ์ฌ์ฉํ์ฌ ์๊ณ ๊ตฌ์ญ์ ๋ํ ์ํธ๋ฐฐ์ ๊ตฌํ์ด ๊ฐ๋ฅํ๊ฒ ๋์๋ค.
์์
์ต์ด S ๊ฐ์ 1์ด๊ณ , ํ์ฌ ํด๋น ๊ตฌ์ญ์ ์ํํ ํ๋ก์ธ์ค A, B๊ฐ ์๋ค๊ณ ๊ฐ์ ํ์
- ๋จผ์ ๋์ฐฉํ A๊ฐ P(S)๋ฅผ ์คํํ์ฌ S๋ฅผ 0์ผ๋ก ๋ง๋ค๊ณ ์๊ณ๊ตฌ์ญ์ ๋ค์ด๊ฐ
- ๊ทธ ๋ค์ ๋์ฐฉํ B๊ฐ P(S)๋ฅผ ์คํํ์ง๋ง S๊ฐ 0์ด๋ฏ๋ก ๋๊ธฐ ์ํ
- A๊ฐ ์๊ณ๊ตฌ์ญ ์ํ์ ๋ง์น๊ณ V(S)๋ฅผ ์คํํ๋ฉด S๋ ๋ค์ 1์ด ๋จ
- B๋ ์ด์ P(S)์์ while๋ฌธ์ ๋น ์ ธ๋์ฌ ์ ์๊ณ , ์๊ณ๊ตฌ์ญ์ผ๋ก ๋ค์ด๊ฐ ์ํํจ
๋ฎคํ ์ค : ์๊ณ ๊ตฌ์ญ์ ๊ฐ์ง ์ค๋ ๋๋ค์ ์คํ์๊ฐ์ด ์๋ก ๊ฒน์น์ง ์๊ณ ๊ฐ๊ฐ ๋จ๋ ์ผ๋ก ์คํ๋๊ฒ ํ๋ ๊ธฐ์
์ํธ ๋ฐฐ์ (Mutual Exclusion)์ ์ฝ์์
ํด๋น ์ ๊ทผ์ ์กฐ์จํ๊ธฐ ์ํด lock๊ณผ unlock์ ์ฌ์ฉํ๋ค.
- lock : ํ์ฌ ์๊ณ ๊ตฌ์ญ์ ๋ค์ด๊ฐ ๊ถํ์ ์ป์ด์ด ( ๋ง์ฝ ๋ค๋ฅธ ํ๋ก์ธ์ค/์ค๋ ๋๊ฐ ์๊ณ ๊ตฌ์ญ ์ํ ์ค์ด๋ฉด ์ข ๋ฃํ ๋๊น์ง ๋๊ธฐ )
- unlock : ํ์ฌ ์๊ณ ๊ตฌ์ญ์ ๋ชจ๋ ์ฌ์ฉํ์์ ์๋ฆผ. ( ๋๊ธฐ ์ค์ธ ๋ค๋ฅธ ํ๋ก์ธ์ค/์ค๋ ๋๊ฐ ์๊ณ ๊ตฌ์ญ์ ์ง์ ํ ์ ์์ )
๋ฎคํ ์ค๋ ์ํ๊ฐ 0, 1๋ก ์ด์ง ์ธ๋งํฌ์ด๋ก ๋ถ๋ฅด๊ธฐ๋ ํจ
-
flag์ turn ๋ณ์๋ฅผ ํตํด ์๊ณ ๊ตฌ์ญ์ ๋ค์ด๊ฐ ํ๋ก์ธ์ค/์ค๋ ๋๋ฅผ ๊ฒฐ์ ํ๋ ๋ฐฉ์
- flag : ํ๋ก์ธ์ค ์ค ๋๊ฐ ์๊ณ์์ญ์ ์ง์ ํ ๊ฒ์ธ์ง ๋ํ๋ด๋ ๋ณ์
- turn : ๋๊ฐ ์๊ณ๊ตฌ์ญ์ ๋ค์ด๊ฐ ์ฐจ๋ก์ธ์ง ๋ํ๋ด๋ ๋ณ์
while(true) { flag[i] = true; // ํ๋ก์ธ์ค i๊ฐ ์๊ณ ๊ตฌ์ญ ์ง์ ์๋ while(flag[j]) { // ํ๋ก์ธ์ค j๊ฐ ํ์ฌ ์๊ณ ๊ตฌ์ญ์ ์๋์ง ํ์ธ if(turn == j) { // j๊ฐ ์๊ณ ๊ตฌ์ญ ์ฌ์ฉ ์ค์ด๋ฉด flag[i] = false; // ํ๋ก์ธ์ค i ์ง์ ์ทจ์ while(turn == j); // turn์ด j์์ ๋ณ๊ฒฝ๋ ๋๊น์ง ๋๊ธฐ flag[i] = true; // j turn์ด ๋๋๋ฉด ๋ค์ ์ง์ ์๋ } } } // ------- ์๊ณ ๊ตฌ์ญ --------- turn = j; // ์๊ณ ๊ตฌ์ญ ์ฌ์ฉ ๋๋๋ฉด turn์ ๋๊น flag[i] = false; // flag ๊ฐ์ false๋ก ๋ฐ๊ฟ ์๊ณ ๊ตฌ์ญ ์ฌ์ฉ ์๋ฃ๋ฅผ ์๋ฆผ
-
๋ฐ์ปค์ ์ ์ฌํ์ง๋ง, ์๋๋ฐฉ ํ๋ก์ธ์ค/์ค๋ ๋์๊ฒ ์ง์ ๊ธฐํ๋ฅผ ์๋ณดํ๋ ๊ฒ์ ์ฐจ์ด๊ฐ ์์
while(true) { flag[i] = true; // ํ๋ก์ธ์ค i๊ฐ ์๊ณ ๊ตฌ์ญ ์ง์ ์๋ turn = j; // ๋ค๋ฅธ ํ๋ก์ธ์ค์๊ฒ ์ง์ ๊ธฐํ ์๋ณด while(flag[j] && turn == j) { // ๋ค๋ฅธ ํ๋ก์ธ์ค๊ฐ ์ง์ ์๋ํ๋ฉด ๋๊ธฐ } } // ------- ์๊ณ ๊ตฌ์ญ --------- flag[i] = false; // flag ๊ฐ์ false๋ก ๋ฐ๊ฟ ์๊ณ ๊ตฌ์ญ ์ฌ์ฉ ์๋ฃ๋ฅผ ์๋ฆผ
-
์ฌ๋ฌ ํ๋ก์ธ์ค/์ค๋ ๋์ ๋ํ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ ์๊ณ ๋ฆฌ์ฆ. ๊ฐ์ฅ ์์ ์์ ๋ฒํธํ๋ฅผ ๊ฐ์ง๊ณ ์๋ ํ๋ก์ธ์ค๊ฐ ์๊ณ ๊ตฌ์ญ์ ์ง์ ํ๋ค.
while(true) { isReady[i] = true; // ๋ฒํธํ ๋ฐ์ ์ค๋น number[i] = max(number[0~n-1]) + 1; // ํ์ฌ ์คํ ์ค์ธ ํ๋ก์ธ์ค ์ค์ ๊ฐ์ฅ ํฐ ๋ฒํธ ๋ฐฐ์ isReady[i] = false; // ๋ฒํธํ ์๋ น ์๋ฃ for(j = 0; j < n; j++) { // ๋ชจ๋ ํ๋ก์ธ์ค ๋ฒํธํ ๋น๊ต while(isReady[j]); // ๋น๊ต ํ๋ก์ธ์ค๊ฐ ๋ฒํธํ ๋ฐ์ ๋๊น์ง ๋๊ธฐ while(number[j] && number[j] < number[i] && j < i); // ํ๋ก์ธ์ค j๊ฐ ๋ฒํธํ ๊ฐ์ง๊ณ ์์ด์ผ ํจ // ํ๋ก์ธ์ค j์ ๋ฒํธํ < ํ๋ก์ธ์ค i์ ๋ฒํธํ } // ------- ์๊ณ ๊ตฌ์ญ --------- number[i] = 0; // ์๊ณ ๊ตฌ์ญ ์ฌ์ฉ ์ข ๋ฃ }