만약 멀티 프로세스나 스레드 환경에서 동기화 문제가 발생한다면 어떻게 해결이 가능할까?
공유된 자원에서 발생하는 동기화 문제는 2개의 스레드가 count라는 변수에 접근하여 count에 1씩 더하는 작업을 실행할 경우에는 1과 2이 동시에 접근해서 +1작업을 한다면 count라는 변수가 2가 되는 것이 아니라 1밖에 되지 않습니다.
이런 문제가 발생할때 뮤텍스 또는 세마포어를 사용합니다.
1개의 프로세스나 스레드가 스레드만 공유된 자원의 데이터 혹은 임계영역(Critical Section)등에 접근이 가능하게 하는 것을 이야기합니다.
n개의 프로세스나 스레드가 공유된 자원의 데이터 혹은 임계영역(Critical Section) 등에 접근이 가능하며, 스레드가 접근할 때마다 n의 갯수를 감소시키며 n이 0일때는 자원에 접근이 불가능하게 만드는 것을 이야기합니다.
세마포어는 뮤텍스가 될 수 있지만 뮤텍스는 세마포어가 될 수 없습니다.
세마포어는 소유할 수 없는 반면, 뮤텍스는 소유가 가능하며 소유주가 이에 대한 책임을 집니다.
(뮤텍스의 경우 상태가 두개뿐인 lock이므로 lock을 가질 수가 있습니다.)
뮤텍스의 경우 뮤텍스를 소유하고 있는 스레드가 이 뮤텍스를 해제할 수 있습니다. 하지만 세마포어의 경우 이러한 세마포어를 소유하지 않는 스레드가 세마포어를 해제할 수 있습니다.
세마포어는 시스템 범위에 걸쳐있고 파일시스템상의 파일 형태로 존재합니다. 그러나 뮤텍스는 프로세스 범위를 가지며 프로세스가 종료될 때 자동으로 clean up이 됩니다.
가장 큰 차이점은 관리하는 동기화 대상의 갯수입니다. 뮤텍스는 동기화 대상이 오직 하나뿐일 때, 세마포어는 동기화 대상이 한개 이상일 때 사용합니다.