본문 바로가기
iOS

GCD : Grand Central Dispatch

by HaningYa 2020. 6. 16.
728x90

GCD

공룡책을 보는 중 암묵적 스레드 부분에서 macOS 와 iOS 의 예시로 GCD 가 나와있어 따로 정리했다.

 

GCD 란

  • Grand Central Dispatch 는 macOS 및 iOS 운영체제를 위해 Apple 에서 개발한 기술
  • 개발자가 병렬로 실행될 코드 섹션(태스크)을 식별할 수 있도록 하는 runtime library + API + 언어 확장 의 조합이다.
  • OpemMP와 마찬가지로 GCD는 스레딩에 대한 대부분의 세부 사항을 관리한다.

특징

  1. 실행시간 수행을 위해 태스크를 디스패치 큐에 넣어서 스케줄 한다.
  2. Queue에서 태스크를 제거할 때 관리하는 스레드 풀에서 가용 스레드를 선택하여 태스크를 할당한다.
  3. GCD는 직렬(serial)과 병행(concurrent) 두 가지의 유형의 디스패치 큐를 유지한다.
  4. 직렬 큐
    • FIFO 순서로 제거된다.
    • 태스크는 큐에서 제거되면 다른 태스크가 제거되지 전에 실행을 반드시 완료해야 한다.
    • 각 프로세스에는 고유한 직렬 큐(메인 큐)가 있으며 개발자는 특정 프로세스에 로컬인 추가 직렬 큐를 만들 수 있다.
    • 직렬큐를 개인 디스패치 큐라고도 한다.
    • 여러 작업을 순차적으로 실행하는 데 유용하다.
  5. 병행 큐
    • FIFO 순서로 제거되지만 한 번에 여러 태스크가 제거되어 병렬로 실행될 수 있게 한다
    • 다수의 시스템 전체의 병행 큐(전역 디스패치 큐)가 존재하며 4가지 주요 서비스 품질 클래스로 나뉜다.
      1. QOS_CLASS_USER_INTERACTIVE - 사용자 대화형
      2. QOS_CLASS_USER_INITIATED - 사용자 시작
      3. QOS_CLASS_UTILITY - 유틸리티
      4. 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

댓글