그랜드 센트럴 디스패치
Grand Central Dispatch![]() | |
원저작자 | 데이브 자르지키 |
---|---|
개발자 | 애플사 |
운영 체제 | Mac OS X 10.6 (2009) 이후 iOS 4.0 이후,[1] watch OS, tvOS, FreeBSD |
유형 | 시스템 유틸리티 |
면허증. | 아파치 2.0 |
웹 사이트 | https://apple.github.io/swift-corelibs-libdispatch/ |
Grand Central Dispatch(GCD 또는 libdispatch)는 멀티코어 프로세서 및 기타 대칭형 멀티프로세서 [2]시스템을 탑재한 시스템의 애플리케이션 지원을 최적화하기 위해 Apple Inc.에 의해 개발된 테크놀로지입니다.스레드 풀 패턴을 기반으로 한 태스크 병렬화 구현입니다.기본적인 아이디어는 스레드 풀의 관리를 개발자의 손에서 벗어나 운영체제에 접근시키는 것입니다.개발자는 풀의 아키텍처를 의식하지 않고 "작업 패키지"를 풀에 주입합니다.이 모델은 단순성, 휴대성 및 성능을 향상시킵니다.
GCD는 Mac OS X 10.6에서 처음 출시되었으며 iOS 4 이상에서도 사용할 수 있습니다.그랜드 센트럴 디스패치라는 이름은 그랜드 센트럴 [citation needed]터미널을 지칭합니다.
GCD 서비스의 실장을 제공하는 라이브러리의 소스 코드 libdispatch는 [3]2009년 9월 10일 Apache License로 Apple에 의해 공개되었습니다.FreeBSD 8.1+,[5] MidnightBSD 0.3+,[6] Linux 및 [7][8]Solaris로 포팅되어[4] 있습니다.2011년에 Windows에서 libdispatch를 작동시키려는 시도는 [9][10]업스트림에 병합되지 않았습니다.Apple은 Safari 및 iTunes와 함께 제공되는 Windows용 libdispatch.dll 포트를 가지고 있지만 SDK는 제공되지 않습니다.
2017년경부터 닉 허친슨이[11] 호스팅한 원래 libdispatch 저장소는 2016년 6월에 생성된 Swift 코어 라이브러리의 일부 버전 때문에 폐지되었습니다.새로운 버전은 특히 Windows를 포함한 더 많은 플랫폼을 지원합니다.
설계.
GCD는 병렬로 실행할 수 있는 프로그램 내의 특정 작업을 큐잉하여 실행할 수 있도록 하고 프로세싱 리소스의 가용성에 따라 사용 가능한 프로세서[12][13] 코어(Apple에서는 "[14]루팅"이라고 부릅니다)에서 실행되도록 스케줄링합니다.
태스크는 함수 또는 "블록"[15]으로 표현될 수 있습니다.블록은 [12]C, C++ 및 Objective-C 프로그래밍 언어의 구문을 확장한 것으로 코드와 데이터를 하나의 객체로 캡슐화합니다.GCD는 블록을 사용할 [16]수 없는 환경에서도 사용할 수 있습니다.
Grand Central Dispatch는 여전히 낮은 수준에서 스레드를 사용하지만 프로그래머로부터 추상화하므로 많은 세부 사항을 신경 쓸 필요가 없습니다.GCD의 태스크는 작성과 큐잉이 가볍습니다.GCD의 작업 유닛을 큐잉하려면 15개의 명령이 필요한데, 기존 스레드를 작성하려면 수백 [12]개의 명령이 필요할 수 있습니다.
Grand Central Dispatch의 태스크를 사용하여 대기열에 배치된 작업 항목을 생성하거나 이벤트 원본에 할당할 수 있습니다.태스크가 이벤트 소스에 할당되면 이벤트가 트리거될 때 블록 또는 함수에서 작업 유닛이 생성되고 작업 유닛이 적절한 큐에 배치됩니다.이는 단일 이벤트 트리거를 기다리는 것이 유일한 목적인 스레드를 작성하는 것보다 효율적이라고 Apple은 설명합니다.
특징들
디스패치 프레임워크는 몇 가지 데이터 유형 및 함수를 선언하여 생성 및 조작합니다.
- 디스패치 큐는 익명의 코드 블록 또는 함수 중 하나의 태스크 큐를 유지하고 이들 태스크를 순서대로 실행하는 오브젝트입니다.라이브러리는 여러 작업을 동시에 실행하는 서로 다른 우선순위 수준의 큐를 자동으로 여러 개 생성하여 운영 환경에 따라 실행할 최적의 작업 수를 선택합니다.클라이언트는 라이브러리의 시리얼 큐도 작성할 [13]수 있습니다.시리얼 큐는 송신된 순서대로 한번에1개씩 실행할 수 있습니다.시리얼 큐는 한 번에1개의 태스크만 실행할 수 있기 때문에 큐에 전송되는 각 태스크는 큐의 다른 태스크와 관련하여 중요하므로 경합하는 리소스에 대한 잠금 대신 시리얼 큐를 사용할 수 있습니다.
- 디스패치 소스는 읽기 또는 쓰기 준비가 된 소켓 또는 파일 기술자, POSIX 신호 등의 시스템이벤트에 대해 클라이언트가 비동기적으로 실행할 수 있도록 블록 또는 함수를 등록할 수 있는 객체입니다.
- 디스패치 그룹은 여러 작업을 그룹화하여 나중에 가입할 수 있는 개체입니다.작업을 그룹의 구성원으로 큐에 추가한 후 클라이언트는 그룹 개체를 사용하여 해당 그룹의 모든 작업이 완료될 때까지 기다릴 수 있습니다.
- 디스패치 세마포어는 클라이언트가 특정 수의 작업만 동시에 실행할 수 있도록 허용하는 개체입니다.
Libdispatch는 Objective-C 모델과 부분적으로 호환되는 자체 객체 모델인 OS Object와 함께 제공됩니다.그 결과 오브젝트는 ObjC [17]오브젝트에 수신자 부담 없이 브리지 할 수 있습니다.
예
![]() |
그랜드 센트럴 디스패치의 사용법을 보여주는 두 가지 예는 존 시라쿠사의 Ars Technica Snow Leopard [18]리뷰에서 찾을 수 있다.처음에 문서 기반 응용프로그램에는 다음과 같은 메서드가 있습니다.analyzeDocument
문서 내의 단어와 단락 수를 세는 것과 같은 역할을 할 수 있습니다.일반적으로 이것은 빠른 프로세스이며 사용자가 버튼을 누른 후 결과를 표시할 때까지의 지연을 알아차리지 않고 메인 스레드에서 실행될 수 있습니다.
- (IBAtion)분석 문서:(NSButton *)송신자 { NSDirectionary *통계 = [myDoc 분석하다]; [마이모델 setDict:통계]; [myStats 뷰 set Needs 디스플레이:네.]; }
문서가 크고 분석을 실행하는 데 시간이 오래 걸리는 경우 메인 스레드는 함수가 완료될 때까지 기다립니다.시간이 오래 걸리면 사용자가 알아차리고 응용 프로그램이 "beachball"할 수도 있습니다.해결 방법은 다음과 같습니다.
- (IBAtion)분석 문서:(NSButton *)송신자 { dispatch_dispatchc(dispatch_get_global_dispatch(DISPATCH_QUUE_PRIORITY_DEFAULT, 0), ^{ NSDirectionary *통계 = [myDoc 분석하다]; dispatch_dispatchc(dispatch_get_main_dispatch(), ^{ [마이모델 setDict:통계]; [myStats 뷰 set Needs 디스플레이:네.]; }); }); }
여기, 전화는[myDoc analyze]
는 블록 내에 배치되며 블록은 글로벌 동시 큐 중 하나에 배치됩니다.실행이 끝나면[myDoc analyze]
새로운 블록이 메인큐(애플리케이션의 메인스레드가 실행되는 곳)에 배치되어 GUI가 갱신됩니다(GUI는 메인스레드에 의해서만 갱신 가능하기 때문에 이 작업이 필요합니다).이러한 2개의 작은 변경을 실시함으로써 개발자는 사용자가 볼 수 있는 어플리케이션의 잠재적인 정지를 회피하고 어플리케이션이 하드웨어 자원을 보다 효율적으로 사용할 수 있게 되었습니다.
두 번째 예는 for 루프를 병렬화하는 것입니다.
위해서 (i = 0; i < > 세어보세요; i++) { 결과.[i] = 작업(데이터., i); } 총 = 요약하다(결과., 세어보세요);
이 코드는do_work
기능.count
시간th, 배열의 i 요소에th i 결과 할당results
그 후 루프가 종료되면 어레이 상의 콜이 요약됩니다.불행히도 작업은 순차적으로 계산되며, 그럴 필요가 없을 수도 있습니다.do_work가 다른 콜의 결과에 의존하지 않는다고 가정할 때, 이러한 콜을 동시에 발신할 수 없는 이유는 없습니다.GCD에서는 다음과 같이 처리됩니다.
dispatch_dispatch(세어보세요, dispatch_get_global_dispatch(0, 0), ^(size_t i){ 결과.[i] = 작업(데이터., i); }); 총 = 요약하다(결과., 세어보세요);
여기서,dispatch_apply
전달된 블록을 실행합니다.count
times, 각 호출을 글로벌큐에 배치하고 각 블록 호출을 0에서0까지의 다른 번호로 전달합니다.count
-1. OS는 필요에 따라 작업을 분산하여 현재 하드웨어 및 시스템 부하에 대해 최적의 스레드 수를 선택할 수 있습니다. dispatch_apply
는 소정의 큐에 배치되는 모든 블록이 실행이 완료될 때까지 반환되지 않기 때문에 호출 전에 원래 루프 내의 모든 작업이 완료되었음을 보증할 수 있습니다.summarize
.
프로그래머는 시리얼로 실행해야 하지만 별도의 스레드에서 실행될 수 있는 태스크에 대해 자체 시리얼 큐를 만들 수 있습니다.다음과 같이 새 큐가 생성됩니다.
dispatch_dispatch_t 큐잉 예; 큐잉 예 = dispatch_dispatch_create( "com.disc.identifier", 특수한 순서 ); // 예여기서 큐를 사용할 수 있습니다. 디스패치_릴리스( 큐잉 예 );
큐에 디스패치된 블록이 같은 큐에 다른 블록을 동기적으로 배치하지 않도록 주의해야 합니다.이는 데드록이 보증되기 때문입니다.이러한 코드는 다음과 같은 처리를 합니다.
dispatch_dispatch_t 큐잉 예 = dispatch_dispatch_create( "com.disc.identifier", 특수한 순서 ); dispatch_sync( 큐잉 예, ^{ dispatch_sync( 큐잉 예, ^{ 인쇄물( "난 지금 교착상태야...\n" ); }); }); 디스패치_릴리스( 큐잉 예 );
적용들
GCD는 macOS(10.6 Snow Leopard부터 시작) 전반에 걸쳐 사용되고 있으며, 애플은 macOS 애플리케이션 개발자들에게 GCD의 도입을 권장하고 있습니다.FreeBSD 개발자인 Robert Watson은 2010년 5월 11일 주요 오픈 소스 애플리케이션인 Apache HTTP Server를 Apache GCD MPM(멀티 프로세싱 모듈)을 통해 GCD를 사용하는 첫 번째 적응을 발표했습니다.이는 프로그래밍 모델과 기존의 대규모 멀티 스케일 애플리케이션에 GCD를 통합하는 방법을 설명하기 위해서입니다.그의 발표에 따르면 GCD MPM의 회선 수는 다른 스레드 [19][20]MPM의 3분의 1에서 절반으로 나타났습니다.
내부
GCD는 libdispatch에 의해 구현되며, 애플이 개발한 pthreads 비 POSIX 확장에서 지원됩니다.애플은 GCD(10.6), 마운틴 라이온(10.8), 최근 매버릭스(10.9)의 공식 출시를 통해 (OS X 10.5) 초기부터 인터페이스를 변경해 왔다.최근의 변경은 사용자 모드와 커널 모두에서 pthread를 지원하는 코드를 비공개로 만드는 것과 관련이 있습니다(커널 pthread 지원은 심으로만 축소되고 실제 워크큐 구현은 별도의 커널 [21]확장으로 이동됨).
다른 시스템에서는 libdispatch가 자체 이벤트 기능(epoll, kevent 또는 Windows NT)을 사용하여 자체 워크큐를 구현합니다.MacOS에서 kevent는 커널 워크큐와 함께 사용됩니다.
「 」를 참조해 주세요.
- 태스크 병렬 라이브러리
- 자바 동시성
- OpenMP
- 스레드 빌딩 블록(TBB)
레퍼런스
- ^ "Grand Central Dispatch (GCD) Reference". Apple Inc.
- ^ Apple은 2008년 6월 9일 웨이백 머신에서 Mac OS X Snow Leopard를 2012년 3월 18일 아카이브하여 개발자에게 공개했습니다.
- ^ http://libdispatch.macosforge.org/
- ^ FreeB에서 동작하는 GCD libdispatch(블록 포함)SD
- ^ FreeBSD 분기별 현황 보고서
- ^ lib 디스패치
- ^ libdispatch 메일링 리스트: "Porting status Linux" 2011년 4월 10일
- ^ libdispatch 메일링 리스트: "Porting status Solaris x86/64" 2011년 4월 10일
- ^ libdispatch 메일링 리스트: "lib dispatch for Win32" 2011년 4월 22일
- ^ libdispatch 메일링 리스트: "Windows의 libdispatch 상태에 관한 갱신" 2011년 5월 5일
- ^ Hutchinson, Nicholas (January 10, 2020). "libdispatch". GitHub. Retrieved January 15, 2020.
- ^ a b c "Apple Technical Brief on Grand Central Dispatch" (PDF). Archived from the original on September 20, 2009. Retrieved September 12, 2009.
{{cite web}}
: CS1 maint: bot: 원래 URL 상태를 알 수 없습니다(링크). - ^ a b Gagne, Abraham Silberschatz, Peter Baer Galvin, Greg (2013). Operating system concepts (9th ed.). Hoboken, N.J.: Wiley. pp. 182–183. ISBN 9781118063330.
- ^ "WWDC 2008: New in Mac OS X Snow Leopard". Archived from the original on October 17, 2008. Retrieved June 18, 2008.
- ^ "Grand Central Dispatch (GCD) Reference". Retrieved September 13, 2009.
- ^ "GrandCentralDispatch - FreeBSD Wiki".
- ^ Bugaev, Sergey. "Mach-O linking and loading tricks". Darling development blog. Retrieved January 15, 2020.
- ^ Mac OS X 10.6 Snow Leopard: Ars Technica 리뷰 (2009년 9월 2일 입수)
- ^ libdispatch-dev GCD MPM for Apache (2010년 5월 14일 액세스)
- ^ apache-lib dispatch (2010년 5월 14일 액세스)
- ^ Levin, Jonathan (February 15, 2014). "GCD Internals: The undocumented side of the Grand Central Dispatcher". Retrieved March 17, 2014.