뮤텍스
: 여러 프로세스나 쓰레드가 동시에 공유 자원에 접근하는 것을 제어하기 위한 방법
여기서Lock
과 UnLock
라는 것을 통해서 동시에 공유 자원에 접근하는 것을 제어하게 된다.
예를 들어
A 쓰레드가 Lock을 걸고 공유자원을 쓰고 있으면,
B 쓰레드는 공유자원을 쓰고 싶어도 A thread가 UnLock할 때까지 wait 상태가 된다.
세마포어
: 지정된 개수만큼의 스레드가 동시에 접근하도록 동기화할 수 있게 하는 방식
공유 자원을 하나의 스레드만 접근 할 수 있게 하는 방식었던 뮤텍스와 달리 세마포어는 하나 이상의 컴포넌트가 공유자원에 접근하도록 허용할 수 있다.
Locrk을 취득한 프로세스만이 Unlock할 수 있는 뮤텍스와 달리 세마포어는 Unlock의 주체가 Lock과 같지 않아도 된다. 세마포어는 Lock의 동시 접근만을 제어할 뿐 Unlock을 시도하는 프로세스가 Lock을 취득했던 프로세스인지 확인하지 않는다.
이로 인해, Lock을 취득했던 프로세스가 Lock을 해제하지 않은채 비정상 종류가 되었다로 하더라도, 세마포어에서는 다른 프로세스가 대신 Unlock을 하여 무한히 대기하는 상황을 회피할 수 있다.
*세마포어는 뮤텍스가 될 수도 있다.
1개의 프로세스 또는 스레드만 공유 자원을 사용할 수 있게 하면 뮤텍스처럼 이용이 가능하다.
이러한 특성 때문에 뮤텍스를 이진 세마포어라 하기도 한다.
데드락
: 두 개 이상의 작업이 서로 상대방의 작업이 끝나기 만을 기다리고 있기 때문에 결과적으로 아무것도 완료되지 못하는 상태
예를 들어
A 프로세스가 Lock을 건 상태로 (UnLock을 하지 못하고) 죽어버린다면, B 프로세스는 A 프로세스가 UnLock을 하지 않았기 때문에 공유 자원을 쓰지 못하고 무한정 기다리게 된다.
* 데이터 레이스(Data Race)
여러 프로세스/스레드가 공유된 데이터를 읽고 쓰는 작업을 할 때 실행 순서에 따라서 잘못된 값을 읽거나 쓰게 되는 상황.
병렬 처리를 하는 경우에 아주 흔하게 발생하므로 뮤텍스, 세마포어 등으로 처리해준다.