Semaphore
- process / thread의 동기화 방법
- 자원 공유(critical section 포함) 시 사용한다.
- block / wake-up 알고리즘을 사용(mutual exclusion)
- process가 critical section에 접근할 때, 이미 다른 process가 접근해 있다면 block
- semaphore를 가지고 있는 process가 critical section에서 빠져 나오면 아까 block된 process를 wake up
- 기본적으로 mutex 기능을 포함하고, +@가 가능하다.
- CPU의 낭비가 없다.
- waiting queue가 존재한다.
- wait / signal 동작으로 나뉜다.
- 두 process 사이의 synchronize도 가능하다.
- pthread library를 linked해야 사용이 가능하다.
wait 동작
- 자원을 1개 가져간다.
- 자신의 pid를 waiting queue에 넣는다.
- 만일 가져갈 자원이 없다면 block을 하고 대기한다.
signal 동작
- 가져간 value 1개를 돌려놓는다.
- value <= 0 : 기다리는 p가 있다는 것으로, queue의 맨 앞에 있는 process를 호출한다.
Semaphore(n)
- n = 0일 때 : process 사이의 synchronize
- n = 1일 때 : binary semaphore
- n > 1일 때 : value가 0보다 작거나 같아질 때까지 계속 사용한다.
Semaphore function
Semaphore initialization
#include <semaphore.h>
int sem_init(sem_t *sem, int pshared, unsigned int value);
- semaphore 개체를 먼저 선언한 뒤 초기화 하는 함수
- sem : 초기화 할 semaphore
- pshared :
- 0 : 현재 process에서만 사용 / 주로 많이 사용한다.
- non-zerd : 여러 process에 공유되는 semaphore
- value : semaphore의 초기 value
Semaphore wait
#include <semaphore.h>
int sem_wait(sem_t *sem);
int sem_trywait(sem_t *sem);
- sem_wait() : blocking call
- sem_trywait() : non-blocking call
- value가 양수 값이면 성공, value가 0 이하면 EAGAIN을 return한다.
Semaphore post(signal)
#include <semaphore.h>
int sem_post(sem_t *sem);
int sem_getvalue(sem_t *sem, int *sval);
- sem_post() : block을 할 일이 없다.
- signal handler로 값을 전달하고 조작할 수 있다.
- set_getvalue() : 조작 없이 현재 count를 가져와서 sval에 저장한다.
Semaphore destruction
#include <semaphore.h>
int sem_destroy(sem_t *sem);
- 생성된 semaphore를 제거
- sem : 제거할 semaphore