동기화 매커니즘은 프로세스나 스레드가 공유 자원에 동시에 접근하지 않도록 접근 순서를 제어하는 방법이다.
이를 통해 공유 자원(파일, 메모리 등)의 일관성을 유지하고 경쟁 상태(race condition)를 방지할 수 있다.
경쟁 상태(Race Condition)란 여러 개의 프로세스가 동시에 공유 자원을 읽고 쓸 때 문제가 되는 상황으로, 이로 인해 실행/출력 결과가 일정치 않아진다.
여기서 공유 자원을 임계 구역(Critical Section)이라 하고, 보호되지 않는 임계 구역에 두 처리 단위(프로세스, 스레드)가 동시에 접근할 때 발생하는 문제를 임계 구역 문제라고 한다.
뮤텍스(Mutex)란 ‘Mutual Exclusion'의 줄임말로, 상호 배제를 의미하는 동기화 매커니즘으로, 여러 프로세스 또는 스레드가 동시에 같은 자원에 접근하는 것을 방지하기 위한 기술이다.
간단히 말하자면, 자원에 접근하기 위해 각 프로세스는 락을 획득하여 접근 허용 권한을 얻어야 한다. 한 프로세스가 접근 권한을 허용 받으면 다른 프로세스는 락을 반환하기 전까지는 자원 사용이 불가하다. 결국 두 프로세스가 동시에 접근하는 일은 없게 된다.
세마포어(Semaphore)는 에츠허르 다익스트라가 고안한, 뮤텍스와 같은 동기화 객체로, 공유 자원(임계 구역)에 접근할 수 있는 프로세스나 스레드의 수를 제한한다.
뮤텍스와 달리 복수의 프로세스나 스레드가 임계 구역에 접근할 수 있으며, 접근한 처리 단위 수를 세는 것으로 상호 배제를 이룬다.
에츠허르 다익스트라는 뮤텍스로 인해 발생할 수 있는 교착 상태(식사하는 철학자들 문제 등)를 해결하기 위해 이 방법을 제안했다. 다만, 세마포어가 모든 교착 상태를 해결하지는 못한다.
교착 상태(데드락, Deadlock) : 두 개 이상의 작업이 서로 상대방의 작업이 끝나기 만을 기다리고 있기 때문에 결과적으로 아무것도 완료되지 못하는 상태
구분 | 뮤텍스 (Mutex) | 세마포어 (Semaphore) |
---|---|---|
접근 스레드 수 | 한 번에 하나의 스레드만 접근 가능 | 초기 카운트 값에 따라 여러 스레드가 접근 가능 |
소유권 | 소유권 있음 (획득한 스레드만 해제 가능) | 소유권 없음 (어느 스레드나 해제 가능) |
용도 | 단일 자원 접근 제어 | 제한된 자원에 대한 동시 접근 제어 |