예전에 누가 바이너리 세마포어와 뮤텍스의 차이가 뭐냐고 물었는데, 똑같은 거 아니냐 차이가 있나? 라고 답한 적이 있다.
요즘 os를 다시 공부하고 있는데 겸사겸사 알아보니 차이가 있더라...
geeksforgeeks에서 본 글이 제일 잘 정리가 되어있어서 보고 한글로 다시 정리를 해보고 한번 생각을 해봤다.
바이너리 세마포어 - Binary Semaphore
- 값을 0과 1만 가지는 세마포어임
- 상호 배제(mutual exclusion) 를 위해 신호 전달 메커니즘을 사용해서 잠금을 구현함
- 세마포어가 0이면 잠겨있는 것이고, 1이면 잠금이 해제된 것
뮤텍스 - Mutex
- 상호 배제를 locking과 unlocking으로 제공
- 하나의 스레드만 전체 버퍼와 함께 작업 가능
둘의 차이는?
바이너리 세마포어 | 뮤텍스 |
---|---|
신호 전달 메커니즘 기반으로 동작 | 잠금 메커니즘 기반으로 동작 |
현재 스레드보다 우선순위가 높은 스레드가 바이너리 세마포어를 해제하고 잠글 수 있음 | 뮤텍스를 획득한 스레드는 크리티컬 섹션에서 나갈 때만 뮤텍스 해제 가능 |
값은 wait() , signal() 에 따라 변경 |
값이 locked, unlocked 으로 수정 |
여러 개의 스레드가 동시에 이진 세마포어를 획득 가능 | 한 번에 하나의 스레드만 뮤텍스를 획득 가능 |
소유권이 없다 | 뮤텍스를 소유한 스레드만 잠금을 해제 가능하므로 소유권이 있음 |
다른 스레드/프로세스가 잠금 해제가 가능하기 때문에 뮤텍스보다 빠르다. | 획득한 스레드만 잠금 해제가 가능하므로 바이너리 세마포어보다 느리다. |
결론
- 결국 둘은 메커니즘이 다르고 사용법, 소유권, 동작 방식이 다르다.
하지만 아직도 좀 헷갈리는 것 같기도 하다. 검색해보면 mutex는 binary semaphore라고 써놓은 곳이 많았다. ㅠㅠ- 함수로써의 mutex가 아닌 상호배제라는 뜻으로 쓰인걸까...
- 언뜻 보면 비슷해 보이지만 자세히 보면 다르다.
ETC...
- 공부를 하다보니 내가 세마포어에 대해 제대로 알고있나 의심하게 되었다..
- 세마포어는 여러 스레드/프로세스가 공유자원에 접근할 수 있게 하면서 어떻게 상호 배제를 지키는걸까?
- -