개발놀이터

세마포어와 뮤텍스 본문

CS 지식/운영체제

세마포어와 뮤텍스

마늘냄새폴폴 2023. 4. 27. 15:34

프로세스 동기화에 대한 면접질문을 외우다가 문득 생각이 들었습니다. "Critical Section (이하 임계구역) 에 접근하는 것을 제어하기 위해 세마포어나 뮤텍스를 사용합니다." 라는 문장에서 세마포어가 뭐지? 뮤텍스는?

 

원래 이런 궁금증이 생기진 않았습니다. 하지만 문득 들더군요. 저것에 대한 꼬리질문이 나올 수도 있겠다는 생각이말이죠. 

 

때문에 오늘 포스팅에선 세마포어와 뮤텍스에 대해서 알아보도록 하겠습니다. 

 

 

세마포어와 뮤텍스

우선 결론부터 말해보겠습니다. 뮤텍스는 락을 걸어서 임계구역으로의 접근을 막는 매커니즘을 가지고 있습니다. 우리가 자바에서 흔히 사용하던 synchronized 키워드가 바로 뮤텍스입니다. 

 

세마포어는 신호를 주고받아서 임계구역으로의 접근을 막는 매커니즘을 가지고 있습니다. 이러한 방식을 시그널링 매커니즘을 사용한다. 라고 표현하는데요. 이는 좀 낯선 개념이네요. 한번 알아보죠. 

 

  • 뮤텍스는 프로세스가 자원을 사용할 때 자원에 락을 걸고, 사용하고, 마지막으로 반환합니다. 반면에 세마포어는 wait(), signal() 신호를 주고받으면서 프로세스가 자원을 얻을 수 있는지 반환해야 하는지를 지시합니다. 
  • 뮤텍스는 synchronized 키워드를 사용해보셨으면 아시겠지만 Object 클래스의 객체가 필요하듯 객체입니다. 반면 세마포어는 Integer 형의 변수로 신호를 주고받습니다. 
  • 뮤텍스 객체는 여러개의 프로세스의 스레드가 공유 자원을 얻을 수 있습니다. 하지만 하나의 프로세스가 락을 획득했다면 다른 프로세스는 기다려야하죠. 세마포어는 유한한 자원의 인스턴스가 사용가능할 때까지 여러개의 프로세스가 유한한 자원을 동시에 얻을 수 있습니다. 
  • 뮤텍스는 두가지 상태만을 가지고 있습니다. lock 과 unlock이 바로 그것인데요. 세마포어는 자원을 얻고 반환하는 과정에서 여러개의 변수의 상태를 가질 수 있습니다. 

 

일단 말로 쭉 풀어 썼는데 이해가 되실런지 모르겠네요. 그래서 제가 아주 기가막힌 예시를 가져왔습니다. 

 

뮤텍스와 세마포어는 임계구역으로의 접근을 제어하는 상호배제를 구현하는 매커니즘입니다. 상호배제, 임계구역같은 개념이 좀 부족하신 것 같으시면 아래의 링크에 자세하게 설명되어있으니 보고 오시는 것을 추천드립니다. 

 

https://coding-review.tistory.com/354

 

프로세스 동기화

이번 시간에는 프로세스 동기화에 대해서 알아보도록 하겠습니다. 프로세스 동기화란 OS에서 같은 메모리 공간을 공유하고 있는 프로세스들을 관리하기위한 방법입니다. 프로세스 동기화를 진

coding-review.tistory.com

 

상호배제를 구현하는 매커니즘이기 때문에 우리는 식당에서 화장실을 가는 것으로 설명할 수 있습니다. 

 

뮤텍스

뮤텍스는 식당에 화장실 키가 하나 있고 화장실도 하나밖에 없는 경우입니다. 우리가 일반적으로 식당에 가서 볼 수 있는 상황이죠. 

 

화장실에 가기위해선 키가 있어야하고 만약 화장실에 누가 들어갔다면 아무리 급하더라도 다음 사람이 키를 가지고 나올 때 까지 기다려야합니다. 

 

그리고 만약 화장실에 가고싶은 사람이 많은 경우 맨 앞에 있는 사람이 다음 순서로 들어가는 것까지 뮤텍스와 우리가 생각하는 일반 상식이 정확히 일치합니다. 

 

이런 상황이 바로 뮤텍스를 설명할 수 있는 아주 좋은 예시입니다. 

 

 

세마포어

세마포어는 식당에 화장실이 여러개 있고 들어가고 화장실 밖에는 전광판이 있습니다. 화장실에 가고싶은 사람은 화장실에 들어가고 나올때마다 스위치를 켰다 껐다 하면 됩니다. 

 

스위치를 키면 화장실 안에 누군가 있다는 얘기이고 스위치를 키는 순간 전광판에 숫자가 줄어듭니다. 화장실에서 모든 일을 다 보고 나오면서 스위치를 끄면 숫자가 다시 하나 올라갑니다. 

 

이렇게 화장실에 아무도 없을 때는 전광판에 숫자 3이 적혀있습니다. 

그러다 누군가 들어가면서 스위치를 누르고 들어가면 전광판의 숫자가 2로 줄어듭니다. 마찬가지로 이 사람이 모든 일을 끝냈을 때 스위치를 다시 끄고 나오면 전광판의 숫자가 다시 3으로 돌아옵니다. 

 

 

어떤가요? 예시를 들어보니 이해가 빠르게 되시죠? 위의 예시에서 사람은 프로세스 혹은 스레드이고 화장실은 자원입니다. 

 

뮤텍스는 제가 초반에 자원에 락을 거는 매커니즘이라고 했습니다. 우리는 화장실 예제에서 화장실 키로 화장실(자원)에 락을 걸어 한명만 들어가는 것을 보장했죠. 

 

세마포어는 반면에 신호를 주고받는 매커니즘이라고 했습니다. 화장실 예제에서 우리는 스위치를 켰다 껐다 하면서 전광판에 밖에 있는 사람(프로세스, 스레드)에게 신호를 보냈습니다. 

 

 

각각의 장단점

이제 뮤텍스와 세마포어에 대한 장점과 단점에 대해서 알아보겠습니다. 뚜렷하게 보이는 장점과 단점이 있는데 제가 뮤텍스와 세마포어에 대한 공부를 시작했을 때 느낀점은 뮤텍스는 구현이 쉬울 것 같고 세마포어는 까다로울 것 같더군요. 실제로도 그렇습니다. 

 

이제 본격적으로 장점과 단점에 대해서 알아보죠. 

 

뮤텍스의 장점

  • 뮤텍스는 구현이 아주 간단합니다. syncrhonized 키워드로 상호배제를 구현해보신 분들은 생각보다 간단하다는 생각을 가지셨을 것입니다. 
  • 뮤텍스는 여러개의 다른 스레드가 공유자원에 동시에 접근하는 것을 막는 배리어를 치는 것과 같습니다. 이렇게 하면 서로 다른 스레드가 자원을 필요로할 때 이미 누군가가 들고 있는 자원을 효과적으로 지킬 수 있습니다. 
  • 뮤텍스는 높은 코드 신뢰성을 가지고 있습니다. 다른 스레드에의해 접근한 자원들은 만약 CPU의 메모리 관리에 장애가 발생하게 되면 사용할 수 없습니다. 한번에 자원에 접근할 수 있는 스레드를 막음으로써 시스템은 메모리 관리에 장애가 발생함으로써 야기되는 문제들로부터 회복하는 것이 조금 더 수월해집니다. 

 

뮤텍스의 단점

  • 자원을 획득한 스레드가 아닌 다른 스레드에서는 자원을 잠구거나 해제할 수 없습니다. 
  • 전형적인 구현방법이 하나의 자원에 하나의 스레드만 접근할 수 있기 때문에 CPU의 시간을 낭비하는 상황을 불러일으킬 수 있습니다. 
  • 만약 하나의 스레드가 락을 획득하고 잠수를 타버리거나 선점을 해버리면 뒤에 잇따르는 스레드들은 무한정 대기하는 기아상태에 빠질 수 있습니다. 

 

세마포어의 장점

  • 세마포어는 시스템의 자원을 효율적으로 할당할 수 있습니다. 이 의미는 메모리를 조금 더 효율적으로 쓸 수 있다는 얘기이죠. 
  • 세마포어는 여러개의 프로세스를 컨트롤할 수 있습니다. 이 말은 메모리를 특정한 일에 할당할 수 있다는 의미이기도 합니다. 
  • 세마포어를 기반으로한 메모리관리는 시스템의 전반적인 성능을 향상시킬 수 있습니다. 

 

세마포어의 단점

  • 세마포어는 프로그래밍 에러를 야기할 수 있습니다. 
  • 세마포어를 구현하기위한 복잡한 프로그래밍 방식 때문에 상호배제를 완벽하게 구현할 수 없습니다. 
  • 세마포어를 구현하는 것은 CPU 메모리 관점에서 굉장히 비쌉니다. 
  • 우선순위에 대한 관리를 할 수 없어서 만약 낮은 우선순위의 프로세스가 임계구역에 들어가버리면 높은 우선순위의 프로세스가 나올 때까지 기다려야합니다. 

 

마치며

여기까지 뮤텍스와 세마포어에 대한 기본적인 개념을 알아봤습니다. 저는 뮤텍스와 세마포어를 영어로된 docs로 보고있었는데 처음엔 이해가 되지 않다가 저 화장실 예시를 보고 무릎을 쳤습니다. 역시 어려운 것을 예시로 풀어 설명하면 이해가 잘 되는 것 같습니다. 

 

이렇게 긴 글 읽어주셔서 감사합니다. 오늘도 즐거운 하루 되세요~

 

 

출처

https://www.shiksha.com/online-courses/articles/mutex-vs-semaphore-what-are-the-differences/

 

Mutex vs.semaphore: What are the differences? - Shiksha Online

This article talks about Mutex vs. semaphore.It also includes advantages and disadvantages of mutex and semaphore.

www.shiksha.com

https://www.geeksforgeeks.org/mutex-vs-semaphore/

 

Mutex vs Semaphore - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org

https://worthpreading.tistory.com/90

 

뮤텍스(Mutex)와 세마포어(Semaphore)의 차이

이 글은 Medium에 개시된 글입니다. Medium에서 보시면 좀 더 유쾌한 환경에서 글을 보실 수 있습니다. 뮤텍스(Mutex)와 세마포어(Semaphore)의 차이 Toilet problem 동시성 프로그래밍의 가장 큰 숙제는 ‘공

worthpreading.tistory.com

 

'CS 지식 > 운영체제' 카테고리의 다른 글

리눅스 커널  (0) 2024.06.02
교착상태 (DeadLock) 와 기아상태 (Starvation)  (0) 2023.04.24
프로세스 동기화  (0) 2023.04.16
동시성문제와 Thread-safe  (0) 2023.04.13
프로세스와 스레드  (0) 2023.04.08