728x90
공룡책을 보는 중 암묵적 스레드 부분에서 macOS 와 iOS 의 예시로 GCD 가 나와있어 따로 정리했다.
GCD 란
- Grand Central Dispatch 는 macOS 및 iOS 운영체제를 위해 Apple 에서 개발한 기술
- 개발자가 병렬로 실행될 코드 섹션(태스크)을 식별할 수 있도록 하는 runtime library + API + 언어 확장 의 조합이다.
- OpemMP와 마찬가지로 GCD는 스레딩에 대한 대부분의 세부 사항을 관리한다.
특징
- 실행시간 수행을 위해 태스크를 디스패치 큐에 넣어서 스케줄 한다.
- Queue에서 태스크를 제거할 때 관리하는 스레드 풀에서 가용 스레드를 선택하여 태스크를 할당한다.
- GCD는 직렬(serial)과 병행(concurrent) 두 가지의 유형의 디스패치 큐를 유지한다.
- 직렬 큐
- FIFO 순서로 제거된다.
- 태스크는 큐에서 제거되면 다른 태스크가 제거되지 전에 실행을 반드시 완료해야 한다.
- 각 프로세스에는 고유한 직렬 큐(메인 큐)가 있으며 개발자는 특정 프로세스에 로컬인 추가 직렬 큐를 만들 수 있다.
- 직렬큐를 개인 디스패치 큐라고도 한다.
- 여러 작업을 순차적으로 실행하는 데 유용하다.
- 병행 큐
- FIFO 순서로 제거되지만 한 번에 여러 태스크가 제거되어 병렬로 실행될 수 있게 한다
- 다수의 시스템 전체의 병행 큐(전역 디스패치 큐)가 존재하며 4가지 주요 서비스 품질 클래스로 나뉜다.
- QOS_CLASS_USER_INTERACTIVE - 사용자 대화형
- QOS_CLASS_USER_INITIATED - 사용자 시작
- QOS_CLASS_UTILITY - 유틸리티
- QOS_CLASS_BACKGROUN - 백그라운드
표현방식
1. Objective-C 언어의 경우 GCD는 블록으로 알려진 언어 확장을 식별한다. 블록은 한 쌍의 중괄호 { } 앞에 삽입된 캐럿(^)으로 명시된다. 중괄호 안의 코드는 수행할 작업 단위를 나타낸다.
^{ printf("I am a block");}
2. Swift 프로그래밍 언어의 경우 작업은 모든 게 완비된 기능 단위를 표현한다는 점에서 블록과 비슷한 Closure를 사용하여 정의된다. 문법적으로 Swift Closure는 캐럿없이 블록과 같은 방식으로 작성된다.
//사용자 시작 클래스에 대한 병행 큐를 획득하고
//dispatch_asyc() 함수를 사용하여 태스크를 큐에 제출하는 코드이다.
let queue = dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0)
dispatch_asyc(queue, {print("I am a closure.") })
그 밖에
- 내부적으로 GCD 스레드 풀은 POSIX 스레드로 구성된다.
- GCD는 풀을 적극적으로 관리하여 응용 프로그램 요구 및 시스템 용량에 따라 스레드 수가 늘어나거나 줄어들게 한다.
- GCD는 libdispatch 라이브러리에 의해 구현된다.
- Apple 은 Apache Commons 라이선스에 따라 배포했다. 이후 FreeBSD 운영체제로 이식되었다.
728x90
'iOS' 카테고리의 다른 글
버스탈때 볼 iOS Interview Questions 정리 (0) | 2020.07.22 |
---|---|
WWDC2020 키노트 후기 (정리) (1) | 2020.06.23 |
WWDC Swift Student Challenge 세팅 (0) | 2020.05.06 |
iOS 오픈소스 라이브러리 만들기 101 (1) | 2020.04.18 |
뱅크 샐러드는 어떤 라이브러리를 쓸까?(iOS 유용한 라이브러리) (0) | 2020.04.04 |
댓글