두 개 이상의 작업이 서로 상대방의 작업이 끝나기 만을 기다리고 있기 때문에 결과적으로 아무것도 완료되지 못하는 상태
- 상호 배제(mutual exclusion)
- 점유 대기(hold and wait)
- 비선점(no preemption)
- 순환 대기(circular wait) 네 가지 조건을 모두 만족하면 교착 상태가 발생
여러 프로세스나 스레드가 동시에 같은 데이터를 조작할 때 타이밍이나 접근 순서에 따라 결과가 달라질 수 있는 상황
여러 프로세스나 스레드들이 공유하는 데이터
- 공유 자원을 접근하는 코드 영역
- 공유 데이터의 일관성을 보장하기 위해 둘 이상의 프로세스나 스레드가 동시에 접근해서는 안된다.
- 상호 배제(Mutual Exclution): 하나의 프로세스가 임계 영역에서 실행중이라면, 다른 프로세스는 해당 영역에 접근할 수 업어야 한다.
- 실행(Process): 임계 영역에서 실행중인 프로세스가 없을 때 들어가려는 프로세스가 여러 개라면 현재 대기중인 프로세스만이 진입 후보가 될 수 있고, 어느 것이 들어갈 것인지 결정해주어야 한다.
- 한정된 대기(Bounded Wating): 한 프로세스가 임계 영역에 진입 요청 후 받아들여질 때까지의 시간동안 다른 프로세스들이 임계 영역에 진입하는 횟수는 제한이 있어야 한다. 다른 프로세스들의 기아(Starvation) 상태를 막기 위함이다.
여러 프로세스나 스레드를 동시에 실행해도 공유 데이터의 일관성을 유지하는 것
여러 스레드를 실행하는 환경에서 자원에 대한 접근에 제한을 강제하기 위한 동기화 메커니즘
- Boolean 타입의 Lock 변수를 사용한다. 따라서 1개의 공유자원에 대한 접근을 제한한다.
- 공유자원을 사용 중인 스레드가 있을 때, 다른 스레드가 공유자원에 접근한다면 Blocking 후 대기 큐로 보낸다.
- Lock 을 건 스레드만 Lock 을 해제할 수 있다.
멀티프로그래밍 환경에서 다수의 프로세스나 스레드가 n 개의 공유 자원에 대한 접근을 제한하는 방법으로 사용되는 동기화 기법
- 세마포어 변수를 통해 wait, signal 을 관리한다. 세마포어 변수는 0 이상의 정수형 변수를 갖는다.
- n 개의 공유자원에 대한 접근을 제한할 수 있으며 이를 계수 세마포어라고 한다. 접근 가능한 공유 자원의 수가 1개일 때는 이진 세마포어로 뮤텍스처럼 사용할 수 있다.
- 큐에 연결된 스레드를 깨우는 방식에 따라 강성 세마포어(큐에 연결된 스레드를 깨울 때 FIFO 정책), 약성 세마포어(큐에 연결된 스레드를 깨울 때 순서를 특별히 명시하지 않음)로 구분된다.
- Lock 을 걸지 않은 스레드도 Signal 을 보내 Lock 을 해제할 수 있다.
- 가장 큰 차이점은 동기화 대상의 갯수이다.
- Mutex는 동기화 대상이 only 1개일 때 사용
- Semaphore는 동기화 대상이 1개 이상일 때 사용
- 세마포어는 뮤텍스가 될 수 있지만, 뮤텍스는 세마포어가 될 수 없다.
- Mutex는 자원 소유 가능 + 책임을 가지는 반면, Semaphore는 자원 소유 불가
- Mutex는 소유하고 있는 스레드만이 이 Mutex를 해제할 수 있다.
- Semaphore는 시스템 범위에 걸쳐 있고, 파일 시스템 상의 파일로 존재한다.