CS 공부

[OS/UNIX] 세마포어 (Semaphore)

오늘 할 일을 내일로 2023. 11. 28. 00:13
In computer science, a semaphore is a variable or abstract data type used to control access to a common resource by multiple threads and avoid critical section problems in a concurrent system such as a multitasking operating system.

 

Semaphore란 여러 개의 스레드가 동시에 공유 자원에 접근하는 문제를 해결하고 critical section 문제를 피하기 위해 사용하는 동기화 도구이다. 

 

세마포어는 상호 배제 알고리즘으로 임계 영역을 만들어 자원을 보호한다. 차단을 원하는 자원에 대해 세마포어를 생성하여 해당 자원을 가리키는 세마포어 값을 할당하고 이 세마포어 값을 검사하여 임계 영역에 접근할 수 있는 지를 검사한다. 

 

sem_val (semaphore value)가 0이면 자원에 접근 할 수 없고, 0보다 큰 정수이면 해당 정수의 크기만큼 프로세스가 자원에 접근 할 수 있다. 

 

 

세마포어는 이진 세마포어 (Binary Semaphore), 계수 세마포어 (Counting Semaphore)의 2가지 종류가 있다. 

Binary Semphore는 0과 1의 값으로 (locked / unlocked) 제한하는 세마포어이다. 

Counting Semaphore는 이용가능한 resource의 전체 수로 초기화 하여 사용하는 세마포어 이다.

 

Unix에서 semaphore는 binary, counting semaphore를 합쳐놓은 형태이다. 

 

 

[Semaphore 구현]

전역 변수 S: 임계 구역에 진입 할 수 있는 프로세스의 개수 (사용 가능한 공유 자원 개수)

wait() 함수 : 임계 구역에 들어갈 수 있는 지, 기다려야 하는 지를 알려주는 함수

signal() 함수 : 임계 구역 앞에서 기다리는 프로세스를 깨우는 함수

 

wait()
// 임계 구역
signal()


wait(){
	while ( S <= 0 ) 
    ;
    S--;
}

signal(){
	S++;
}​

 

 

A 프로세스가 위의 코드를 실행하고 있다고 하면

 

wait() 함수를 통해 다른 프로세스가 임계 구역에 접근하지 못하도록 한다. 

 

counting semaphore를 사용하는 경우, S가 3이라고 하면 3개의 프로세스가 임계 구역에 접근 할 수 없다. 

 

A 프로세스가 임계 구역을 통과하면 signal() 함수를 통해 S의 값을 1개 증가 시키고, wait() 중이던 프로세스 중 하나가 해당 임계 구역에 접근 할 수 있게 된다. 

 

 

UNIX 코드로 간단히 구현하면 이러하다. 

struct sembuf p_buf;

p_buf.sem_num = 0;
p_buf.sem_op = -1  	// wait()
p_buf.sem_flg = 0;

// critical section

p_buf.sem_num = 0;
p_buf.sem_op = 1; 	//signal()
p_buf.sem_flg = 0;

 

 

 

<참고>

https://en.wikipedia.org/wiki/Semaphore_(programming)

 

Semaphore (programming) - Wikipedia

From Wikipedia, the free encyclopedia A semaphore (Dutch: seinpaal, the term used in Dijkstra's original description[1]). Variable used in a concurrent system In computer science, a semaphore is a variable or abstract data type used to control access to a

en.wikipedia.org

https://www.joinc.co.kr/w/Site/system_programing/IPC/semaphores

 

세마포어의 사용 - POSIX Semaphore & System V Semaphore

세마포어의 사용 - POSIX Semaphore & System V Semaphore세마포어(Semaphores)를 비록 IPC(프로세스간 메시지 전송을 하거나, 혹은 공유메모리(하나의 데이타에 여러개의 프로세스가 관여할때 어떤 문제점이

www.joinc.co.kr