XLOG

[Swift] GCD 이해하기 본문

Swift/Etc

[Swift] GCD 이해하기

X_PROFIT 2023. 2. 16. 13:27

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