기타등등

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

티베트 모래여우 2022. 6. 24. 01:49
반응형

개요

전에 파이썬의 GIL에 대해서 설명할 때 뮤텍스(Mutex)라는 용어를 언급했었는데 이번에 이 뮤텍스와 뮤텍스의 상위 개념인 세마포어(Semaphore)까지 함께 다뤄보겠습니다.

우선 빠르게 한 줄로 요약하자면, 세마포어와 뮤텍스는 프로세스 / 스레드에서 사용되는 일종의 열쇠(key)라고 생각하시면 됩니다.

뭔 개소린지 모르시겠다면, 정상입니다. 차차 자세히 설명드릴테니 우선 내려보시죠.

 

마이 쁘레셔스

사전 지식 - 임계 구역(Critical section)

임계 구역은 다수의 프로세스가 데이터를 공유하며 실행되는 상황에서 각 프로세스가 공유 자원에 접근하는 코드 블록을 의미합니다. 공유 자원이라는 말에서 대충 눈치 채셨겠지만, 다수의 프로세스가 동시에 공유 자원에 접근하여 사용하면 문제가 생기게 됩니다.(이상한 결과가 나온다던가..)


세마포어(Semphore)란?

세마포어는 저런 임계 구역에서 발생할 수 있는 문제를 해결하기 위해 등장한 개념입니다.

어떤 공유 자원에 대해 동시에 접근할 수 있는 프로세스/스레드의 수를 변수로 제한하여 공유 자원의 오염을 막습니다. 이 변수는 운영체제나 커널에 실제로 저장되며, 각 프로세스가 이 값을 확인하고 변경할 수 있습니다.

만약 어떤 공유 자원의 세마포어가 3이라면 해당 자원은 동시에 최대 3개의 프로세스가 접근 가능하다는 의미입니다.

 

좋은건 좀 나눠씁시다
 

뮤텍스(Mutex)란?

뮤텍스는 상호 배제(Mutual Exclusion)의 줄임말 입니다. 파이썬의 GIL이 이 뮤텍스에 속합니다. 뮤텍스는 이진(Binary) 세마포어이기도 하며 세마포어의 특성들을 어느 정도 가지고 있지만 확연한 차이점이 존재합니다.

· 뮤텍스는 단 하나의 프로세스/스레드만 접근 가능하다.

- 뮤텍스가 사용되는 임계 구역은 공유가 불가능한 자원입니다. 따라서 한번에 단 하나의 프로세스/스레드만 접근이 가능하며, 사용중인 프로세스/스레드가 락(Lock)을 걸어버려 다른 프로세스/스레드의 접근을 방지합니다.

· 뮤텍스는 프로세스단에서 관리된다.

- 운영체제나 커널에 저장되고 변경되는 세마포어와는 다르게 뮤텍스는 프로세스단에서 관리됩니다.

· 뮤텍스의 락(Lock)은 본인이 아니면 해제가 불가능하다.

- 다른 프로세스들도 자유롭게 확인하고 변경 가능했던 세마포어와는 다르게 뮤텍스는 락을 건 프로세스/스레드 본인이 아니면 그 락을 해제할 수 없습니다.

 

단!!!!!!!!!!!!!!비!!!!!!!!!!!!꺼!!!!!!!!!!!!!!
 

세마포어와 뮤텍스의 차이점 요약

세마포어와 뮤텍스는 흔히 "화장실"로 비유되곤 합니다.

세마포어는 화장실이 여러개 있는 가게입니다.

만약 화장실이 5개(세마포어 값이 5)라면 화장실을 동시에 이용할 수 있는 손님은 최대 5명입니다.

손님 한 명이 화장실에 들어갈 때마다 사용 가능한 화장실이 하나 줄어들고, 나오면 늘어납니다.

만약 내가 화장실에 가고 싶은데 5개의 화장실이 전부 사용중이라면?(세마포어 값이 0이라면)

당연히 들어간 사람이 나올 때 까지 기다려야 합니다.(사용중인 프로세스/스레드가 사용을 마칠 때 까지 대기)

그리고 사람이 나오면 비로소 안도감을 느끼며 화장실을 사용하게 되는 것입니다.(대기중이던 프로세스가 자원을 사용하기 시작)

반면 뮤텍스는 좀 불편한 화장실을 가진 가게입니다. 가게 내에 화장실이 단 1개밖에 없으며, 심지어 카운터에서 열쇠를 받아가야만 사용이 가능합니다.

손님 한 명이 카운터에서 키를 받아(제어권 획득)

화장실에 들어가서 문을 잠가버린다면(Lock설정)

그 손님이 나오기 전엔 그 누구도 화장실을 사용할 수 없습니다.(다른 프로세스/스레드는 대기)

심지어 열쇠가 없으면 들어갈 수 없으니 먼저 들어간 사람이 키를 반환하기 전까진 무작정 기다려야 합니다.(다른 프로세스/스레드가 Lock을 멋대로 해제할 수 없음)

그러다 사용중이던 손님이 카운터에 열쇠를 반환하면(Lock 해제)

그 때서야 열쇠를 가져가서 화장실을 이용할 수 있게 됩니다.(대기중이던 프로세스/스레드가 제어권 획득)

다행히 뮤텍스는 열쇠가 부러지거나 하진 않습니다.
반응형