GCD를 이용한
iOS 멀티스레딩 프로그래밍
Apple Developer 공식 문서를 살펴보며
iOS에서 GCD를 이용한 멀티스레딩 프로그래밍 방법을 알아보자
목차
- 멀티 스레드란?
- GCD는 무엇?
- DispatchQueue란?
- Serial VS Concurrent
- DispatchQueue의 종류 - Main, Global, Custom
- qos
- Sync VS Async
멀티 스레드(Multi Thread)란?
멀티 스레드는 하나의 프로세스 내에서 여러 스레드가 동시에 작업을 수행하는 것
하나의 프로세스 내에서 여러 개의 스레드가 존재하고
스레드들이 프로세스의 자원을 공유하되 실행은 독립적으로 이루어지는 구조
GCD(Grand Central Dispatch)란?
GCD는 Grand Central Dispatch의 약자로
먼저 애플 공식 문서에는 GCD에 대해 이렇게 설명한다
https://developer.apple.com/documentation/DISPATCH
Dispatch, also known as Grand Central Dispatch (GCD), contains language features, runtime libraries, and system enhancements that provide systemic, comprehensive improvements to the support for concurrent code execution on multicore hardware in macOS, iOS, watchOS, and tvOS.
위 글을 해석하면
GCD(Grand Central Dispatch)라고도 알려진 Dispatch에는 macOS, iOS, watchOS 및 tvOS의 멀티코어 하드웨어에 대한
동시 코드 실행 지원에 대한 체계적이고 포괄적인 개선 사항을 제공하는 언어 기능, 런타임 라이브러리 및 시스템 개선 사항이 포함되어 있습니다.
한마디로 GCD는 Apple 의 다중 스레드 프로그래밍 기술이다
GCD의 개념으로 동시성 프로그래밍을 지원하는 Swift의 API가 DispatchQueue이다!
DispatchQueue란?
Dispatch: 보내다, Queue: 대기열
둘을 합치면? DispatchQueue: 대기열에 보내다
애플 개발자 공식문서에서 DispatchQueue에 대해 설명을 보자
https://developer.apple.com/documentation/dispatch/dispatchqueue
Dispatch queues are FIFO queues to which your application can submit tasks in the form of block objects. Dispatch queues execute tasks either serially or concurrently. Work submitted to dispatch queues executes on a pool of threads managed by the system. Except for the dispatch queue representing your app's main thread, the system makes no guarantees about which thread it uses to execute a task.
위 글을 해석하면
Dispatch queues는 애플리케이션이 블록 객체 형태로 작업을 제출할 수 있는 FIFO Queues입니다.
Dispatch queues는 작업을 순차적으로 또는 동시에 실행합니다.
Dispatch queues에 제출된 작업은 시스템에서 관리하는 스레드 풀에서 실행됩니다.
앱의 메인 스레드를 나타내는 디스패치 큐를 제외하고 시스템은 작업을 실행하는 데 어떤 스레드를 사용하는지 보장하지 않습니다.
한마디로
DispatchQueue는 GCD API에서 Thread 관리하는 Class이다
DispatchQueue 종류는 SerialQueue와 ConcurrentQueue 두종류이다
SerialQueue VS ConcurrentQueue
DispatchQueue는 SerialQueue, ConcurrentQueue 두 가지로 나뉜다
Serial, Concurrnet 그게 뭐야? 🤔
Serial: 직렬의, Concurrent: 동시의
SerialQueue: 직렬큐로 이전 작업이 끝나면 다음 작업을 순차적으로 실행하는 큐
ConcurrentQueue: 동시큐로 이전 작업이 끝날 때까지 기다리지 않고 병렬 형태로 동시에 실행하는 큐
그럼 직렬큐와 동시큐의 차이는 뭔데?
SerialQueue | ConcurrentQueue |
이전 작업이 끝나면 다음 작업을 순차적으로 실행하는 직렬 형태의 큐 | 이전 작업이 끝날때 까지 기다리지 않고 병렬 형태로 동시에 실행하는 큐 |
분산처리 시킨 작업을 다른 한개의 쓰레드에서 처리하는 큐 | 분산처리 시킨 작업을 다른 여러개의 쓰레드에서 처리하는 큐 |
한 번에 하나의 작업만 수행 | 동시에 여러 작업을 수행 |
DispatchQueue의 종류 - Main, Global, Custom
DispatchQueue는 세 가지 종류(Main, Global, Custom)가 있다
Main Queue
- Main Queue는 Main Thread에서 실행되는 DispatchQueue
- UI 작업을 하는 코드는 메인 스레드에서 실행
- Serial Queue의 특성을 가져 단일 스레드
Global Queue
- Global Queue는 Main Thread가 아닌 Thread에서 실행되는 DispatchQueue
- QoS(Quality of Service) 설정 가능
- Concurrent 특성을 가진 Queue
QoS는 아래에서 더 자세히 알아보자
Custom Queue
- Custom으로 생성하는 Queue
- 기본은 Serial이지만 Concurrent로 설정 가능
- QoS(Quality of Service) 설정 가능
- 매개변수에는 label, qos, attributes가 존재
QoS (Quality of Service)
QoS는 Quality of Service의 약자로 Concurrent 하게 작업을 처리하면서 작업의 우선순위를 지정하기 위해 사용한다
우선 순위 | 이름 | 설명 |
1 | userInteractive | 사용자와 직접 상호작용하는 작업 ex)UI 업데이트, 에니메이션 |
2 | userInitiated | 사용자가 시작한 작업 ex)저장된 문서 열기 |
3 | default | 일반적인 작업 |
4 | utility | 사용자가 의도하였지만, 지속적으로 관찰하진 않는 작업 ex)progress bar |
5 | background | 백그라운드에서 실행되는 작업 ex)동기화, 백업, Network작업 |
6 | unspecified | QoS 정보가 없음 |
Sync VS Async
Sync(동기)
- 현재 스레드에서 작업이 완료될 때까지 대기하며, 작업이 완료될 때까지 다음 코드가 실행되지 않는다
- 현재의 Queue는 block상태가 되며 그 작업이 끝날 때까지 기다려야 한다
❗️❗️❗️ 주의 ❗️❗️❗️
Sync 작업은 메인 스레드에서 주의해서 사용해야 한다
메인 스레드에서 Sync 작업을 실행하면 UI가 응답하지 않게 되어 데드락을 유발할 수 있다
Async(비동기)
- Async는 작업을 현재 스레드와 별개의 다른 스레드에서 실행
- Async 작업은 작업을 큐에 추가한 후에 즉시 다음 코드를 실행하며, 작업이 완료될 때까지 기다리지 않는다
- 주로 메인 스레드를 차단하지 않고 비동기 작업을 수행할 때 사용한다. 주로 네트워크 호출, 파일 다운로드, 계산량이 많은 작업 등을 처리할 때 사용
👇👇👇 Async와 Sync에 대한 자세한 포스팅 👇👇👇
https://ohwhatisthis.tistory.com/24
'iOS Swift > iOS Swift - 기초' 카테고리의 다른 글
[iOS] Swift XCFramework 생성 후 Objective-C에서 적용 (0) | 2024.05.02 |
---|---|
[iOS/Swift] Async Sync 비동기 동기 처리 개념 예제 (2) | 2023.05.20 |
[iOS/Swift] 달력 UICalendarView Custom 예제 programmatically (0) | 2023.05.08 |
[iOS/Swift] URLSession Task 네트워크 api 통신 (0) | 2023.02.28 |