大器晩成
iOS GCD 본문
이전 포스팅에서 iOS는 멀티스레드를 GCD(Grand Central Dispatch)로 처리한다고 했습니다.
GCD는 우리가 Queue에 작업을 보내면 그에 따른 스레드를 적절히 생성해서 분배해 줍니다.
GCD에서 사용하는 Queue의 이름이 Dispatch Queue입니다.
즉, Dispatch Queue에 작업을 추가하면, GCD는 작업에 맞는 스레드를 자동으로 생성해서 실행하고, 작업이 종료되면 스레드를 제거합니다.
Dispatch는 보내다는 뜻을 가지고 있으며, Dispatch Queue는 큐에 보내다의 뜻을 가지고 있습니다.
Dispatch Queue에 들어간 Task들은 GCD를 통해 각 스레드에 자동으로 할당됩니다. (어느 스레드에 무엇이 할당되는지는 알 수 없습니다)
Queue는 일반적으로 다음과 같이 구성되어 있습니다.
- Main Queue
- 오직 한 개만 존재합니다
- Serial 특성을 가집니다.
- 이곳에 할당된 Task는 메인 스레드에서 처리합니다. (UI 업데이트 등) - Global Queue
- Concurrent 특성을 가진 Queue입니다.
- 작업 순서에 대한 우선순위(QoS)를 설정할 수 있습니다 - Custom Queue
- 커스텀으로 만드며, 우선순위(QoS)를 설정 가능합니다
- 기본값은 Serial 특성이며, Concurrent 설정도 가능합니다.
DispatchQueue는 다음과 같이 구성되어 있습니다.
- DispatchQueue.global()
- DispatchQueue.global의 경우 Concurrent Queue가 기본
- 작업(Queue의 Task항목)을 여러 스레드로 나눠 보냄 → 동시(Concurrent) - DispatchQueue.main
- DispatchQueue.main의 경우 Serial Queue가 기본
- 작업을 여러 스레드로 분산하지 않고, 하나의 스레드(메
DispathcQueue는 동기와 비동기를 구분할 수 있으며, 각각 sync, async로 구분합니다.
ex) DispatchQueue.global().async // DispatchQueue.global().sync
실제 코드를 작성하기 전에 용어에 대한 정리를 조금 더 하고 코드를 작성하도록 하겠습니다.
Serial이란, Queue(대기 행렬)에 들어온 작업을 하나의 스레드에만 분산하여 처리하는 방식입니다.
Concurrent란, Queue(대기 행렬)에 들어온 작업을 여러 스레드에 분산하여 처리하는 방식입니다.
Serial, Concurrent(동시)와 함께 synchronous(동기), asynchronous(비동기) 방식이 있습니다.
synchronous는 다음과 같은 특징을 가지고 있습니다.
- 시작한 작업이 완료가 되어야 그다음 작업을 시작할 수 있습니다.
- 한 번에 하나의 작업만 진행하며, 하나의 작업이 끝나기 전까지 다른 작업에 대해서 수행할 수 없습니다.
- 어떤 작업이 수행 중이라면 다음 작업은 대기해야 합니다
- 결과의 순서가 중요한 경우에는 동기 코드로 작성을 해야 합니다.
- 일반적으로 작성하는 코드는 동기방식의 코드입니다.
asynchronous는 다음과 같은 특징을 가지고 있습니다.
- 시작한 작업이 완료되지 않더라도 그다음 작업을 시작합니다.
- 한 번에 여러 작업을 진행할 수 있습니다
- 하나의 작업이 끝나지 않았더라도 다른 작업에 대해서 수행할 수 있습니다
- 작업이 먼저 실행되었다고 해도 끝나는 순서는 정해져 있지 않습니다.
동시에 작업을 할 수 있어서 비동기가 코드 작성에 유리할 수 있어 보이지만, 작업의 순서가 필요한 경우에는 동기작업 이후에 비동기 작업을 처리하는 것이 좋습니다.
ex) 라면을 만들 때, 물을 먼저 넣어야 하는데, 물을 안 넣고 냄비에 라면만 넣으면 라면이 타게 됨.
'iOS > Swift' 카테고리의 다른 글
DI와 DIP (0) | 2025.03.10 |
---|---|
GCD QOS (0) | 2025.01.20 |
iOS- 동시성 프로그래밍 (Concurrent Sync/Async) (0) | 2025.01.20 |
iOS- 동시성 프로그래밍 (Serial Sync/Async) (0) | 2025.01.20 |
iOS GCD - MultiTread (0) | 2025.01.20 |