https://chelseashin.tistory.com/40
뮤텍스: 한 쓰레드, 프로세스에 의해 소유될 수 있는 Key🔑를 기반으로 한 상호배제기법
세마포어: Signaling mechanism. 현재 공유자원에 접근할 수 있는 쓰레드, 프로세스의 수를 나타내는 값을 두어 상호배제를 달성하는 기법
두 기법 모두 완벽한 기법은 아니다. 이 기법들을 쓰더라도 데이터 무결성을 보장할 수 없으며 데드락이 발생할 수도 있다. 하지만 상호배제를 위한 기본적인 기법이며 여기에 좀 더 복잡한 매커니즘을 적용해 꽤나 우아하게 동작하는 프로그램을 짤 수 있다.
----------------------------
프로세스 간 메시지를 전송하거나, 공유메모리를 통해 공유된 자원에 여러 개의 프로세스가 동시에 접근하면 Critical Section 문제가 발생할 수 있다.
이를 해결하기 위해 데이터를 한 번에 하나의 프로세스만 접근할 수 있도록 제한을 두는 동기화 방식을 취해야 한다.
동기화 도구에는 대표적으로 뮤텍스(Mutex)와 세마포어(Semaphore)가 있다.
이들은 모두 공유된 자원의 데이터를 여러 스레드/프로세스가 접근하는 것을 막는 역할을 한다.
뮤텍스와 세마포어에 대해 공부하기 전에, 용어 하나 알고 가자.
임계 영역(Critical Section)
여러 프로세스가 데이터를 공유하며 수행될 때, 각 프로세스에서 공유 데이터를 접근하는 프로그램 코드 블록
즉, 여러 프로세스가 동일 자원을 동시에 참조하여 값(공유하는 변수명, 파일 등)이 오염될 위험 가능성이 있는 영역
프로그래밍 시, 성능 향상을 위해 임계영역을 최소화하는 설계를 해야 한다.
뮤텍스(Mutex)
동시 프로그래밍에서 공유 불가능한 자원의 동시 사용을 피하기 위해 사용하는 알고리즘
- 임계구역(Critical Section)을 가진 스레드들의 실행시간(Running Time)이 서로 겹치지 않고 각각 단독으로 실행(상호배제_Mutual Exclution)되도록 하는 기술
- 한 프로세스에 의해 소유될 수 있는 Key를 기반으로 한 상호배제 기법
- Key에 해당하는 어떤 객체(Object)가 있으며, 이 객체를 소유한 스레드/프로세스만이 공유자원에 접근할 수 있다.
- 다중 프로세스들의 공유 리소스에 대한 접근을 조율하기 위해 동기화(Synchronization) 또는 락(Lock)을 사용.
- 즉, 뮤텍스 객체를 두 스레드가 동시에 사용할 수 없다.
Mutex
세마포어(Semaphore)
멀티 프로그래밍 환경에서 공유된 자원에 대한 접근을 제한하는 방법
- 공유자원의 상태를 나타낼 수 있는 카운터로 생각할 때,
- 사용하고 있는 스레드/프로세스의 수를 공통으로 관리하는 하나의 값을 이용해 상호배제를 달성한다.
- 운영체제 또는 커널의 한 지정된 저장장치 내의 값
- 일반적으로 비교적 긴 시간을 확보하는 리소스에 대한 이용
- 유닉스 프로그래밍에서 세마포어는 운영체제의 리소스를 경쟁적으로 사용하는 다중 프로세스에서 행동을 조정하거나 또는 동기화하는 기술
- 공유 자원에 접근할 수 있는 프로세스의 최대 허용치만큼 동시에 사용자가 접근할 수 있다.
- 각 프로세스는 세마포어의 값을 확인하고 변경할 수 있다.
- 자원을 사용하지 않는 상태가 될 때, 대기하던 프로세스가 즉시 자원을 사용한다.
- 이미 다른 프로세스에 의해 사용중이라는 사실을 알게 되면, 재시도 전에 일정시간 대기해야 한다.
- 세마포어를 사용하는 프로세스는 그 값을 확인하고, 자원을 사용하는 동안에는 그 값을 변경함으로써 다른 세마포어 사용자들이 대기하도록 해야 한다.
- 세마포어는 이진수를 사용하거나 추가적인 값을 가질 수 있다.
Semaphore
뮤텍스와 세마포어의 차이점
- 가장 큰 차이점은 동기화 대상의 갯수이다.
- Mutex는 동기화 대상이 only 1개일 때 사용
- Semaphore는 동기화 대상이 1개 이상일 때 사용
- 세마포어는 뮤텍스가 될 수 있지만, 뮤텍스는 세마포어가 될 수 없다.
- Mutex는 0, 1로 이루어진 이진 상태를 가지므로 Binary Semaphore!
- Mutex는 자원 소유 가능 + 책임을 가지는 반면, Semaphore는 자원 소유 불가
- 뮤텍스는 상태 0, 1 뿐이므로 Lock 가질 수 있음
- Mutex는 소유하고 있는 스레드만이 이 Mutex를 해제할 수 있다.
- 반면, Semaphore는 Semaphore를 소유하지 않는 스레드가 Semaphore를 해제할 수 있다.
- Semaphore는 시스템 범위에 걸쳐 있고, 파일 시스템 상의 파일로 존재한다.
- 반면, Mutex는 프로세스의 범위를 가지며 프로세스 종료될 때 자동으로 Clean up 된다.
뮤텍스와 세마포어는 모두 완벽한 기법은 아니므로, 데이터 무결성을 보장할 수 없으며 모든 교착 상태를 해결하지는 못한다.
하지만, 상호배제를 위한 기본적인 기법이며 여기에 좀 더 복잡한 매커니즘을 적용해 개선된 성능을 가질 수 있도록 하는 것이 중요하다.
<참고 링크>
내가 뮤텍스와 세마포어를 이해하는데 큰 도움을 준 블로그가 있다.
공유자원을 화장실로 하여 예시를 든 글인데 이 글을 읽어주는 감사한 분들에게도 도움이 되지 않을까 하여 살짝 남긴다.
'개발' 카테고리의 다른 글
Python requests 버프 캡처 (0) | 2022.01.17 |
---|---|
python 캡처2 (펌) (0) | 2022.01.17 |
Python 캡처 (펌) (0) | 2022.01.17 |
Python logging 사용하기(펌) (0) | 2022.01.02 |
mysql 외부 접속 및 허용 제거 (경로 참고) (0) | 2021.11.22 |