Semaphore
정의
Mutex나 조건 동기를 통한 Gerneralized 된 동기화 기법
구성요소
Semaphore 변수
동기화를 위한 상태를 저장
앞으로 S 라고 약칭
Waiting Queue
접근하지 못하고 기다리는 Process들을 관리할 Queue
이전에 언급한 방법과 달리 Busy-Wait 하지 않고 바로 Blocked State로 들어감
Operation
SemWait
Semaphore 변수를 감소시키는 Operation
SemSignal
Semaphore 변수를 증가시키는 Operation
기준에 따른 종류
S 범위
Binary Semaphore
Mutex Lock이라고 불림
S의 범위가 0 or 1임
S가 1일 때 아무도 쓰고 있지 않은 상태임을 나타냄
=> 1일 때는 0으로 만들고서 CS 영역에 접근하고,
=> 0일 때는 누가 쓰고 있는 것이므로, Blocked Queue로 이동됨
Counting Semaphore
0 or 1이라는 제약이 없는 일반적인 세마포어
이때 S의 값은 자원의 갯수라고 보는 것이 좋음
S가 1 이상이면 감소 시키고, 자원 할당
S가 0 이하면 없으므로, Waiting Queue로 이동
S가 0 이하였다면 자원을 Release 하고 나서,
Waiting Queue에서 다음 Process를 불러옴
Next Process 선택 기준
Strong Semaphore
꺼내는 방식이 FIFO
Weak Semaphore
FIFO가 아닌 것
주의할 점
Lock 등을 위한 Semaphore 변수도 공유자원이므로,
sem_wait, sem_signal 함수에도 Lock, Unlock이 필요하고 이를 TAS, CAS, Disabling Interrrupts 등의 방법으로 구현
각 자원마다 별도의 Lock이 존재해야 함
=> 하나의 Semaphore 변수로 여러 공유 자원을 관리해서는 안됨
Mutex Condition Semaphore 명령어 P Lock Wait Wait sem_wait V UnLock Signal Post sem_signal 리눅스에서 Semaphore
sem_init(세마포어 변수, 0, 1)
마지막 인자는 공유 자원의 갯수
sem_wait(세마포어 변수)
Lock, 자원을 선점
값을 줄이고 0 미만이면 Wait Queue로 들어가 대기
sem_post(세마포어 변수)
Unlock, 자원을 Release
값을 늘리고 0 이하면 자고 있는 Thread 깨움