Binary Semaphore vs Mutex

@gmkseta · November 22, 2021 · 1 min read

예전에 누가 바이너리 세마포어와 뮤텍스의 차이가 뭐냐고 물었는데, 똑같은 거 아니냐 차이가 있나? 라고 답한 적이 있다.

요즘 os를 다시 공부하고 있는데 겸사겸사 알아보니 차이가 있더라...

geeksforgeeks에서 본 글이 제일 잘 정리가 되어있어서 보고 한글로 다시 정리를 해보고 한번 생각을 해봤다.

바이너리 세마포어 - Binary Semaphore

  • 값을 0과 1만 가지는 세마포어임
  • 상호 배제(mutual exclusion) 를 위해 신호 전달 메커니즘을 사용해서 잠금을 구현함
  • 세마포어가 0이면 잠겨있는 것이고, 1이면 잠금이 해제된 것

뮤텍스 - Mutex

  • 상호 배제를 locking과 unlocking으로 제공
  • 하나의 스레드만 전체 버퍼와 함께 작업 가능

둘의 차이는?

바이너리 세마포어 뮤텍스
신호 전달 메커니즘 기반으로 동작 잠금 메커니즘 기반으로 동작
현재 스레드보다 우선순위가 높은 스레드가 바이너리 세마포어를 해제하고 잠글 수 있음 뮤텍스를 획득한 스레드는 크리티컬 섹션에서 나갈 때만 뮤텍스 해제 가능
값은 wait() , signal() 에 따라 변경 값이 locked, unlocked 으로 수정
여러 개의 스레드가 동시에 이진 세마포어를 획득 가능 한 번에 하나의 스레드만 뮤텍스를 획득 가능
소유권이 없다 뮤텍스를 소유한 스레드만 잠금을 해제 가능하므로 소유권이 있음
다른 스레드/프로세스가 잠금 해제가 가능하기 때문에 뮤텍스보다 빠르다. 획득한 스레드만 잠금 해제가 가능하므로 바이너리 세마포어보다 느리다.

결론

  • 결국 둘은 메커니즘이 다르고 사용법, 소유권, 동작 방식이 다르다.
  • 하지만 아직도 좀 헷갈리는 것 같기도 하다. 검색해보면 mutex는 binary semaphore라고 써놓은 곳이 많았다. ㅠㅠ
  • 함수로써의 mutex가 아닌 상호배제라는 뜻으로 쓰인걸까...
  • 언뜻 보면 비슷해 보이지만 자세히 보면 다르다.

ETC...

  • 공부를 하다보니 내가 세마포어에 대해 제대로 알고있나 의심하게 되었다..
  • 세마포어는 여러 스레드/프로세스가 공유자원에 접근할 수 있게 하면서 어떻게 상호 배제를 지키는걸까?
  • -

References

@gmkseta
안녕하세요 개발자 김성준입니다.