iOS의 중요한 개념 중 하나인 GCD!! GCD가 뭘까요?
GCD는 Grand Central Dispatch 의 줄임말입니다. GCD에 대해 자세하게 알아보기 전에 왜 GCD가 나오게 됐는지, 그 배경부터 살펴보겠습니다.
멀티 코어 프로세서에서는 프로그램의 동작을 멀티 프로세서에게 어떻게 잘 배분하는지가 중요합니다. GCD 이전에는 멀티 스레딩을 위해 Thread와 OperationQueue 등의 클래스를 사용했다고 하는데요, Thread는 복잡할 뿐만 아니라 임계 구역 (Critical Section) 등을 이용한 Lock을 관리하기 까다로웠습니다. 그리고 OperationQueue는 GCD에 비해 무겁고 Boilerplate Code들이 많이 필요한 문제가 있었죠.
그래서 Apple은 GCD를 내놓았습니다. GCD는 멀티 코어 프로세서 시스템에 대한 응용 프로그램 지원을 최적화하기 위해 Apple에서 개발한 기술로, 스레드 관리와 실행에 대한 책임을 애플리케이션 레벨에서 운영체제 레벨로 넘겨버립니다. GCD의 작업단위는 Block(Swift에서는 클로져)라고 불리며, DispatchQueue가 이 Block들을 관리합니다.
GCD는 각 애플리케이션에서 생성된 DispatchQueue를 읽는 멀티코어 실행엔진을 가지고 있는데요, 이것이 Queue에 등록된 각 작업들을 꺼내서 스레드에 할당합니다. 그렇기 때문에 개발자는 내부 동작을 자세히 알 필요없이 Queue에 작업을 넘기기만 하면 되어서, Thread를 직접 생성하고 관리하는 것에 비해 관리도 용이하고 성능 면에서도 좋은 결과를 얻을 수 있습니다.
그럼 지금까지 말한 GCD의 특징을 정리해보겠습니다.
- GCD는 앱이 Block 객체 형태로 작업을 전송할 수 있는 FIFO 대기열(Queue)을 제공하고 관리합니다.
- Queue에 전달된 작업은 시스템이 전적으로 관리하는 스레드 풀 (a pool of threads) 에서 실행됩니다.
- DispatchQueue는 2개의 타입 (Serial / Concurrent)으로 구분됩니다.
- 앱을 실행하면 시스템이 자동으로 메인 스레드 위에서 동작하는 Main Queue (Serial Queue) 를 만들어서 작업을 수행하고, 그 외에 추가적으로 여러 개의 Global Queue (Concurrent Queue) 를 만들어서 큐를 관리합니다.
- Serial Queue : 큐에 추가된 순서대로 한 번에 하나의 task를 수행합니다.
- Concurrent Queue : 동시에 하나 이상의 task를 실행하지만, task는 큐에 추가된 순서대로 시작됩니다.
- 각 작업은 동기(sync) 방식과 비동기(aync) 방식으로 실행 가능하지만, Main Queue 에서는 async만 사용 가능합니다.
여기서 주의할 점은 Main Queue를 sync 메서드로 동작시키면 데드락 상태에 빠집니다. 그리고 Global Queue의 경우, Qos 클래스를 지정해서 우선순위 설정이 가능합니다.
Qos의 종류는 뭐가 있을까요?
먼저 Qos (Quality of service) 클래스는 총 6개의 종류가 있는데, 그 중 4개가 주로 사용되고 나머지 2개는 특수 유형으로 구분할 수 있습니다. 시스템은 이 Qos 정보를 통해서 스케쥴링, CPU 및 I/O 처리량, 타이머 대기 시간 등의 우선 순위를 조정할 수 있어요.
우선순위는 다음과 같습니다.
(낮음) unspecified < background < utility < default < userInitiated < userInteractive (높음)
- User Interactive
- 즉각 반응해야 하는 작업으로, 반응성과 성능에 중점을 둡니다.
- Main Thread 에서 동작하는 인터페이스 새로고침, 애니메이션 작업 등 즉각 수행되는 user와의 상호작용 작업에 할당합니다.
- User Initiated
- 몇 초 이내의 짧은 시간 내 수행해야 하는 작업으로, 반응성 및 성능에 중점을 둡니다.
- 문서를 열거나, 버튼을 클릭하여 액션을 수행하는 것처럼 빠른 결과를 요구하는 user와의 상호작용 작업에 할당합니다.
- Utility
- 수초에서 수분에 걸쳐 오랜시간 수행되는 작업으로 반응성, 성능, 그리고 에너지 효율성 간에 균형을 유지하는 데에 중점을 둡니다.
- background에서 동작하며 색인 생성, 동기화, 백업 등과 같이 user가 볼 수 없는 작업에 할당합니다.
- 주의 : 저전력 모드에서는 네트워킹을 포함하여 background 작업은 일시 중지합니다.
- Default
- Qos를 별도로 지정하지 않으면 기본값으로 사용되는 형태이며, GCD global queue의 기본 동작 형태입니다.
- Unspecified
- Qos 정보가 없으므로 시스템이 Qos를 추론해야 한다는 것을 의미합니다.
정리를 하자면..
GCD는 앱에서 어떠한 작업을 비동기적으로 동시에 수행할 수 있는 손쉬운 방법입니다. GCD는 2가지 타입이 있는데, Serial Queue와 Concurrent Queue가 있습니다. Serial Queue는 큐에 추가된 순서대로 한 번에 하나의 작업을 수행하고, Concurrent Queue는 동시에 하나 이상의 작업을 수행할 수 있도록 합니다. 보통 UI와 관련된 작업을 할 때에는 메인 스레드 위에서 동작하는 Serial Queue인 Main Queue에서 작업을 수행합니다. 그 외에 추가적으로 Concurrent Queue인 Global Queue를 여러 개 만들어서 UI와 관련되지 않은 다른 작업들을 비동기 방식으로 수행할 수 있도록 합니다. 그리고 Global Queue는 Qos를 지정해서 우선순위 설정하는 것도 가능합니다.
참고자료
'iOS > iOS' 카테고리의 다른 글
첫 테스트코드를 작성해보다. (0) | 2021.04.14 |
---|---|
키체인 (Key Chain) (0) | 2021.04.13 |
XCTest tips and tricks that can level up your Swift testing (0) | 2021.03.03 |
Frame과 Bounds (0) | 2021.02.26 |
Data Binding in MVVM on iOS (2) | 2021.01.07 |
댓글