세마포어(Semaphore)
세마포어(Semaphore)
Concurrency 문제를 해결하기 위해 semaphore 사용
즉, 공유된 자원에 여러 프로세스들이 동시에 접근하면서 문제가 발생하는데,
공유된 자원 속 하나의 데이터는 한번에 하나의 프로세스만 접근할수있도록 만들기 위해 사용
Semaphore : integer variable s
3가지 연산만 사용 가능
- Initialization operation : 음수가 아닌 값으로 초기화
- Wait operation : s--
- Signal operation : s++
■ semWait(s)
- 세마포어 값 감소
- 만약 값이 음수가 되면 프로세스는 블럭(대기)한다
- 음수가 아니면 프로세스는 계속 수행한다.
■ semSigna(s)
- 세마포어 값 증가
- 만약 값이 양수가 아니면 semWait 연산에 의해 블록된 프로세스를
ready상태로
● Semaphore 값이 0보다 크거나 같을때
- 세마포어 값은 block되지 않고 semWait을 수행해서 무사 통과할 수 있는 프로세스의 개수
● Semaphore 값이 음수일 때,
- Semaphore의 절대값은 semaphore queue에서 기다리고 있는 프로세스의 개수
**세마포어를 사용하면
- Busy-waiting 없음 : 세마포어 큐에서 기달림
- Starvation 해결 : 세마포어 큐에서 순서대로 처리함
■ Producer/Consumer 문제
-Infinite buffer
- Bounded buffer
◆ 오류인 경우
- mutual exclusion X
- Deadlock