๐ป ์ฌ์ ์ง์
์ถ์ ์๋ฃํ
- ์๋ฃ๊ตฌ์กฐ์์ ๋ฑ์ฅ
- object์ operation์ผ๋ก ๊ตฌ์ฑ
- ์ปดํจํฐ์์ ์ค์ ๋ก ํํ๋ฅผ ๊ตฌํํ๊ธฐ๋ณด๋ค๋ ๋
ผ๋ฆฌ์ ์ผ๋ก ์ ์๋ ์๋ฃํ
Semaphores
์ค๋ ๋ฐฐ์ธ ์ธ๋งํฌ์ด๊ฐ ์ด ์ถ์ ์๋ฃํ์ ์ํ๋ค.
์ด๋ ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์ ๊ณต์ ์์์ ๊ด๋ฆฌํ๋ ๋๊ธฐํ ๋ฐฉ๋ฒ๋ก ์ด๋ค.
์ฌ์ฉ ๊ฒฝ์ฐ
- lock์ ๊ฑธ ๋
- ๊ณต์ ์์์ ํ๋๊ณผ ๋ฐ๋ฉ ์ฒ๋ฆฌ
์ฐ์ฐ
P ์ฐ์ฐ
- ๊ณต์ ์์์ ํ๋ํ๋ ๊ณผ์
- lock์ ๊ฑบ
V ์ฐ์ฐ
- ๊ณต์ ์์์ ๋ค ์ฌ์ฉํ๊ณ ๋ฐ๋ฉํ๋ ๊ณผ์
- lock์ ํ
Critical Section์์์ ํ์ฉ
1. Busy-wait ๋ฐฉ์
๐ lock์ ์ป์ง ๋ชปํ๋ฉด ํ์ ํ๋ฉด์ lock์ ์ป๊ธธ ๊ธฐ๋ค๋ฆผ
1) Synchronization variable
semaphore mutex;
2) process p
do {
P(mutex);
critical section
V(mutex);
remainder section
} while (1);
2. block & wakeup (=sleep lock)
๐ lock์ ์ป์ง ๋ชปํ๋ฉด ํด๋น ํ๋ก์ธ์ค block ์ฒ๋ฆฌ
P(S)
- ์์์ ํ๋ํ๋ ๊ณผ์
S.value--; # ์์์ ์ฌ๋ถ์ด ์์ผ๋ฉด ํ๋
if(S.value < 0) # ์์ผ๋ฉด
{
add this process to S.L;
block(); # block
}
V(S)
- ์์์ ๋ฐ๋ฉํ๋ ๊ณผ์
S.value++;
if(S.value <= 0) # ์์์ ๊ธฐ๋ค๋ฆฌ๋ฉด์ ์ ๋ค์ด ์๋ ํ๋ก์ธ์ค๊ฐ ์์ผ๋ฉด
{
remove a process P from S.L;
wakeup(P); # ๊นจ์์ฃผ๊ธฐ
}
๋น๊ต
- ๋ณดํต, block & wakeup ๋ฐฉ๋ฒ์ด ๋ ํจ์จ์
- ํ์ง๋ง critical section์ ๊ธธ์ด๊ฐ ์งง๋ค๋ฉด Busy-wait์ด ๋ ์ ํฉ
Semaphore ์ข
๋ฅ
1. Binary semaphore (=mutex)
- 0 ๋๋ 1 ๊ฐ๋ง ๊ฐ์ง๋ semaphore
- ์ฃผ๋ก mutual exclusion (lock/unlock)์ ์ฌ์ฉ
2. Counting semaphore
- ๋๋ฉ์ธ์ด 0์ด์์ธ ์์์ ์ ์๊ฐ
- ์ฃผ๋ก resource counting์ ์ฌ์ฉ
์ถ์ฒ: http://kocw.net/home/m/search/kemView.do?kemId=1046323