아래 4가지를 전부 충족하면 데드락.
상호배제(Mutual Exclusion) : 하나의 스레드만 독립적으로 특정 자원을 쓸 수 있다.점유하며 대기(Hold and Wait) : 자원 대기중일 때, 보유중인 자원을 계속 가지고 있는다.비선점(No preemption) : 비선점. 다른 스레드가 보유중인 자원을 선점할 수 없다.순환 대기(Circular wait) : 스레드들의 자원 요청을 화살표로 나타냈을 때, 순환되어야한다. 즉, P0이 필요한 자원을 P1이 선점하고 있고, P1이 필요한 자원은 P0이 선점하고 있는 형태Deadlock Prevention : 데드락 발생 조건 중 하나를 아예 예방해서 데드락이 발생하지 않게 한다.Deadlock Avoidance : 프로세스의 자원 요청에 대한 정보를 미리 얻었다고 가정하고, 데드락 발생 가능성이 있으면 자원을 할당하지 않는 방법이다. (최악의 상황을 가정한다.)Deadlock Detection And Recovery: 데드락을 허용하되, 데드락을 검사하고 데드락시 복구하는 알고리즘을 설정한다.Deadlock Ignorance : 데드락을 허용하고, 아무일도 하지 않는다."데드락을 허용하고, 아무일도 하지 않는다."는 무책임해보일 수도 있지만 Linux, Windows등 현대 OS에서 채택하고 있는 방법이다. 데드락이 일어날 확률이 드물기에 데드락에 대응하는 것이 오히려 더 큰 오버헤드를 가져오기 때문이다. 단, 사용자가 데드락을 감지하면 직접 프로세스를 종료할 수 있게 수작업할 수 있는 기능을 반드시 제공해야한다.
상호배제 금지 : 불가능~~~ 상호배제를 무조건 충족해야하는 자원들은 어찌하란 말이냐~점유하며 대기 금지비선점 금지순환 대기 금지사실상 순환 대기 금지 외에 세 가지 방법들은 자원 이용률, 성능이 저하되기 때문에 잘 사용되지 않는다고 한다?
순환 대기 금지도 완벽한 방법이 아니다? 순서가 동적으로 할당되면 데드락이 발생 가능하다?
주기적으로 데드락 탐지 알고리즘을 돌리고, 데드락이 감지되면 복구하는 방법이다.
보통 주기를 어떻게 설정하는데? 시간단위로 하거나, CPU Utilization이 40%이하일 때 등등...
Single Instance 일 때 사용할 수 있는 방법 (Single Instance : 자원의 개수가 하나씩만 주어졌을 때)
위와 같이 프로세스에게 할당된 자원과, 프로세스의 자원 요청을 그래프로 나타낸다. P가 R을 요청했을 때 P ⇢ R 을 포함하여 간선간에 사이클이 생기면, 데드락 발생 가능성이 있으므로 해당 프로세스에게 자원을 할당해주지 않는다.
사이클이 생겼을 때,

시간복잡도 : O(n^2) 간선의 최대 개수는 n(n-1)이기 때문
각 프로세스들이 실행될 동안 보유할 수 있는 자원의 최대치를 알고있다고 가정한다.
Allocation: 프로세스가 현재 보유중인 자원 개수Max: Available : 사용 가능한 자원 개수Need: 프로세스가 앞으로 보유할 수 있는 최대치 자원 개수(Max - Allocation)위 정보를 가지고, 자원을 할당할 수 있는 프로세스를 선택한다.
Available - Need >= 0 이라면 해당 프로세스에게 자원을 할당한다.위 규칙에 따를 때, 모든 프로세스에게 자원을 할당할 수 있는 safe sequence가 생긴다면 데드락에서 안전하다고 판단하고 프로세스에게 자원을 할당한다.
시간 복잡도 : O(R P^2)
P들을 모두 할당해줘야 함(P) 각 P들이 전부 safe한가? 테스트 필요(R P) = O(R P^2)

Deadlock Detection 방법은 Deadlock Avoidance에서 사용한 자원 할당 그래프와 Banker's 알고리즘을 동일하게 활용한다.
어떤 순으로 방출할까?
우선순위, 해당 프로세스가 진행된 시간, 종료까지 남은 시간, 몇 개의 자원을 추가적으로 얻으면 프로세스를 끝낼 수 있는지 등을 고려할 수 있다... 응용 개발자 마음대로~
Starvation 문제가 생길수도 있다.