TIL
🌱 난 오늘 무엇을 공부했을까?
- 시스템에서 관리하는 디스패치 대기열에 작업을 제출하여 멀티코어 하드웨어에서 동시에 코드를 실행합니다.
Overview
- GCD(Grand Central Dispatch)라고도 하는 Dispatch에는 macOS, iOS, watchOS 및 tvOS의 멀티코어 하드웨어에서 동시 코드 실행 지원에 대한 체계적이고 포괄적인 개선 사항을 제공하는 언어 기능, 런타임 라이브러리 및 시스템 개선 사항이 포함되어 있습니다.
- BSD 하위 시스템, Core Foundation 및 Cocoa API는 모두 이러한 개선 사항을 사용하도록 확장되어 시스템과 애플리케이션이 모두 더 빠르고 효율적이며 향상된 응답성을 제공하도록 지원합니다.
- 단일 응용 프로그램이 여러 개의 코어를 효과적으로 사용하는 것이 얼마나 어려운지 생각해 보십시오. 컴퓨팅 코어 수가 다른 여러 컴퓨터에서 또는 이러한 코어를 놓고 경쟁하는 여러 응용 프로그램이 있는 환경에서 수행하는 것은 고사합니다.
- 시스템 수준에서 작동하는 GCD는 실행 중인 모든 응용 프로그램의 요구 사항을 더 잘 수용하여 균형 잡힌 방식으로 사용 가능한 시스템 리소스와 일치시킵니다.
- 앱의 메인 스레드나 백그라운드 스레드에서 순차적으로 또는 동시에 실행되는 작업을 관리하는 개체입니다.
📍 Declaration
class DispatchQueue : DispatchObject
📍 Overview
- 디스패치 큐는 애플리케이션이 블록 객체 형태로 작업을 제출할 수 있는 FIFO 큐입니다.
- 디스패치 큐는 작업을 순차적으로 또는 동시에 실행합니다.
- 디스패치 큐에 제출된 작업은 시스템에서 관리하는 스레드 풀에서 실행됩니다.
앱의 기본 스레드를 나타내는 디스패치 큐를 제외하고 시스템은 작업을 실행하는 데 사용하는 스레드를 보장하지 않습니다.
- 작업 항목을 동기식 또는 비동기식으로 예약합니다.
작업 항목을 동기적으로 예약하면 해당 항목의 실행이 완료될 때까지 코드가 기다립니다.
작업 항목을 비동기식으로 예약하면 작업 항목이 다른 곳에서 실행되는 동안 코드가 계속 실행됩니다.
Important
main queue에서 작업 항목을 동기적으로 실행하려고 하면 교착 상태가 발생합니다.
📍 Avoiding Excessive Thread Creation
동시 실행을 위한 작업을 설계할 때 현재 실행 스레드를 차단하는 메서드를 호출하지 마십시오.
- 동시 디스패치 대기열에 의해 예약된 작업이 스레드를 차단하면 시스템은 대기열에 있는 다른 동시 작업을 실행하기 위해 추가 스레드를 생성합니다.
- 너무 많은 작업이 차단되면 시스템에서 앱의 스레드가 부족해질 수 있습니다.
- 앱이 너무 많은 스레드를 사용하는 또 다른 방법은 너무 많은 개인 동시 디스패치 큐를 만드는 것입니다.
- 각 디스패치 큐는 스레드 리소스를 소비하기 때문에 추가 동시 디스패치 큐를 생성하면 스레드 소비 문제가 악화됩니다.
- 개인 동시 대기열을 만드는 대신 전역 동시 디스패치 대기열 중 하나에 작업을 제출하십시오.
- 직렬 작업의 경우 직렬 대기열의 대상을 전역 동시 대기열 중 하나로 설정합니다.
- 그렇게 하면 스레드를 생성하는 개별 큐의 수를 최소화하면서 큐의 직렬화된 동작을 유지할 수 있습니다.
📍 Memory Management for Dispatch Queues
- 디스패치 큐 및 기타 디스패치 객체는 참조 카운트 데이터 유형입니다.
- 직렬 디스패치 대기열을 만들 때 초기 참조 횟수는 1입니다.
- dispatch_retain 및 dispatch_release 함수를 사용하여 필요에 따라 해당 참조 횟수를 늘리거나 줄일 수 있습니다.
- 대기열의 참조 횟수가 0에 도달하면 시스템이 대기열을 비동기적으로 할당 해제합니다.
- 큐와 같은 디스패치 객체를 유지하고 해제하여 사용되는 동안 메모리에 남아 있도록 하는 것이 중요합니다.
- 메모리 관리 Cocoa 객체와 마찬가지로 일반적인 규칙은 코드에 전달된 대기열을 사용하려는 경우 대기열을 사용하기 전에 유지하고 더 이상 필요하지 않을 때 해제해야 한다는 것입니다.
📍 DispatchQoS
🔗 Getting the Quality-of-Service Class
userInteractive -> userInitiated -> default
-> utility -> background -> unspecified