뮤텍스(Mutex)와 세마포어(Semaphore)는 모두 동시성 제어를 위한 동기화 기법으로 사용되며, 경쟁 상태(Race Condition)를 해결하기 위해 임계 영역(Critical Section)에 대한 접근을 조절하는 데 사용됩니다.
뮤텍스는 상호 배제(Mutual Exclusion)를 제공하는 동기화 기법입니다.
임계 영역에 들어갈 수 있는 스레드는 오직 하나뿐입니다. 즉, 뮤텍스는 한 번에 하나의 스레드만 임계 영역에 진입할 수 있도록 합니다.
뮤텍스는 이진 세마포어(Binary Semaphore)의 특수한 형태로 볼 수 있습니다. 0 또는 1의 값을 가지며, 1인 경우 뮤텍스를 소유하고 있지 않은 상태, 0인 경우 뮤텍스를 소유하고 있는 상태를 나타냅니다.
뮤텍스는 주로 스레드 간 동기화에 사용되며, 한 스레드가 임계 영역을 사용 중이면 다른 스레드는 해당 뮤텍스를 획득하기 위해 대기합니다.
또한 뮤텍스는 Key를 기반으로 한 상호배제 기법으로 Key에 해당하는 어떤 객체(Object)가 있으면 이 객체를 소유한 스레드/프로세스만이 공유자원에 접근할 수 있습니다.
세마포어는 동시성 문제를 해결하기 위한 동기화 기법으로, 정수 변수로서 임계 영역에 들어갈 수 있는 자원의 수를 나타냅니다. 세마포어는 "P(Proberen)"와 "V(Verhogen)"라고 불리는 두 가지 연산을 제공합니다.
P 연산(세마포어 감소)
P 연산은 세마포어 값을 1 감소시키는 연산입니다. 만약 세마포어 값이 0 이상인 경우, 세마포어는 그대로 진행합니다. 그러나 세마포어 값이 0인 경우, 해당 프로세스 또는 스레드는 대기 상태로 들어가고, 세마포어 값이 양수가 될 때까지 기다립니다. 이 때, 세마포어 값이 음수가 되는 것은 허용되지 않습니다.
V 연산(세마포어 증가)
V 연산은 세마포어 값을 1 증가시키는 연산입니다. 이때, 대기 중인 프로세스 또는 스레드가 있는 경우, 한 개의 대기 중인 프로세스 또는 스레드가 깨어나고 세마포어 값을 1 증가시키며, 이어서 임계 영역에 들어갈 수 있는 자원의 수가 늘어납니다.
가장 기본적인 바이너리 세마포어와 여러 자원에 대한 접근을 제어하는 일반적인 세마포어로 나눌 수 있습니다. 바이너리 세마포어는 0 또는 1의 값만 가지며, 뮤텍스와 같은 역할을 합니다. 일반적인 세마포어는 정수 값을 가지며, 여러 자원에 대한 접근을 제어하기 위해 사용됩니다.
세마포어는 동기화 기법으로 널리 사용되지만, 잘못된 사용은 교착상태(Deadlock)와 같은 문제를 발생시킬 수 있습니다.
피드백 및 개선점은 댓글을 통해 알려주세요😊