두 개 이상의 프로세스가 공통 자원을 병행적으로(concurrently) 읽거나 쓰는 동작을 할 때, 공용 데이터에 대한 접근이 어떤 순서에 따라 이루어졌는지에 따라 그 실행 결과가 같지 않고 달라지는 상황
앞선 race condition 문제를 해결하기 위해선 여러 프로세스나 쓰레드가 동시에 공유 자원에 접근하는 것을 제어하는 상호배제 기법이 필요하다.
스레드 및 프로세스에 의해 소유될 수 있는 key를 기반으로 상호 배제하는 방법
동기화 대상 1개이다.
뮤텍스 소유 스레드만이 해제가능하다.
공유자원에 접근할 수 있는 스레드및 프로세스 개수에 제한을 두어 상호배제하는 방법
동기화 대상 1개 이상이다.
세마포어 소유하지 않은 다른 스레드가 해제 가능하다.
그러나 상호배제 기법을 쓰더라도 데드락이라는 문제가 발생할 수 있다.
데드락
: 여러 프로세스가 서로 공유 자원을 내놓기를 바라면서 무한정 기다리는 상태
예를 들면, A 프로세스가 lock을 건 상태로 죽어버리면 (unlock을 하지 못하고), B프로세스는 A프로세스가 unlock을 하지 않았기 때문에 공유 자원을 쓰지 못하고 무한정 기다리게 된다.
이외에도 동일 쓰레드에서 Lock 두번 연속 호출 시 데드락이 걸린다.
그렇기에 데드락을 해결하는 방법이 존재한다.
"상점비순"
• 상호배제 : 프로세스들이 필요로 하는 자원에 대해 배타적 통제권을 요구함
• 점유대기 : 프로세스가 할당된 자원을 가진 상태에서 다른 자원 기다림
• 비선점 : 프로세스가 어떤 자원의 사용을 끝날 때까지 그 자원을 뺏을 수 없음
• 순환대기 : 각 프로세스는 순환적으로 다음 프로세스가 요구하는 자원을 갖고 있음
예방, 회피, 탐지 및 회복,무시
사실 뮤텍스, 세마포어 기법을 사용하면 데드락 문제까지 해결되는 것이 아닌가..? 혼동되었는데 뮤텍스와 같은 상호배제 기법은 race condition을 해결하기 위한 방법이고, 이 방법도 완벽한 것이 아니라 데드락의 문제가 생길 수 있는 것이고, 그렇기에 데드락의 성립조건에 상호배제가 있었던 것이었다.