GCD
- Grand Central Dispatch(GCD)
- 예전에는 프로세서의 클럭 속도를 높이는 방식으로 연산 속도를 높였지만 전력 소비와 프로세서의 클럭 속도 증가에 한계가 있어 멀티 코어 프로세싱이 탄생하게 되었고 이러한 프로세싱에서는 멀티 프로세스에게 어떻게 프로그램의 동작을 배분하는지 중요해졌다.
- GCD 이전에는 멀티 스레딩을 위해 Thread와 OperationQueue 등의 클래스를 사용했지만, 스레드는 이런 저런 이유로 복잡하고 관리하기가 까다롭고, OperationQueue는 GCD에 비해 무겁고 BoilerPlate 코드들이 많이 필요했다.
- GCD는 애플에서 개발한 기술로 스레드 관리와 실행에 대한 책임을 어플리케이션 레벨에서 운영체제 레벨로 전가시켰다. 작업단위는 Block(스위프트에서는 클로저 표현식)이라 불리며, DispatchQueue가 이 블록들을 관리한다.
- 애플 공식 문서에서도 Thread 클래스 대신 GCD 사용을 권장하고 있다!
DispatchQueue
- GCD는 앱이 블록 객체 형태로 작업을 전송할 수 있는 FIFO 대기열 (Queue)를 제공하고 관리한다.
- 큐에 전달된 작업은 시스템이 관리하는 스레드 풀에서 실행된다.
- DispatchQueue는 2개 타입으로 구분되는데 모두 FIFO로 처리된다. (Serial(직렬)/ Concurrent(동시))
동시성 프로그래밍은 논리적인 용어로 동시에 실행되는 것'처럼' 보이는 것이고 실제로 완전히 동시에 실행되는 것은 아니다. 동시성을 이용한 싱글 코어의 멀티 태스킹은 각 스레드들이 병렬적으로 실행되는 것처럼 보이지만 사실은 적절히 서로 번갈아 가면서 실행되고 있는 방식이다. 이와 달리 병렬성 프로그래밍은 정말로 동시에 실행된다. 잘 구분할 것. 이에 대해서 부스트코스에서 좋은 예시를 주었는데 은행에서 은행원 1명이 N개의 대기열을 상대하는 것은 동시성 프로그래밍, N명 은행원이 N개 대기열을 상대하는 것은 병렬성 프로그래밍이다.
그러므로 동시성은 싱글, 멀티 코어 환경에서 모두 가능하지만, 병렬성은 반드시 멀티코어 환경에서만 가능하다. 은행원이 작업 수만큼 필요하기 때문에.
- 앱을 실행하면 시스템이 자동으로 메인스레드 위에서 동작하는 Main 큐(시리얼)를 만들어서 작업을 수행하고 그 외에 추가적으로 여러 개의 Global 큐(Concurrent Queue)를 만들어서 큐를 관리한다.
- 각 작업은 동기 또는 비동기 방식으로 실행가능하지만 Main 큐에서는 반드시 비동기만 사용해야 한다. 안그러면 다른 거 처리하던거 다 멈춰서 데드락? 이라는 현상이 걸린다고 한다...
- DispatchQueue가 제공하는 Queue는 Main, Global 두가지가 있다.
main
- UI와 관련된 작업은 모두 main 큐를 통해서 작업해야 하며, Serial Queue에 해당한다.
- MainQueue를 sync메서드로 동작시키면 데드락 상태에 빠지므로 반드시! async로 사용해야 한다.
DispatchQueue.main.async { }
global
- UI를 제외한 작업에서 사용하며 Concurrent Queue에 해당한다.
- sync, async 모두 사용가능.
- QoS 클래스를 지정해서 우선순위 설정이 가능하다.
- 우선순위가 높을 수록 더 빨리 수행되고 더 많은 전력을 소모하는데 적절한 QoS를 지정해야 효율적인 작업이 된다.
- User Interactive: 즉각 반응해야 하고 메인 스레드에서 동작하는 인터페이스 새로고침, 애니메이션 작업 등 즉각 수행되는 유저와의 상호작용 작업에 할당.
- User initiated: 몇 초이내의 짧은 시간 내 수행해야 하는 작업으로 반응성 및 성능에 초점, 문서 열거나 버튼을 클릭해서 액션을 수행하는 것 처럼 빠른 결과를 요구하는 유저와의 상호작용 작업
- Utility: 수초에서 수분에 걸쳐 수행된느 작업으로 반응성, 성능, 에너지 효율성 간에 균형, NSOperation 클래스 사용 시 기본 값임
- default: 기본 값, User initiated와 Utility의 중간 정도
- Unspecified: 시스템이 QoS를 판단하도록 지정.
DispatchQueue.global().async { }
출처: 네이버 부스트코스, https://jinshine.github.io/2018/07/09/iOS/GCD(Grand%20Central%20Dispatch)/ 두 군데 참고