프로그래밍 언어/Java

[Java/OS] 세마포어(Semaphore)에 관하여

DevPing9_ 2022. 3. 18. 08:26

이전에 OS와 시스템프로그래밍을 공부할 때

임계영역, 세마포어, 데드락, 뮤텍스락 등 배운적이 있는데 

기억이 흐릿해져 다시 한번 정리하고자 한다.

 

사실 재밌는 옛날이야기를 찾아 신나서 포스팅 하는 것이기도 하다. ㅋㅋㅋㅋㅋ

 

세마포어(Semaphore)의 유래

Semaphore 는 깃발이라는 뜻이다. (!!!)

옛날 기찻길에서 깃발 표식으로 파란색이 걸려있으면 지나가도 되고
빨간색이면 다른기차가 지나간 후에 통과하라는 표시였다고 한다.

그리고 이 깃발이 Semaphore라고 한다.
(매 우 흥 미 롭 잖 아 !!)

 

세마포어와 뮤텍스(Mutex)

세마포어는 2개이상의 프로세스(또는 쓰레드)가 공유자원에 대한 접근을 제어하는 변수 


뮤텍스는 딱 2개의 프로세스(또는 쓰레드)가 공유자원에 대한 접근을 제어하는 변수 
(그래서 바이너리 세마포어(Binary Semaphore) 라고도 불린다.)

그리고 프로세스의 공유자원은 메모리와 같은 하드웨어가 있어 보통 세마포어(Semaphore)로 제어되지만
쓰레드의 공유자원은 소프트웨어 자원(공유변수)이기에 뮤텍스(Mutex)로 많이 제어가 이루어진다. 

 

세마포어가 공유자원을 제어하는 방법

예시로 해당 공유자원(ex_ 프린터)에 접근가능한 프로세스가 최대 4개라고 한다면 
세마포어는 4로 설정이 되어있고, 프린터가 사용될 때 마다 1씩 감소한다.

자원(프린터)의 사용이 끝나고 반환되면 다시 세마포어는 1이 증가한다.

즉, 세마포어가 0일때는 프로세스는 자원을 사용하기 위해 wait 상태에 빠진다.

 

 

728x90