세마포어
- 임계영역 문제 해결을 위한 조건(상호배제, 한정대기, 진행의 융통성)이 모두 보장된다.
- busy waiting이 없으며 구현이 간단하고 사용하기 쉬운 일반적인 임계영역 문제 해결 방법.
임계영역
- 경쟁상태가 발생하는 영역
- 경쟁상태를 막기 위해 한 번에 한 프로세스 또는 스레드가 임계영역에 접근해야 한다.
임계영역 문제 해결을 위해 아래의 조건이 모두 보장되어야 한다.
★1. 상호배제(mutex)★
- 한 번에 한 프로세스 또는 스레드가 임계영역에 접근해야 한다.
- 한 프로세스가 임계영역에서 실행중일 경우 다른프로세스는 해당 임계영역에서 실행될 수 없다.(비선점)
2. 한정 대기
- 프로세스 또는 스레드가 임계영역에서 실행되기 위해 기다리는 시간은 정해져있다.
(무한정 기다리지 않음)3. 진행의 융통성
- 한 프로세스 또는 스레드가 임계영역에서 실행중이지 않을 경우 다른 프로세스는 임계영역에서 실행될 수 있다.
세마포어 예시
한 식당에는 사용가능한 화장실이 3개가 있다.
손님은 화장실에 가기전에 카운터에서 화장실 열쇠가 있는 지 확인한 뒤에,
열쇠가 있다면 화장실에 갈 것이고 열쇠가 하나도 없다면 기다릴 것이다.
화장실: 프로세스
화장실 수: 프로세스 수
기다림: 세마포어 큐
열쇠가 있음 : 세마포어 큐에서 나옴
세마포어 의사코드 설명
세마포어 c언어 함수
#include<semaphore.h> sem_t S; //구조체변수 선언 sem_init(&S, 0, n); // == Semaphore(n) sem_wait(&S); // == P() // 임계영역 // sem_post(&S); // == V()