💻

Deadlock

joho2022 2025. 3. 2. 23:32

교착상태

 

 

 

Deadlock

둘 이상의 스레드가 서로의 작업을 기다리다가 영원히 멈춰버리는 상황을 말한다.

= 무한 대기 상태, 한국어로 교착상태 표현한다.

 

 

GCD와 Dispatch Queue의 관계

GCD는 멀티코어 시스템에서 동시성을 쉽게 다룰 수 있도록 제공하는 iOS 기술

스레드를 직접 관리하지 않고, 시스템이 최적의 방식으로 스레드를 배정해준다.

 

개발자는 Dispatch Queue에 작업을 등록하기만 하면, GCD가 알아서 스레드 배정해줌.

 

정리하면

GCD는 동시성 프로그래밍을 지원하는 기술

Dispatch Queue는 이를 구현한 API

 

 

Dispatch Queue 종류

Main Queue

- 메인 스레드에서 실행되는 큐

- 단 하나만 존재, Serial 큐 특성을 가짐

- 작업이 등록된 순서대로 실행된다

 

 

Global Queue

- 메인 스레드가 아닌 다른 스레드에서 작업을 수행하는 큐

- Concurrent (동시) 특성 가짐 

- 항상 같은 순서로 실행되지 않음

 

 

Custom Queue

- 직접 생성할 수 있는 큐

- 기본적으로 Serial 큐로 생성, concurrent로 설정 가능

 


Queue?

큐는 Task를 담고 있다가 스레드에게 넘겨준다.

즉, 큐 자체는 일을 하지않고, 작업을 실행할 스레드를 배정하는 역할

 

Thread?

실제 작업을 실행하는 단위

메인 스레드와 백그라운드 스레드가 존재

 

스레드를 직접 생성할 수 있지만,

GCD의 DispatchQueue를 사용하면, 시스템이 알아서 스레드를 배정해준다.

 

 

Serial Queue 직렬

- 큐에 쌓인 작업들을 하나의 스레드에 몰아넣음

- 한 번에 하나의 작업만 실행

- 먼저 등록된 작업이 끝나야, 다음 작업이 실행된다

- 실행 순서가 보장

 

 

Concurrent Queue 병렬

- 큐에 쌓인 작업들을 여러 개의 스레드에 나눠서 처리함

- 여러 개의 작업을 동시에 실행 가능.

- 등록된 작업이 끝나지 않아도 다른 작업 실행 가능

- 실행 순서가 일정하지 않음

 

 


 

Sync와 Async

결국 동기와 비동기는 위에 설명한 큐에 작업을 넣는 주체 

-> 작업이 끝날 때까지 기다리는지 여부를 결정

 

sync -> 작업을 큐에 넣고 끝날 때까지 기다렸다가 다음 코드 실행

async -> 작업을 큐에 넣고 기다리지 않고 바로 다음 코드 실행

 

 

Sync & Async + Serial & Concurrent 조합

정리하면

Sync/Async - 작업에 큐에 넣은 후 기다리는지 여부

Serial/Concurrent - 큐가 작업을 처리하는 방식

 

Sync + Serial 

큐에 작업을 넣으면 끝날 때까지 기다렸다가 다음 작업 실행한다

 

Async + Serial 

큐에 작업을 계속 넣고 기다리지 않지만, 작업 수행은 순차적이다

 

Sync + Concurrent

동시 큐이지만, Sync라서 하나씩 기다리면서 수행

 

--

 

Async + Concurrent

작업을 여러 개 동시에 실행

결국 해당 조합만 실행 순서가 보장되지 않음

 


 

그래서 Deadlock이 발생하는 경우

데드락 발생하는 것을 알기 위해 앞에 내용을 살펴보고 정리했다.

데드락 발생 예시는

 

1. 메인 큐에서 Sync를 사용하는 경우

2. 같은 큐에서 Sync를 사용하는 경우

두 가지를 살펴볼 수 있다.

 

1번 같은 경우에는 

결국 Sync와 Serial의 조합이 문제가 있는게 아니라

주의해서 볼 것은 메인 큐에서 Sync를 사용하는 것이다.

 

메인 큐는 UI 업데이트를 담당하는 Serial 큐 이다.

Sync를 호출하면 메인 큐가 자신을 기다리게 되면서 데드락이 발생한다.

 

 

2번 경우도 비슷하게

실행 중인 큐에 Sync를 호출하면, 해당 작업이 끝날 때까지 큐가 대기한다.

그러나 실행 중인 큐가 자기 자신이므로, 데드락이 발생한다.

 


핵심요약하면

Deadlock 교착상태는

둘 이상의 스레드가 서로의 작업을 기다리면서 무한 대기 상태를 말함!!

 

Deadlock 발생하는 경우는

메인큐, 같은 큐에서 Sync를 실행했을 때이다 - 자기 자신을 기다리면서 데드락이 발생함