๋๊ธฐํ
๊ฒฝ์ ์ํ
๊ณต์ ๋ฉ๋ชจ๋ฆฌ์ ๋ฉ์์ง ์ ๋ฌ์ ํตํด ํ๋ก์ธ์ค ๊ฐ ๋ฐ์ดํฐ ํต์ ์ ํ ์ ์๋ค. ์ด ๊ณผ์ ์์ ๋์ผํ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์๋ก ๋ค๋ฅธ ๋ ํ๋ก์ธ์ค๊ฐ ์ ๊ทผํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ ์ฐ๊ฒ ๋๋ค๋ฉด, ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ์ด ๊นจ์ง๋ ํ์์ด ๋ฐ์ํ๋ค. ์๋์ ์์๋ฅผ ํตํด ์ด๋ฅผ ์ดํดํ ์ ์๋ค.
// ์์ฐ์
while (true) {
/* produce an item in next_produced */
while (count == BUFFER_SIZE)
; /* do noting */
buffer[in] = next_produced;
in = (in + 1) % BUFFER_SIZE;
count++;
}
// ์๋น์
while (true) {
while (count == 0)
; /* do nothing */
next_consumed = buffer[out];
out = (out + 1) % BUFFER_SIZE;
count--;
/* consume the item in next_consumed */
}
count ๊ฐ์ ์ฆ๊ฐ์ํค๊ณ ๊ฐ์์ํค๋ ์์ฐ์/์๋น์ ์ฝ๋์ด๋ค. ์์ฐ์๋ count๊ฐ ๋ฒํผ ์ฌ์ด์ฆ๋ณด๋ค ์์์ง๊ธฐ ์ ๊น์ง ์๋ฌด๋ฐ ํ๋์ ํ์ง ์๊ณ , ์๋น์๋ count๊ฐ 0์ด ์๋๋ ๊น์ง ์๋ฌด๋ฐ ํ๋์ ํ์ง ์๋๋ค. ์ฌ๊ธฐ์ count๋ ์ ์ญ ๋ณ์๋ผ๊ณ ๊ฐ์ ์ ํ์.
ํ์ฌ count์ ๊ฐ์ด 10์ผ ๋, ์์ฐ์์ ์๋น์ ์ฝ๋๋ฅผ ๋ณ๋ ฌ๋ก ์คํ์ ํ๋ค๋ฉด ์ด๋ค ๊ฒฐ๊ณผ๊ฐ ๋์ฌ๊น? 10์ด ๊ทธ๋๋ก ์ ์ง๋ ๊ฒ์ผ๋ก ์๊ฐํ์ง๋ง, ์ค์ ๋ก๋ 10์ด ๋์ฌ ์๋ ์๊ณ ์๋ ์๋ ์๋ค. ์ด์ ๋ ์ฆ๊ฐ ์ฐ์ฐ์์ ์๋ค.
์ฆ๊ฐ ์ฐ์ฐ์(++, โ)๊ฐ ๊ธฐ๊ณ์ด๋ก ์ปดํ์ผ๋์ ๋, ๋ค์๊ณผ ๊ฐ์ ๋ด๋ถ ๋์์ ๊ฐ์ง๊ฒ ๋๋ค.
register_1 = count
register_1 = register_1 + 1
count = register_1
์ฆ๊ฐ ์ฐ์ฐ์๊ฐ 3๊ฐ์ ๋ช ๋ น์ด๋ก ๋๋ ์ ์คํ๋๊ณ ์๋ค. ์ด๋, ๊ฐ ๋ช ๋ น์ด๋ฅผ ์ํํ๋ ์ค๊ฐ์ค๊ฐ ์ธํฐ๋ฝํธ๊ฐ ๋ฐ์ํ์ฌ ์ปจํ ์คํธ ์ค์์นญ์ด ๋ฐ์ํ๊ฒ ๋๋ค๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค. register_1์์๋ 10์ ๊ฐ์ ์ฝ๊ณ 1์ ์ฆ๊ฐ์์ผฐ๋๋ฐ ์ธํฐ๋ฝํธ๊ฐ ๋ฐ์ํ์ฌ ์๋น์ ์ฝ๋๊ฐ ์คํ์ด ๋๋ค๊ณ ํ์. ๊ทธ๋ผ ์๋น์ ์ฝ๋๋ก ์ธํด count์๋ 9๋ผ๋ ๊ฐ์ด ์ ์ฅ๋๊ณ , ์ธํฐ๋ฝํธ๊ฐ ๋ฐ์ํ์ฌ ์ปจํ ์คํธ ์ค์์นญ์ด ๋ฐ์ํ๋ฉด ์์ฐ์ ์ฝ๋์์๋ ์ฌ์ ํ 11์ด๋ผ๋ ๊ฐ์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ count์ ๊ฐ์ด 11์ด ๋๋ฒ๋ฆฌ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.

์ด์ฒ๋ผ ๋์์ ์ฌ๋ฌ ๊ฐ์ ํ๋ก์ธ์ค๊ฐ ๋์ผํ ์๋ฃ๋ฅผ ์ ๊ทผํ๊ณ ์กฐ์ํ๊ณ , ๊ทธ ์คํ ๊ฒฐ๊ณผ๊ฐ ๋ฐ์ํ ํน์ ์์์ ์์กดํ๋ ์ํฉ์ ๊ฒฝ์ ์ํฉ์ด๋ผ๊ณ ํ๋ค.
์๊ณ ์์ญ ๋ฌธ์
๊ฐ ํ๋ก์ธ์ค๋ ์๊ณ ์์ญ์ด๋ผ๋ ์ฝ๋ ์์ญ์ ํฌํจํ๊ณ ์๋ค. ์ด ์์ญ์ ๋ค๋ฅธ ํ๋ก์ธ์ค๋ค์ด ์ ๊ทผํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฐ์ดํธ ํ ์ ์๋ค. ์๊ณ ์์ญ์ ์ค์ํ ํน์ง์ ์๊ณ ์์ญ ๋ด๋ถ์์ ํ๋์ ํ๋ก์ธ์ค๊ฐ ์คํ๋๊ณ ์๋ค๋ฉด, ๋ค๋ฅธ ํ๋ก์ธ์ค๋ค์ ์๊ณ ์์ญ์ ์ ๊ทผํ ์ ์๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์, ์๊ณ ์์ญ ๋ฌธ์ ๋ ์๋ก ๋ค๋ฅธ ํ๋ก์ธ์ค๋ค์ด ๋์์ ์๊ณ ์์ญ์ ์ ๊ทผํ๋ ๊ฒ์ ๋ง๋ ๊ฒ์ด๋ค. ์๊ณ ์์ญ์ ์ ๊ทผํ๊ธฐ ์ํด์๋ ์ ๊ทผ ๊ถํ์ ๋ฐ์์ผํ๋๋ฐ, ์ด๋ ์ ๊ทผ ๊ถํ์ ์์ฒญํ๋ ์ฝ๋ ๋ถ๋ถ์ ์ง์ ๊ตฌ์ญ์ด๋ผ๊ณ ํ๋ค. ์๊ณ ์์ญ์์ ์์ ์ด ๋๋๊ณ ๋์ค๋ ๋ถ๋ถ์ ํด์ถ ๊ตฌ์ญ, ๊ทธ ์ด์ธ์ ๋๋จธ์ง ์ฝ๋๋ฅผ ๋๋ฌด์ง ๊ตฌ์ญ์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.

์๊ณ ์์ญ ๋ฌธ์ ์ ๋ํ ํด๊ฒฐ์ฑ ์ ์๋ ์ธ ๊ฐ์ง ์๊ตฌ ์กฐ๊ฑด์ ๋ง์กฑํด์ผ ํ๋ค.
- ์ํธ ๋ฐฐ์ : ํ๋ก์ธ์ค๊ฐ ์๊ธฐ์ ์๊ณ ๊ตฌ์ญ์์ ์คํ๋๋ค๋ฉด, ๋ค๋ฅธ ํ๋ก์ธ์ค๋ ๊ทธ๋ค ์์ ์ ์๊ณ๊ตฌ์ญ์์ ์คํ๋ ์ ์๋ค.
- ์งํ : ์๊ณ ์์ญ์ ์ ๊ทผํ๊ณ ์ ํ๋ ํ๋ก์ธ์ค๊ฐ ์๊ฑฐ๋, ์๊ณ ์์ญ์์ ์คํ์ ๋ง์น ํ๋ก์ธ์ค๊ฐ ๋ค๋ฅธ ํ๋ก์ธ์ค์ ์ง์ ์ ๋ฌดํํ ์ง์ฐ์ํค์ง ์์์ผ ํ๋ค.
- ํ์ ๋ ๋๊ธฐ : ์ด๋ค ํ๋ก์ธ์ค๋ ๋ค๋ฅธ ์ค๋ ๋์ ์ํด ๋ฌดํํ ๋๊ธฐ ์ํ๋ก ๋จ๊ฒจ์ ธ์๋ ์๋๋ค.
๊ฒฝ์ ์ํ ์น์ ์์ ๋ฐ์ํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์, ํ๋์ ๋ช ๋ น์ด๊ฐ ์คํ๋ ๋์ ์ธํฐ๋ฝํธ๋ฅผ ๋ง๋ ๋ฐฉ๋ฒ์ด ์กด์ฌํ๋ค. ํ์ง๋ง, ์ด ๊ฒฝ์ฐ๋ ๋จ์ผ ์ฝ์ด์์๋ ๊ตฌํ์ด ๊ฐ๋ฅํ ์ง๋ผ๋ ๋ฉํฐ ์ฝ์ด ํ๊ฒฝ์์๋ ์ฑ๋ฅ์ด ์ ํ๋๋ ๋ฑ ์ถ๊ฐ์ ์ธ ๋ฌธ์ ๋ฅผ ๋ฐ์์ํจ๋ค.
๋๊ธฐํ
ํ๋์จ์ด ํด๊ฒฐ ๋ฐฉ๋ฒ
๋ฉ๋ชจ๋ฆฌ ์ฅ๋ฒฝ
์ปดํจํฐ ์ํคํ ์ฒ๊ฐ ์์ฉ ํ๋ก๊ทธ๋จ์๊ฒ ์ ๊ณตํ๋ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ์ ๋ณด์ฅ๋๋ ์ฌํญ์ ๊ฒฐ์ ํ ๋ฐฉ์์ ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ธ์ด๋ผ๊ณ ํ๋ค. ์ผ๋ฐ์ ์ผ๋ก ๋ ๊ฐ์ง ๋ฒ์ฃผ ์ค ํ๋์ ์ํ๋ค.
- ๊ฐํ ์์ : ํ ํ๋ก์ธ์์ ๋ฉ๋ชจ๋ฆฌ ๋ณ๊ฒฝ ๊ฒฐ๊ณผ๊ฐ ๋ค๋ฅธ ๋ชจ๋ ํ๋ก์ธ์์ ์ฆ์ ๋ณด์
- ์ฝํ ์์ : ํ ํ๋ก์ธ์์ ๋ฉ๋ชจ๋ฆฌ ๋ณ๊ฒฝ ๊ฒฐ๊ณผ๊ฐ ๋ค๋ฅธ ํ๋ก์ธ์์๊ฒ ์ฆ์ ๋ณด์ด์ง ์์
๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ธ์ ํ๋ก์ธ์ ์ ํ์ ๋ฐ๋ผ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ์ปค๋ ๊ฐ๋ฐ์๊ฐ ๋ฉ๋ชจ๋ฆฌ ๋ณ๊ฒฝ์ ๊ฐ์์ฑ์ ๋ํ ๊ฐ์ ์ด ๋ถ๊ฐ๋ฅํ๋ค. ์ด๋ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ฉ๋ชจ๋ฆฌ ์ฅ๋ฒฝ์ ์ฌ์ฉํ๋ค. ๋ฉ๋ชจ๋ฆฌ ์ฅ๋ฒฝ์ ๋ค๋ฅธ ํ๋ก์ธ์์์ ์คํ ์ค์ธ ์ค๋ ๋์ ๋ฉ๋ชจ๋ฆฌ ๋ณ๊ฒฝ ์ฌํญ์ด ๋ณด์ด๋ ๊ฒ์ ๋ณด์ฅํ๋ ๋ช ๋ น์ด์ด๋ค.
๋ฉ๋ชจ๋ฆฌ ์ฅ๋ฒฝ์ ๋งค์ฐ ๋ฎ์ ์์ค์ ์ฐ์ฐ์ผ๋ก ๊ฐ์ฃผํ๋ฉฐ ์ผ๋ฐ์ ์ผ๋ก ์ํธ ๋ฐฐ์ ๋ฅผ ๋ณด์ฅํ๋ ํน์ ์ฝ๋๋ฅผ ์์ฑํ ๋ ์ปค๋ ๊ฐ๋ฐ์๋ง ์ฌ์ฉํ๋ค.
ํ๋์จ์ด ๋ช ๋ น์ด
๊ฒฝ์ ์ํ ์น์ ์์ ๋ค๋ฃฌ ์ฆ๊ฐ ์ฐ์ฐ์ ๋ด๋ถ ๋์์ผ๋ก ์ธํด ๋ฐ์ํ๋ ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ์ ํด๊ฒฐํ ์ ์๋ ๋ฐฉ๋ฒ์ด๋ค. ํ๋์ ๋ช ๋ น์ด๊ฐ ์์์ ์ผ๋ก ์คํ๋๊ณ ์ธํฐ๋ฝํธ๊ฐ ๋ฐ์ํ์ง ์์, ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ์ ๋ณด์ฅํ ์ ์๋ค. test_and_set()๊ณผ compare_and_swap() ๋ช ๋ น์ด๋ฅผ ํตํด ์ด๋ฅผ ๋ณด์ฅํ๋ค.
boolean test_and_set(boolean *target) {
boolean rv = *target;
*target = true;
return rv;
}
int compare_and_swap(int *value, int expected, int new_value) {
int temp = *value;
if (*value == expected)
*value = new_value;
return temp;
}
์์์ ๋ณ์
์์์ ๋ค๋ฃฌ compare_and_swap() ๋ช ๋ น์ด๋ ์ํธ ๋ฐฐ์ ๋ฅผ ์ ๊ณตํ๊ธฐ ์ํด ์ง์ ์ฌ์ฉ๋์ง ์๊ณ , ์๊ณ ๊ตฌ์ญ ๋ฌธ์ ํด๊ฒฐํ๋ ๋ค๋ฅธ ๋๊ตฌ ๊ตฌ์ถ์ ์ํ ๊ธฐ๋ณธ ๊ตฌ์ฑ์์๋ก ์ฌ์ฉ๋๋ค. ๊ทธ๋ฌํ ๋๊ตฌ ์ค ํ๋๊ฐ ์์์ ๋ณ์์ด๋ค. ์ ์ ๋ฐ boolean๊ณผ ๊ฐ์ ๊ธฐ๋ณธ ๋ฐ์ดํฐ ์ ํ์ ๋ํ ์์์ ์ฐ์ฐ์ ์ ๊ณตํ๋ฉฐ, ๋จ์ผ ๋ณ์์ ๋ํ ๋ฐ์ดํฐ ๊ฒฝ์์ ๋ํด ์ํธ ๋ฐฐ์ ๋ฅผ ๋ณด์ฅํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์๋ค.
์ํํธ์จ์ด ํด๊ฒฐ ๋ฐฉ๋ฒ
๋ฎคํ ์ค ๋ฝ
๋ฎคํ ์ค ๋ฝ์ ์๊ณ๊ตฌ์ญ์ ๋ค์ด๊ฐ๊ธฐ ์ ํ๋ํด์ผํ๋ ๋ฝ์ด๋ค. ์๊ณ๊ตฌ์ญ์ ๋ค์ด๊ฐ๊ธฐ ์ , acquire() ํธ์ถ์ ํตํด ๋ฎคํ ์ค ๋ฝ์ ํ๋ํ๊ณ ๋์ฌ ๋ release() ํธ์ถ์ ํตํด ๋ฝ์ ๋ฐํํ๋ค. acquire()๋ฅผ ํธ์ถํ๋ ๋ถ๋ถ์ acquire lock ์์ญ, ์๊ณ ๊ตฌ์ญ์ ๋์ค๋ฉด์ release()๋ฅผ ํธ์ถํ๋ ๋ถ๋ถ์ release lock ์์ญ ๊ทธ๋ฆฌ๊ณ ๋๋จธ์ง ์์ญ์ remainder section์ด๋ผ๊ณ ํ๋ค.
acquire() {
while (!available)
; /* busy wait */
available = false;
}
release() {
available = true;
}
์ ๋ ํจ์๋ ์์์ ์ผ๋ก ์ํ๋์ด์ผ ํ๊ณ compare_and_swap()๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํ๋ ์ ์๋ค. acquire() ํจ์๋ฅผ ํตํด ๋ฝ์ ํ๋ํ๊ณ ์ ๋ฐ์ ๋๊ธฐ๋ฅผ ํ๋ค. ๋ฐ๋ณต๋ฌธ์ ํตํด ์ง์์ ์ผ๋ก ๋๊ธฐ๋ฅผ ํ๋ฉฐ, ๋ค๋ฅธ ํ๋ก์ธ์ค๋ค์ CPU ์ ์ ๋ฅผ ๋ฐฉํดํ๊ณ CPU ์ฌ์ฉ๋ฅ ์ ํ๋ก ์ด์ด์ง๊ธฐ ๋๋ฌธ์ ๋จ์ ์ผ๋ก ์์ฉํ๋ค.
๋ฐ์ ๋๊ธฐ๊ฐ ๊ผญ ๋จ์ ์ผ๋ก ์์ฉํ์ง๋ ์๋๋ค. ๋ง์ฝ, ๋ฐ์ ๋๊ธฐ๋ฅผ ํ๋ ๊ณผ์ ์์ ๋ฝ์ ํ๋ํ๋ค๋ฉด ๋ณ๋์ ์ปจํ ์คํธ ์ค์์นญ ์์ด CPU๋ฅผ ๋ฐ๋ก ์ ์ ํ ์ ์๋ค. ๋ฐ์ ๋๊ธฐ๋ฅผ ํ์ง ์๋๋ค๋ฉด ๋๊ธฐ ํ๋ก ์ฎ๊ธฐ๋ ๊ณผ์ ์ ์ปจํ ์คํธ ์ค์์นญ, ๋๊ธฐ ํ์์ ๋ ๋ ํ๋ก ์ฎ๊ธฐ๋ ๊ณผ์ ์์ ์ปจํ ์ค ์ค์์นญ ์ด 2๋ฒ์ ์ปจํ ์คํธ ์ค์์นญ์ด ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ์ค๋ฒํค๋๊ฐ ๋ฐ์ํ๋ค.
์ธ๋งํฌ
์ธ๋งํฌ๋ ์ ์ ๋ณ์๋ก์, ์ด๊ธฐํ๋ฅผ ์ ์ธํ๊ณ ๋ ๋จ์ง ๋ ๊ฐ์ ํ์ค ์์์ ์ฐ์ฐ์ผ๋ก ์ ๊ทผํ ์ ์๋ค.
wait(S) {
while (S <= 0)
; // busy wait
S--;
}
signal(S) {
S++;
}
wait() ํจ์๋ ์ธ๋งํฌ๊ฐ 0 ์ด์์ธ์ง๋ฅผ ๊ฒ์ฌํ๊ณ , ์ฐธ์ผ ๊ฒฝ์ฐ ์ธ๋งํฌ๋ฅผ 1 ๊ฐ์์ํจ ํ ๋ฝ์ ํ๋ํ๋ค. signal() ํจ์๋ ๋ฝ์ ๋ฐํํ๋ ๊ณผ์ ์์ ์ธ๋งํฌ๋ฅผ 1 ์ฆ๊ฐ์ํจ๋ค. ๋ ํจ์๋ ๋ชจ๋ ์์์ ์ผ๋ก ์คํ๋์ด์ด์ผ ํ๋ฉฐ, ๋์์ ๋์ผํ ์ธ๋งํฌ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ค.
์ธ๋งํฌ๋ ํฌ๊ฒ ๋ ๊ฐ์ง๋ก ๊ตฌ๋ถํ๋ค.
- ์นด์ดํ
์ธ๋งํฌ
- ์ธ๋งํฌ์ ๊ฐ์ ์ ํ์ด ์๋ค.
- ์ธ๋งํฌ์ ์ด๊ธฐ ๊ฐ์ ์์์ ๊ฐ์๋ก ์ด๊ธฐํ๋๋ค.
- ์ด์ง ์ธ๋งํฌ
- ์ธ๋งํฌ์ ๊ฐ์ด 0๊ณผ 1์ฌ์ด์ ๊ฐ๋ง ๊ฐ์ง๋ค.
- ๋ฎคํ ์ค ๋๊ณผ ์ ์ฌํ๊ฒ ๋์ํ๋ค.
์ธ๋งํฌ๋ ๋ฎคํ ์ค์ ๋์ผํ๊ฒ ์ธ๋งํฌ์ ๊ฐ์ด ์์๊ฐ ๋ ๋๊น์ง ๋๊ธฐํด์ผํ๋ ๋ฌธ์ ๊ฐ ์๋ค. ๋ฎคํ ์ค์ ๋ฐ์ ๋๊ธฐ๋ฅผ ํ์ง๋ง, ์ธ๋งํฌ์ ๊ฒฝ์ฐ ์์ ๋ ์ฐ์ฐ์ ๋ณ๊ฒฝํ์ฌ ๋ฐ์ ๋๊ธฐ๋ฅผ ์งํํ์ง ์์๋ ๋๋ค.
- wait()
- ์ธ๋งํฌ ๊ฐ์ด ์์๊ฐ ์๋ ๊ฒ์ด ๋ฐ๊ฒฌ๋๋ฉด, ํ๋ก์ธ์ค๋ ์์ ์ ์ผ์ ์ค์ง ์ํจ๋ค.
- ์ผ์ ์ค์ง ์ฐ์ฐ์ ํ๋ก์ธ์ค๋ฅผ ์ธ๋งํฌ์ ์ฐ๊ด๋ ๋๊ธฐ ํ์ ๋ฃ๋๋ค.
- ํ๋ก์ธ์ค์ ์ํ๋ฅผ ๋๊ธฐ ์ํ๋ก ์ ํํ๋ค.
- ์ดํ ์ ์ด๊ฐ CPU ์ค์ผ์ค๋ฌ๋ก ๋์ด๊ฐ๊ณ , ์ค์ผ์ค๋ฌ๋ ๋ค๋ฅธ ํ๋ก์ธ์ค๋ฅผ ์คํํ๊ธฐ ์ํด ์ ํํ๋ค.
- signal()
- ์ธ๋งํฌ๋ฅผ ๋ฐ๋ฉํ๋ ํ๋ก์ธ์ค๊ฐ wakeup() ์ฐ์ฐ์ ๋ด๋ถ์ ์ผ๋ก ํธ์ถํ์ฌ ๋๊ธฐ์ค์ธ ํ๋ก์ธ์ค๋ฅผ ์ฌ์์ํ๋ค.
- ํด๋น ์ฐ์ฐ์ ํ๋ก์ธ์ค์ ์ํ๋ฅผ ๋๊ธฐ์ํ์์ ์ค๋น ์๋ฃ ์ํ๋ก ๋ณ๊ฒฝํ๋ค.
- ์ดํ, ํ๋ก์ธ์ค๋ ๋ ๋ ํ์ ๋ฃ์ด์ง๋ค.
์ธ๋งํฌ๋ ํ ๊ฐ์ ์ ์์ ํ๋ก์ธ์ค ๋ฆฌ์คํธ list๋ฅผ ๊ฐ์ง๋ค. ํ๋ก์ธ์ค๊ฐ ์ธ๋งํฌ๋ฅผ ๊ธฐ๋ค๋ ค์ผ ํ๋ค๋ฉด, ์ธ๋งํฌ์ ํ๋ก์ธ์ค ๋ฆฌ์คํธ์ ์ถ๊ฐ๋๋ค.
typedef struct {
int value;
struct process *list;
} semaphore;
wait(semaphore *S) {
S->value--;
if (S->value < 0) {
add this process to S->list;
sleep();
}
}
signal(semaphore *S) {
S->value++;
if (S->value <= 0) {
remove a process P from S->list;
wakeup(P)
}
}