Deadlock
Deadlock 이란, 프로세스가 자원을 얻지 못하여 다음 처리를 하지 못하는 상황을 의미합니다. 즉, 한정된 자원을 여러 곳에서 사용하려고 할 때, 자원을 얻지 못해 다음 처리를 하지 못해 멈춰버리는 상태입니다.
Deadlock이 일어나는 경우는 다음과 같습니다.
Main Thread에서 sync로 호출하는 경우
위 코드는 Main Queue로 Task1을 보내는 것을 의미합니다. 이 때, Main Queue는 직렬 큐이기 때문에, Task1을 하나의 동일한 쓰레드인 Main Thread로 할당하게 됩니다. sync는 해당 Task가 끝날 때까지 해당 쓰레드는 더 이상 작업을 진행하지 않는 것을 의미합니다.
즉, 다음과 같은 플로우로 진행됩니다.
1. 메인 쓰레드에서 Task1이 종료될 때까지 기다리며, Task1을 Main Queue에 할당 (sync)2. Main Queue의 Task1는 메인 쓰레드로 할당 (직렬큐)3. 이 때, 현 상황에서 메인 쓰레드는 Task1이 종료될 때까지 기다리고 있는 상태4. 아무것도 진행되지 못하는 데드락이 발생
현재와 같은 Queue에 sync하게 작업을 보내는 경우
정의된 큐는 Serial Queue 입니다. 해당 큐의 1번 블럭에 있는 Task 1~5가 실행되고, 이후 2번 블럭의 Task 6가 실행될 차례입니다. 이 때, 2번 블럭의 Task 6는 1번 블럭과 같은 Queue에서 동작되도록 구현되어 있습니다. 하지만 현재 진행되고 있는 Queue는 직렬 큐라, 현재 진행 중인 1번 블럭이 끝날 때까지 다음 블럭을 실행할 수 없는 상태입니다. 실행하고자 하는 2번 블럭은 현재 실행 중인 1번 블럭 내부에 속해 있고, 결국 1번 블럭은 끝나지 못하고 계속 멈춰있는 Deadlock 상태에 걸리게 됩니다.