Mutex와 세마포어
Critical section(임계 구역)에대한 접근을 막기 위해 LOCKING 매커니즘 필요
Mutex(binary semaphore)
→ 임계구역에 하나의 스레드만 들어감
Semaphore
→ 임계구역에 여러 스레드가 들어갈 수 있음
세마포어 (Semaphore)
- P : 검사 (임계영역에 달어갈 때)
- V : 증가 (임계역역에서 나올 때)
- S : 세마포어 값 (초기 값만큼 여러 프로세스가 동시 임계 영역 접근 가능)
P(S) : wait(S) {
while s <= 0;
s--;
}
V(S) : signal(S) {
s++;
}
wait는 s가 0이라면, 반복문을 수행하는데 cpu 성능 낭비를 가져올 수 있음 바쁜대기
세마포어 (Semaphore) - 대기큐
- S가 음수일 경우, 바쁜 대기 대신, 대기큐에 넣는다.
wait(S) {
S->count--;
if (S->count <=0) {
add this process to S->queue;
block()
}
}
스레드를 블록 상태로 바꾼다.
- wakeup() 함수를 통해 대기큐에 있는 프로세스를 재실행
signal(S) {
s->count++;
if (s->count > 0) {
remove a process P from S->queue;
wakeup(P)
}
}
댓글