semaphore system call
thread의 mutex와 유사하다.
공유된 자원을 동기화할 수 있는 기법
1960대 dijkstra에 의해 설계되었다.
Thread, Process들이 resource를 공유하는 영역인 critical section을 제어하는데 사용한다.
기본적인 특징 (개념적으로 유사하다)
-상호배제를 위해 접근을 막거나 허용하는 것을 block/wackup algorithm
-다른 process가 사용하고 있어서 어떤 process가 접근할 수 없으면 wait큐에 process를 넣어주고 끝나면 깨운다release한다.
- wake que를 하기 때문에 cpu time소모가 없다
- 여러 process가 접근하면 wait que를 사용한다.
Counting Semaphore
- 접근할 수 있는 process의 개수를 n개로 제한
value : 사용가능한 semaphore 수
- semaphore를 얻기위해서 wait()호출, 주로 p함수로 사용
이때 value값 감소시킨다.
value 가 0 보다 작아지면 그 이후에 다른 사람이 깨울 때 까지 process들은 block된다.
- semaphore를 반환할 때 주로 v함수
value값 증가
value가 0보다 작을 때 가장 오랜된 process를 깨운다.
n개가 동시에 semaphore를 얻을 수 있게한다.
semaphore의 n을 하나로 제한
Binary Semaphore
- 특별한 counting semaphore
- value(사용가능하나 semaphore)가 1인 경우 아무도 semaphore를 얻지않는다.
그럴 경우 바로 value감소(value =0)시키고 critical section작업
아닌 경우 block되고 wait큐에 들어간다.
- 빠져나갈 때 v operation
큐에 뭐가 있을 경우 가장 첫번째 process가 실행할 수 있도록한다.
semaphore로 mutual exclusion
binary or semaphore는 mutex(thread를 하나로 제한하는 것과 유사)와 동일한 방식으로 동작한다
Semaphore S(1);
Counting semaphore는 언제쓰나?
n개(thread, process)가 동시에 semaphore를 얻어서 동시에 수행할 수 있느냐?
- 동시에 사용하려면 n개로 제한해서 사용가능
z.B.)
동일한 printer가 3개 있는데 3개에 접근할 수 있는 print를 3개로 제한.
화장실에 비교할 수 있다. 변기가 하나있으면 한명만 쓸수 있고 변기가 3개면 3명이 쓴다.
Process간 sempore로 synchronization 동기화
Semaphore Sync(0)이면 아무도 못들어온다.
wait를 부를 때까지, signal v함수를 부르고 기다린다.
p1이 wait에서 먼저 기다리면 p0에서 process 해제 signal이 보내면 진행된다.
pro/con buffer 공간 있나? 데이터 있나?
num_data의 셀 필요가 없다. mutex.wait()와 mutex.signal()이 필요 없다.
실제로 사용하는 POSIX semaphore
§ NAME
sem_init, sem_wait, sem_trywait, sem_post, sem_getvalue, sem_destroy - operations on semaphores
§ SYNOPSIS
#include<semaphore.h>
int sem_init(sem_t *sem, int pshared, unsigned int value);
int sem_wait(sem_t * sem);
int sem_trywait(sem_t *sem);
int sem_post(sem_t * sem);
int sem_getvalue(sem_t * sem, int * sval);
int sem_destroy(sem_t * sem);
§ must be linked with pthread library.
#include <semaphore.h>
int sem_init(sem_t *sem, int pshared, unsigned int vlaue);
semaphore를 초기화 한다. |
sem : 초기화된 semaphore 데이터 구조체 , 변수를 넣어준다. pointer type pshared : 0 / 1 현재 0: process내에서만 1: 여러 개 process가 value : n개 |
#include<semaphore.h>
int sem_wait(sem_t * sem);
int sem_trywait(sem_t *sem);
semaphore를 얻을때까지 wait 기다렸다가 얻으면 실행 아니면 block value를 내부적으로 감소 |
sem : 초기화한 객체 변수 |
#include <semaphore.h>
int sem_trywait(sem_t *sem);
nonblocking한다. 얻을 수 있으면 얻고 반환 / 없으면 즉시반환 다시 시도하라는 에러 전송 |
sem : 초기화한 객체 변수 |
#include <semaphore.h>
int sem_post(sem_t * sem);
semaphore를 반환 // signal과 동일한 기능 내부적으로 스스로 semaphore증가 block이 되지 않는다. |
sem : 초기화한 객체 변수 |
#include <semaphore.h>
int sem_getvalue(sem_t, int * sval);
현재 semaphore 개수 확인, 두번째 arg로 반환 받는다. |
sem: 확인할 semaphore |
#include<semaphore.h>
int sem_destroy(sem_t * sem);
현재 사용하는 semaphore를 없앤다. 객체로 받은 sem해제, resoure해제시킨다. wait하는 함수가 없어야한다. |
sem : 없앨 semaphore |
semaphore.c
'시스템 프로그래밍' 카테고리의 다른 글
시스템 프로그래밍 10장 - Signal 2 (0) | 2020.06.11 |
---|---|
시스템 프로그래밍 10장 - Signal 1 (0) | 2020.06.10 |
시스템 프로그래밍 8장 - Memory 1 (0) | 2020.06.10 |
시스템 프로그래밍 7장 - Record Lock (0) | 2020.05.06 |
시스템 프로그래밍 7장 - Thread : Condition variable (0) | 2020.05.06 |