Computer >> 컴퓨터 >  >> 프로그래밍 >> iOS

그랜드 센트럴 디스패치(GCD)란? 애플의 병렬 처리 기술 핵심 정리

그랜드 센트럴 디스패치(GCD)란?

그랜드 센트럴 디스패치(Grand Central Dispatch, GCD)는 애플의 Mac OS X 및 iOS 운영체제를 위해 개발된 병렬 처리 기술입니다. GCD는 C 언어 확장, API, 런타임 라이브러리의 결합으로 구성되며, 애플리케이션 개발자가 병렬로 실행할 코드 영역을 손쉽게 지정할 수 있도록 도와줍니다. OpenMP와 마찬가지로 GCD는 스레딩과 관련된 대부분의 세부 사항을 자동으로 관리하기 때문에, 개발자는 복잡한 스레드 제어에 신경 쓰지 않고도 멀티코어 프로세서의 성능을 충분히 활용할 수 있습니다.

블록(Block): 자기 완결적인 작업 단위

GCD는 C 및 C++ 언어에 추가된 확장 기능인 블록(block)을 사용합니다. 블록은 하나의 독립적인 작업 단위를 의미하며, 중괄호 { } 안에 캐럿(^) 기호를 삽입하여 표현합니다. 다음은 간단한 블록의 예시입니다.

{
    ^printf("This is a block");
}

디스패치 큐(Dispatch Queue)의 이해

GCD는 실행할 블록들을 디스패치 큐(dispatch queue)에 배치하는 방식으로 작업을 스케줄링합니다. 큐에서 블록이 제거되면, GCD가 관리하는 스레드 풀(thread pool)에서 가용 가능한 스레드에 해당 블록을 할당합니다. 디스패치 큐는 직렬(serial) 큐동시(concurrent) 큐, 두 가지 유형으로 나뉩니다.

직렬 큐(Serial Queue)

직렬 큐에 배치된 블록은 FIFO(선입선출) 순서로 제거됩니다. 한 블록이 큐에서 제거되면, 해당 블록의 실행이 완료되기 전까지는 다른 블록이 제거되지 않습니다. 각 프로세스는 고유한 직렬 큐(메인 큐, main queue)를 가지며, 개발자는 필요에 따라 특정 프로세스에 종속된 추가 직렬 큐를 생성할 수도 있습니다. 직렬 큐는 여러 작업의 순차적 실행을 보장해야 하는 경우에 특히 유용합니다.

동시 큐(Concurrent Queue)

동시 큐에 배치된 블록 역시 FIFO 순서로 제거되지만, 여러 개의 블록이 동시에 제거될 수 있어 여러 블록이 병렬로 실행될 수 있다는 점이 직렬 큐와 다릅니다. 시스템 전역에는 세 개의 동시 디스패치 큐가 존재하며, 우선순위에 따라 낮음(low), 기본(default), 높음(high)으로 구분됩니다. 우선순위는 블록의 상대적 중요도를 근사적으로 나타내는 값으로, 우선순위가 높은 블록일수록 높은 우선순위 디스패치 큐에 배치하는 것이 바람직합니다.

다음 코드 예시는 기본 우선순위의 동시 큐를 가져온 뒤, dispatch_async() 함수를 사용해 블록을 큐에 제출하는 방법을 보여줍니다.

dispatch_queue_t queue = dispatch_get_global_queue
(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{ printf("This is a block."); });

GCD의 내부 동작: POSIX 스레드 풀

내부적으로 GCD의 스레드 풀은 POSIX 스레드로 구성됩니다. GCD는 이 스레드 풀을 능동적으로 관리하여, 애플리케이션의 요구 수준과 시스템 용량에 따라 스레드 수를 유연하게 늘리거나 줄입니다. 이러한 자동 관리 메커니즘 덕분에 개발자는 스레드의 생성과 소멸을 일일이 처리할 필요 없이, 효율적이고 안정적인 병렬 프로그래밍을 구현할 수 있습니다.