프로세스와 스레드를 공부하면서 같이 공부하게 된 프로세스 동기화와 임계 영역 관련 문제를 해결하기 위한 방법으로 쓰일 수 있는 뮤텍스와 세마포어에 대해서 간단한 포스팅을 해보려고 합니다.
목차
0. 뮤텍스
먼저 뮤텍스와 세마포어는 데이터를 동기적으로 처리하기 위해서 사용하는 상호 배제 기법입니다.
다중 프로그래밍 운영체제에서 여러 프로세스가 동시에 데이터를 공유하면서 원하지 않는 결과가 발생할 수가 있는데요! 이렇게 동시에 접근할 때 위험한 데이터를 임계 구역(Critical Section)으로 설정하여 해당 구역에 들어가기 전에 검사하는 과정이 필요합니다.
이 과정에 사용되는 메카니즘이 바로 뮤텍스와 세마포어입니다.
뮤텍스는 Mutual Exclusion에서 Mut와 Ex를 따와서 만들어진 말로, 오직 1개의 프로세스나 스레드만이 접근할 수 있습니다.
하나의 프로세스가 key 혹은 lock을 들고 임계 구역에 접근을 하게 되면 다른 프로세스는 해당 임계 구역에 접근할 수 없습니다.
접근해있는 프로세스가 일을 마치고 key나 lock을 반납하면 다른 프로세스는 그걸 받고 나서야 임계 구역에 접근할 수 있게 됩니다.
1. 세마포어
세마포어는 뮤텍스에서 다중 공유 자원 처리기능이 추가된 방법입니다.
카운트가 존재하여 해당 카운트가 점차 줄어들어 0이 되면 그때부터 새로운 프로세스의 접근을 막는 방식으로 작동합니다.
만약 이 카운트가 1이라면, 뮤텍스와 비슷하게 단 한명만이 해당 임계 구역에 접근할 수 있습니다. (이 경우를 이진 세마포어라고도 부릅니다.)
정리하면 사용하는 프로세스나 스레드의 수를 공통으로 관리하는 하나의 값을 이용하여 상호 배제를 달성하는 방법이라고 볼 수 있습니다.
2. 정리
뮤텍스는 동기화하는 대상이 1개일 때 사용합니다.
반면 세마포어는 동기화 대상이 여러 개일 수 있습니다.
(설정에 따라 뮤텍스와 동일하게 1개의 프로세스/스레드만 접근하게 만들 수도 있습니다.)
또한 뮤텍스 환경에서는 오직 하나만이 데이터에 접근하는 방식이기 때문에 접근한 동안에는 해당 데이터를 소유할 수 있습니다.
하지만 세마포어 환경에서는 데이터를 소유 할 수 없습니다.
흔히 화장실..을 예시로 드는데 기억하기 괜찮은 방법인 것 같습니다 :)
3. 참고자료
최근댓글