개념

<aside> 💡

세마포어(Semaphore) 병렬 프로그래밍 및 동시성 제어를 위한 동기화 도구로 사용되는 개념입니다. 주로 다중 스레드나 프로세스 간의 공유 자원에 대한 접근을 조절하는 데 사용됩니다.

</aside>

*Semaphore는 깃발 이라는 뜻입니다.(네덜란드어)*

옛날에는 기찻길에서 깃발 표식으로 파란색이 걸려있으면 지나가도 되고 빨간색이 걸려있으면 섰다가 다른 기차가 지나가면 지나가게끔 하는 용도로 깃발을 사용했습니다. 이 깃발을 Semaphore라고 부릅니다.

즉, 겹치는 기찻길 부분이 두 기차가 공유하는 critical section이 됩니다. 저 기찻길에서도 critical section을 지나가도 된다 안된다를 알려주는 단어로 쓰인겁니다.

Semaphore

Semaphore

Binary Semaphore

위의 그림을 보면 공유하는 기찻길이 하나이다. 이 경우 공유 자원이 1이라 볼 수 있다. 기차가 지나갈 때 1을 감소시키고, 다 지나간 뒤에 1을 증가시키는 일을 반복한다. 그리고 다른 기차가 지나가려고 할 때, Semaphore가 0인 경우에는 정지하고 1인 경우에 순차적으로 지나가게 하면 해결된다.

이렇게 Semaphore가 0, 1인 경우를 Binary Semaphore 라 한다.

Counting Semaphore

공유 자원이 꼭 1개일 필요는 없다. 여러개의 자원인 상황도 존재한다. 가령 위의 기차 그림에서 통과해서 갈 수 있는 공유 기찻길이 5개라면, 공유자원은 5이다. 즉, Semaphore가 n인 경우를 Counting Semaphore라 한다.

구현

Semaphore 값

세마포어는 정수 값으로 표현되며, 이 값을 사용하여 동기화 상태를 나타냅니다. 일반적으로 0이상의 값을 가집니다.

Semaphore 연산

세마포어는 주로 두 가지 기본 연산을 제공합니다.