Mutex
세마포어
- 임계구역에 여러 스레드가 들어갈 수 있음
- counter를 통해 동시에 접근할 수 있는 스레드 수를 설정
세마포어 원리
- P: 검사(임계영역에 들어갈 때)
- V: 증가(임계영역에 나올 때)
- S: 세마포어 값(초기값만큼 스레드가 동시에 임계영역 접근 가능)
P(S): wait(S) {
while S <= 0
S--
}
V(S): signal(S){
S++
}
바쁜 대기
- wait()는 S가 0이라면 임계영역에 들어가기 위해, 반복문 수행(바쁜 대기)
대기큐
wait(S){
S->count--;
if(S->count <= 0){
add this process to S->queue;
block()
}
}
signal(S){
S->count--;
if(S->count > 0){
remove a process P from S->queue;
wakeup(P)
}
}
- S가 다시 음수가 되면 wakeup을 통해 프로세스 실행
주요 세마포어 함수(POSIX 세마포어)
- sem_open(): 세마포어를 생성
- sem_wait(): 임계영역 접근할때 세마포어를 잠그고, 이미 잠겨있다면 풀릴 때까지 대기
- sem_post(): 공유자원에 대한 접근이 끝났을 때 세마포어 잠금을 해제