공유된 자원에 여러 프로세스, 쓰레드가 동시에 접근하면 상호간에 메시지 전송에서의 오류 등 문제가 발생될 가능성이 있다. 이런 경우 공유된 자원 속 하나의 데이터는 하나의 프로세스만 접근할 수 있도록 제한해 두어야 할 필요성이 있는데 이를 위해 고안된 것이 Semaphore이다.
Semaphore의 원 의미는 철도의 까치발 신호기 또는 해군의 수기 신호란 의미가 있는데, 컴퓨터 공학용어인 세마포어에서도 데이터에 접근할때 신호를 주어 막는다는 개념에서 단어를 공유한다. 쉽게말하면 빨간불/초록불이 있는 신호기를 데이터까지 가는 길목에 세워둬 프로세스를 줄 세운다는 식으로 이해하면 될 것이다.
세마포어는 리소스(자원)에 접근할 데이터 숫자를 임의대로 조정할 수 있는데 세마포어에 카운트를 4로 해둔다면 4명까지는 접근을 열어주고, 그 이후에 도착한 사람은 일단정지! 시키는 것과 비슷하다.
뮤텍스는 상호배제란 의미다. 쉽게 말해 딱 1명만 들여보내는 세마포어라고 생각하면 이해가 편할 것이다.
그러므로 뮤텍스는 세마포어가 될 수 있지만, 세마포어는 뮤텍스가 될 수 없다. 세마포어가 더 큰 집합인 것이다.
물론 작동기전은 다르다. 뮤텍스는 Critical Section
을 가진 쓰레드들의 Running time
이 서로 겹치지 않게 각각 단독으로 실행되게 하는 기술이다. 다중 프로세스들의 공유리소스에 대한 접근을 조율하기 위해 locking
과 unlocking
을 실행한다. 결론적으로 Mutex 객체는 두 쓰레드가 동시에 사용할 수 없다.
세마포어가 자원으로 가는 길목에 신호기를 설치하는거라면, 뮤텍스는 자원 자체에 자물쇠를 걸어두고 1명한테만 열쇠를 주는 방식이라고 보면 된다.
뮤텍스는 항상 접근허용이 무조건 1개이며, 세마포어는 여러개 가질수 있다.
세마포어는 파일시스템 상 파일형태로 존재하지만, 뮤텍스는 프로세스 범위다.
즉, 프로세스가 사라질 때 뮤텍스는 클린업이 된다.
세마포어는 소유할 수 없지만, 뮤텍스는 소유할 수 있다.
뮤텍스의 경우, 뮤텍스를 소유하고 있는 쓰레드가 이 뮤텍스를 해제할 수 있다.
반면, 세마포어의 경우 세마포어를 소유하고 있지않은 쓰레드도 이 세마포어를 해제할 수 있다.