시작은 미약하였으나 , 그 끝은 창대하리라

뮤텍스(Mutex)/ 세마포어(Semaphore) 란? 본문

Study 공부/분류 필요

뮤텍스(Mutex)/ 세마포어(Semaphore) 란?

애플파ol 2022. 2. 28. 10:26

1) 임계구역(Critical Section)

     여러 프로세스 혹은 스레드가 작업을 수행하면서 공유된 자원을 건드리게 될 수 있는데, 이때 동기화 처리를 제대로

     해주지 않으면 문제가 발생할수 있다.  

     이렇듯 공유되는 부분이 굉장히 중요한데, 프로그램 코드 상에서 공유 자원에 접근하는 부분임계 구역(Critical         Section) 이라고 한다 

 

   -> 임계구역에 여러 프로세스및 스레드가 함부로 접근할 수 없도록 관리를 잘 해줘야 하느네, 이를 위해 사용하는

      방식에 대표적인 세마포어(semaphore)와 뮤텍스(Mutex)가 있다.

 

2)뮤텍스(Mutex)란?

뮤텍스(Mutex)는 상호 배제(Mutual Exclusion)를 뜻하는 말로, Critical Section을 가지는 쓰레드들의 Running time이 서로 겹치지 않도록 해주는 기법입니다.  

세마포어와 가장 큰 차이점은 공유자원에 접근할수 있는 대상의 개수 차이이다. 뮤텍스는 1개의 스레드만이 공유 자원에 접근할 수 있도록 한다. 자원을 점유하고 있는 대상이 Lock을 할 수 있는 권한을 가지고 있어서 자원을 점유하기 시작할 때 들어가서 Lock을 걸어버린다. 이렇게 되면 다른 대상들은 Unlock 상태가 될 때까지 기다렸다가 나중에 해당 공유 자원에 접근할 수 있게 된다.

 

3)세마포어(Semaphore)란?

세마포어(Semaphore)는 공유 자원에 여러 프로세스가 접근하는 것을 막는 것을 말합니다. 세마포어는 이를 위해서 현재 공유 자원의 상태를 나타내는 카운터 변수를 사용하게 됩니다.

각각의 프로세스들은 이런 상태값을 확인하여 자원을 즉시 사용할 수 있는 상태라면 즉시 사용할 수 있고 만약에 누군가가 자원을 사용중이라는 것을 인지하게되면, 반드시 일정 시간을 기다렸다가 사용하게 됩니다. 이런 방식을 통해 여러 프로세스가 공유 자원에 한꺼번에 접근하는 것을 막을 수 있습니다.

큰 특징으로는, 세마포어는 앞에 나온 뮤텍스와 다르게 0혹은 1과같은 이진수 외에 더 큰 숫자를 가지게 할 수도 있어서 꼭 1개의 프로세스만이 자원을 점유하지는 않습니다. 카운터 변수의 값이 해당 공유 자원에 접근할 수 있는 임계치가 되며 이를 조정하여 접근할 수 있는 프로세스의 개수를 통제할 수 있습니다.

 

4)결론

뮤텍스(Mutex)는 이진 세마포어(Binary Semaphore)로 세마포어의 일종입니다. 가장 큰 차이점으로는 뮤텍스는 오직 1개의 프로세스 혹은 스레드만이 공유 자원에 접근할 수 있고, 세마포어는 지정된 변수의 값만큼 접근할 수 있습니다.

 

 

 

출처)https://velog.io/@logandev/%EC%84%B8%EB%A7%88%ED%8F%AC%EC%96%B4%EC%99%80-%EB%AE%A4%ED%85%8D%EC%8A%A4-%EC%B0%A8%EC%9D%B4

 

 

 

 

☞이해를 돕기위한 이미지(퍼옴)

 

 

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

Toilet problem

동시성 프로그래밍의 가장 큰 숙제는 ‘공유자원 관리’일 것이다. 공유자원을 안전하게 관리하기 위해서는 상호배제(Mutual exclusion)를 달성하는 기법이 필요하다.

뮤텍스와 세마포어는 이를 위해 고안된 기법으로 서로 다른 방식으로 상호배제를 달성한다. 오늘은 이 둘의 차이를 알아보자.

Mutex

뮤텍스는 화장실이 하나 뿐이 없는 식당과 비슷하다. 화장실을 가기 위해서는 카운터에서 열쇠를 받아 가야 한다.

당신이 화장실을 가려고 하는데 카운터에 키가 있으면 화장실에 사람이 없다는 뜻이고 당신은 그 열쇠를 이용해 화장실에 들어갈 수 있다.

당신이 화장실에서 행복한 시간을 보내고 있는데 다른 테이블에 있는 어떤 남자가 화장실에 가고 싶어졌다. 이 남자는 아무리 용무가 급하더라도 열쇠가 없기 때문에 화장실에 들어갈 수 없다. 결국 남자는 당신이 용무를 마친 후 나올 때까지 카운터에서 기다려야 한다.

곧이어 옆 테이블에 있는 남자도 화장실에 가고 싶어졌고 이 남자 또한 화장실에 들어가기 위해서는 카운터에서 대기해야한다.

이제 당신이 화장실에서 나와 카운터에 키를 돌려놓았다. 이제 기다리던 사람들 중 맨 앞에있던 사람은 키를 받을 수 있고 이를 이용해 화장실에 갈 수 있다.

이것이 뮤텍스가 동작하는 방식이다. 화장실을 이용하는 사람은 프로세스 혹은 쓰레드이며 화장실은 공유자원, 화장실 키는 공유자원에 접근하기 위해 필요한 어떤 오브젝트이다.

즉 뮤텍스는 Key 에 해당하는 어떤 오브젝트가 있으며 이 오브젝트를 소유한 (쓰레드,프로세스) 만이 공유자원에 접근할 수 있다.

Semaphore

세마포어는 손님이 화장실을 좀 더 쉽게 이용할 수 있는 레스토랑이다. 세마포어를 이용하는 레스토랑의 화장실에는 여러 개의 칸이 있다. 그리고 화장실 입구에는 현재 화장실의 빈 칸 개수를 보여주는 전광판이 있다.

만약 당신이 화장실에 가고 싶다면 입구에서 빈 칸의 개수를 확인하고 빈 칸이 1개 이상이라면 빈칸의 개수를 하나 뺀 다음에 화장실로 입장해야 한다. 그리고 나올 때 빈 칸의 개수를 하나 더해준다.

모든 칸에 사람이 들어갔을 경우 빈 칸의 개수는 0이 되며 이때 화장실에 들어가고자 하는 사람이 있다면 빈 칸의 개수가 1로 바뀔 때까지 기다려야 한다.

사람들은 나오면서 빈 칸의 개수를 1씩 더한다. 그리고 기다리던 사람은 이 숫자에서 다시 1을 뺀 다음 화장실로 돌진한다.

이처럼 세마포어는 공통으로 관리하는 하나의 값을 이용해 상호배제를 달성한다.

세마포어도 아까와 똑같이 화장실이 공유자원이며 사람들이 쓰레드, 프로세스이다. 그리고 화장실 빈칸의 개수는 현재 공유자원에 접근할 수 있는 쓰레드,프로세스의 개수를 나타낸다.


정리를 해보자.

뮤텍스: 한 쓰레드, 프로세스에 의해 소유될 수 있는 Key🔑를 기반으로 한 상호배제기법

세마포어: Signaling mechanism. 현재 공유자원에 접근할 수 있는 쓰레드, 프로세스의 수를 나타내는 값을 두어 상호배제를 달성하는 기법

두 기법 모두 완벽한 기법은 아니다. 이 기법들을 쓰더라도 데이터 무결성을 보장할 수 없으며 데드락이 발생할 수도 있다. 하지만 상호배제를 위한 기본적인 기법이며 여기에 좀 더 복잡한 매커니즘을 적용해 꽤나 우아하게 동작하는 프로그램을 짤 수 있다.



출처: https://worthpreading.tistory.com/90 [Worth spreading]

 

'Study 공부 > 분류 필요' 카테고리의 다른 글

[VScode] 익스텐션 추천  (0) 2024.05.15
[Elsevier 양식] 템플릿 정보 및 에러 수정  (1) 2024.04.10
Comments