일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- WWDC
- swift
- CS
- Network
- firebase
- Performance
- dataflow
- arkit
- environmentobjet
- auth
- gesture
- 데이터최적화
- authentication
- realitykit
- withAnimation
- 달력
- stateobject
- combine
- Concurrency
- ar
- 네트워크
- ios
- RxSwift
- SwiftUI
- Animation
- GCD
- state
- fullscreencover
- UIKit
- iphone
- Today
- Total
XLOG
[Swift] GCD 이해하기 본문
GCD ( Grand Central Dispatch )는 다중 코어 프로세서 및 기타 대칭 다중 처리 시스템이 있는 시스템에 대한 응용 프로그램 지원을 최적화하기 위해 Apple Inc.에서 개발한 기술입니다.
이 간단하게 우리의 핸드폰, 컴퓨터는 멀티 프로세스, 멀티 스레드를 지원한다. 자연스럽게 웹과 앱에서도 다중 처리 시스템이 도입되게 된다.
iOS로 설명을 하자면 iOS서는 메인쓰레드를 통해 UI 업데이트를 진행하고 있다. 하지만 UI 를 업데이트를 할때 연산, 데이터 다운로드 등의 네트워킹 작업들이 함께 동반되어야 한다. 하지만 UI 업데이트를 위해 필요한 작업들은 우리 UI의 반응을 멈추게 하면 안된다. 이것은 애플이 강조하는 바이다.
( 참고, Swift 에서는 Thread pool 관리를 운영체제에서 관리 한다)
DispatchQueue 를 통해 thread 를 생성하여 UI 업데이트에 방해가 되는 작업들을 할당하고, Main Thread 는 유저와을 Interaction 을 유지하도록 하는 것이다.
사용법을 알기전에 우선 Queue의 종류와 Task의 종류를 알아야 한다.
Queue는 main queue, global queue, custom queue 가 있으며, Task 는 sync, async 가 있다.
Main queue 는 main thread queue 로 오직 하나이기 때문에 자연스럽게 serial 특성을 갖는다.
Global queue 는 QoS(Quality of Service) 에 따라 종류(우선순위) 가 나뉜다.
1. userInteractive
2. userInitiated
3. default
4. utility
5. background
6. unspecified
Custom Queue의 경우는 말그대로 우리가 우선순위에 따라서 생성한 Queue로 생각하면 된다.
하지만 QoS 가 높다고 하여 무조건 우선적으로 실행이 되는 것은 아니다. 우선 순위 != 실행 순서
그렇다면 Sync, Async 의 차이는 무엇일까?
그것은 작업을 보낸 시점에서 기다릴지, 말지인 것이다. 즉 Async 는 multi thread, Sync 는 Single thread 라고 생각할 수 있다.
메인 스레드에서 sync로 다른 thread에 작업을 할당하게 되면, queue에 넘긴 task 가 끝날때까지 기다리지만, async로 queue에 task를 담는 순가 바로 반환하여 다음 함수작업을 진행하게 된다.
DispatchQueue.main().async() {}
DispatchQueue.global().async() {}
DispatchQueue.global(qos: .utility).async(qos: .utility) {}
위와 같은 예시의 코드들로 우선순위를 설정하여 Task를 queue에 전달할 수 있다.
위에 코드에서 3번째 줄의 경우 queue와 task 의 QoS 가 같지만 다른경우도 존재한다.
만약 QoS of Task > QoS of Queue 라면 Queue의 QoS는 Task의 QoS를 일시적으로 따라 갔다가 Task 가 종류되면 다시 원래의 QoS로 돌아가게 된다.
반대의 경우라면 Task는 Queue의 QoS를 따르게 된다.
적절한 qos를 설정을 하여야지만 사용자가 앱을 사용함에 있어서 불편함을 최소화 시킬 수 있다고 한다.
하지만 우리가 GCD 를 사용하면서 유의할 점이 없는 것은 아니다.
Thread를 과도하게 많이 생성하게 되면 context switching이 많이 발생하고 이는 스케쥴링 오버헤드로 인한 성능저하를 일으킬 수 있다.
또한 잘못 설정하게 되면 멀티 thread에서 동시에 데이터에 접근을 하거나, 각 thread 가 서로의 task 가 끝나기를 기다려야 하는 데드락이 발생할 수 있다.
참고 :
WWDC16 Concurrent Programming With GCD in Swift3
WWDC15 Building Responsive and Efficient Apps with GCD
https://jeong9216.tistory.com/515
'Swift > Etc' 카테고리의 다른 글
SwiftUI VS UIKit 에 대한 고민(SwiftUi를 먼저 접하고 나중에 UIKit을 공부한 사람의 입장.....) (0) | 2023.02.27 |
---|---|
[Swift] Async/await 의 이해 (0) | 2023.02.18 |
[아키텍쳐] MVC VS MVVM 의 간단한 정리 (2) | 2023.02.03 |
[WWDC] Combine in Practice 보고 Combine 이해하기 (0) | 2023.02.02 |
[WWDC19] Introducing Combine (0) | 2023.02.01 |