728x90
GCD는 동시 작업을 관리하기 위한 저수준 API다. 계산 비용이 많이 드는 작업을 백그라운드에서 실행시키고 앱의 응답성을 개선하는데 도움이 된다.
GCD는 내부적으로 공유 스레드풀을 관리한다.
GCD를 사용하면 코드블럭이나 Task 항목을 디스패치 큐에 추가하고 GCD는 이를 실행할 스레드를 결정한다. GCD는 시스템 및 사용 가능한 시스템 리소스에 따라 필요한 병렬 처리량을 결정한다.
대기열 이해
GCD는 디스패치큐 에서 작동한다. 이 대기열은 작업단위를 제출하면 FIFO 순서로 실행한다.
디스패치큐는 스레드로부터 안전하므로 여러 스레드에서 동시에 액세스할 수 있다.
대기열(큐)은 직렬과 동시가 있다.
직렬큐는 주어진 시간에 하나의 작업만 실행되도록 보장하며, 한 작업이 끝나고 다음 작업이 시작되기까지의 시간을 알 수 없다.
동시큐는 여러 작업을 동시에 실행할 수 있다큐는 작업을 추가한 수서대로 시작하도록만 보장한다. 작업의 완료는 어떤것이 먼저 끝날지 알 수 없다.
언제 작업을 시작할지 결정하는것은 전적으로 GCD에 달려 있다. 중요! 한 작업이 실행시간이 다른 작업과 겹치면 다른 코어에서 실행해야 할지, 또는 대신 컨텍스트 전환을 수행하여 다른 작업을 실행해야 할지 결정하는것은 GCD가 한다.
큐의 타입
GCD는 세 가지 유형의 대기열을 제공한다.
- 메인큐 : 메인 스레드에서 싦행되며 직렬큐이다.
- 글로벌 큐 : 전체 시스템에서 공유하는 동시 대기열. 4개의 대기열이 존재하며 각 각 우선순위가 있다(QoS). 백그라운드 우선순위 대기열은 가장 낮은 우선 순위를 가지며 부정적인 시스템의 영향을 최소화하기 위해 모든 I/O활동에서 조절된다. 백그라운드에서 비 UI 작업을 수행하기 위한 일반적인 선택입니다.
- 사용자 지정 대기열 : 지렬 또는 동시가 될 수 있는 대기열. 백그라운드 작업을 직렬로 수행하고 추적하려는 경우에 좋은 선택입니다. 이렇게 하면 한 번에 하나의 작업만 실행되기 때문에 리소스 경합 및 경쟁 조건이 제거됩니다. 메소드의 데이터가 필요한 경우 이를 검색하거나 사용을 고려하기 위해 다른 클로저를 선언해야 합니다
글로벌 큐를 작업에 보낼때 우선순위를 직접 지정하지 않는다. 대신 QoS클래스를 속성으로 지정한다.
QoS는 다음과 같다.
- User-interactive : 좋은 사용자 경험을 제공하기 위해 즉시 완료해야 하는 작업을 나타냅니다. 짧은 대기 시간이 필요한 UI 업데이트, 이벤트 처리 및 소규모 워크로드에 사용합니다. 앱을 실행하는 동안 이 클래스에서 수행된 총 작업량은 작아야 합니다. 이것은 메인 스레드에서 실행되어야 합니다.
- UserInitiated : 사용자는 UI에서 이러한 비동기 작업을 시작합니다. 사용자가 즉각적인 결과와 사용자 상호 작용을 계속하는 데 필요한 작업을 기다리고 있을 때 사용합니다. 우선 순위가 높은 전역 대기열에서 실행됩니다.
- Utility: 일반적으로 사용자가 볼 수 있는 진행률 표시기가 있는 장기 실행 작업을 나타냅니다. 계산, I/O, 네트워킹, 연속 데이터 피드 및 유사한 작업에 사용합니다. 이 클래스는 에너지 효율적으로 설계되었습니다. 이것은 우선 순위가 낮은 전역 대기열에 매핑됩니다.
- Background : 사용자가 직접적으로 인식하지 못하는 작업을 나타냅니다. 사용자 상호 작용이 필요하지 않고 시간에 민감하지 않은 프리페치, 유지 관리 및 기타 작업에 사용합니다. 이것은 배경 우선 순위 전역 대기열에 매핑됩니다.
728x90
'난 iOS개발자 > iOS' 카테고리의 다른 글
HomeBrew설치 그리고 실패 (0) | 2022.06.20 |
---|---|
COW(Copy On Write) (0) | 2022.05.28 |
NSCache (0) | 2022.05.07 |
ARC(Auto Reference Counting) (0) | 2022.05.05 |
String을 Subscript로 접근할 수 없는 이유 (0) | 2022.05.04 |