[Swift] GCD(Grand Central Dispatch)

륜재·2022년 10월 20일
0

Swift

목록 보기
2/2
post-thumbnail

1. GCD란 무엇인가?

애플 공식 문서에 따르면,

GCD(Grand Central Dispatch)라고도 알려진, Dispatch는 macOS, iOS, watchOS, tvOS에서 멀티코어 하드웨어에서의 동시 코드 실행을 지원하기 위한 시스템적, 포괄적인 개선사항으로 언어기능, 런타임 라이브러리 및 시스템 개선을 포함한다.

즉, GCD는 Swift에서 멀티스레드를 구현하기 위한 API이고, DispatchQueue로 구현된다.

2. DispatchQueue

애플 공식 문서에 따르면,

DispatchQueue는 앱의 메인 스레드나 백그라운드 스레드에서 순차적으로 또는 동시에 실행되는 작업을 관리하는 개체입니다. DispatchQueue는 애플리케이션이 블록 객체 형태로 작업을 제출할 수 있는 FIFO Queue로, DispatchQueue는 작업을 순차적으로 또는 동시에 실행합니다.

2-1. DispatchQueue의 두가지 특성

DispatchQueue는 작업을 순차적으로 혹은 동시에 실행한다. 이 두가지 상황을 결정하는 특성(attribute)은 .serial과 .concurrent이다.

1) Serial Dispatch Queue

serial 특성을 갖는 DispatchQueue는 등록된 작업을 한 번에 하나씩 처리한다.

순차적으로 하나의 작업이 끝나야 다음 작업을 실행하기 때문에 처리 순서는 실행 순서와 동일하다.

2) Concurrent Dispatch Queue

concurrent 특성을 갖는 DispatchQueue는 동시에 여러개의 작업을 처리할 수 있다.

현재 실행 중인 작업이 끝나지 않아도, 다른 스레드에 다른 작업을 할당하고 실행하기 때문에 처리 순서는 할당된 작업이 끝나는 순서이다. 위 코드의 실행결과는 실행할 때마다 달라진다. 왜냐하면 concurrent특성을 갖는 DispatchQueue는 처리 순서가 할당된 작업이 끝나는 순서이기 때문이다. 예를 들면 실행 결과는

0
1
2
3
4 // serial DispatchQueue
2
3
1
0
4 // concurrent DispatchQueue
0
1
2
3
4 // serial DispatchQueue
0
1
2
3
4 // concurrent DispatchQueue

위와 같이 여러가지가 나올 수 있는 것이다.

2-2. DipatchQueue의 종류

DispatchQueue의 종류는 크게 MainQueue와 GlobalQueue로 나눌 수 있다.

MainQueue는 메인 스레드에서만 작업을 할당하고 수행하는 Queue이기 때문에, serial 특성을 갖는 DispatchQueue이다.

GlobalQueue는 메인 스레드가 아닌 다른 스레드에 작업을 할당하고 수행하기 때문에 concurrent 특성을 갖는 DispatchQueue이다. 위 코드의 수행 결과도 GlobalDispatchQueue에 의해 여러가지 결과가 나올 수 있다.

2-3. DispatchQueue의 QOS(Quality of Service)

GlobalDispatchQueue에서 작업의 중요도를 설정하는 우선순위이다. UserInteractive-UserInitiated-Default-Utility-Background순으로 지정된다.

  1. UserInteractive : 애니메이션, 이벤트 처리 또는 앱의 사용자 인터페이스 업데이트와 같은 사용자 대화형 작업에 대한 QOS
  2. UserInitiated : 사용자가 앱을 active하게 사용하지 못하게 하는 작업에 대한 QOS
  3. Default : 가장 기본값
  4. Utility : 사용자가 active하게 추적하지 않는 작업에 대한 QOS
  5. Background : 유지보수 또는 클린업 작업에 대한 QOS

2-4. DispatchQueue - Sync vs Async

.serial과 .concurrent는 DispatchQueue가 작업을 처리하는 방식의 두가지 특성이라면, 동기(sync)와 비동기(async)는 DispatchQueue에게 넘기는 과정의 두가지 특성이다.

1) Sync - 동기

Queue에 넘긴 작업이 끝나야만 코드를 계속해서 진행하는 것이다.

2) Async - 비동기

Queue에 넘긴 작업이 모두 끝나지 않아도 다음 코드를 계속해서 진행하는 것이다.

이로 인해, 생기는 상황이 있다. MainQueue를 Sync로 선언할 경우, MainQueue에서 메인 스레드에 작업을 할당하지만, 메인스레드는 sync 상태에서 작업이 끝날때까지 작업을 처리하지 않기 때문에 deadlock 상태에 빠지게 된다.


참고자료

  1. Apple Developer Documentation - Swift
    https://developer.apple.com/documentation/dispatch

  2. Blog - 개발하는 훈이, [Swift] GCD(Grand Central Dispatch) - DispatchQueue
    https://jeonyeohun.tistory.com/279#comment13319592

  3. Blog - 서근 개발노트, Swift : 기초문법 [DispatchQueue란?] (GCD : Grand Central Dispatch)
    https://seons-dev.tistory.com/215

0개의 댓글