GCD란?
Grand Central Dispatch (GCD) 는 애플에서 제공하는 멀티스레딩 API
Dispatch Queue (in GCD)
dispatch queues은 앱에서 task를 비동기적으로 동시에 수행 할 수 있는 손쉬운 방법입니다.
Serial - Serial queues (private dispatch Queue)
•
한번에 하나의 task 실행
•
큐에 추가된 순서대로실행
•
현재 실행중인 task 는 dispatch queue 에서 관리하는 고유 스레드에 실행
•
필요한 만큼 Serial Queue 작성가능
특정 자원에 대한 액세스를 동기화하는데 사용
Concurrent - Concurrent queues ( global dispatch queue )
•
동시에 하나 이상의 task 를 실행
•
큐에 추가된 순서대로 실행
•
현재 실행중인 task 는 dispatch queue 에서 관리하는 고유 스레드에 실행
•
특정 시점마다 실행되는 task 의 수는 가변적이다 << 시스템의 상태에 따라 조절됨.
•
사전에 정의된 4개의 global dispatch queue 가 존재
Main dispatch queue
앱의 메인스레드에서 실행하는 전역적으로 사용가능한 serial queue
•
주요 동기화 지점으로 사용됨
•
앱의 Runloop 와 함께 작동. task 의 실행을 다른 이벤트 소스의 실행과 연관지음 (생명주기에 영향)
Dispatch queue 의 장점 - 왜 스레드 모델이 아니라 API 를 사용해야할까?
1.
코드가 간결해진다 : 쓰레드 사용시 쓰레드 자체의 생성 및 관리를 위한 코드를 작성할 필요가 없다
2.
빠르다 : 시스템이 모든 쓰레드 생성을 관리 >> 시스템 조건에 따라 쓰레드의 수를 조절 >> 쓰레드를 직접 작성한 경우보다 task 수행이 빠르다.
3.
결과가 예측가능하다 : 동일한 리소스에 접근하는 두 스레드가 존재하면 Lock 을 이용해야함. 하지만 Dispatch queue 에서는 한번에 하나의 task 만 리소스를 사용하도록 설정해줄 수 있음. = 효율적
Lock 은 trap 에 따른 오버헤드가 크다. dispatch queue 는 앱 프로세스 내부에서 동작하므로 이러한 오버헤드를 줄일 수 있다.
4.
메모리 공간이 절약된다 : 쓰레드 모델은 커널 메모리, 사용자 공간 메모리를 모두 차지하는 스레드를 생성하게 됨. Dispatch queue 는 쓰레드에 비해 메모리 공간이 절약된다. 사용하는 스레드는 심지어 block 될 필요도 없다
주의사항
•
서로다른 dispatch queue 들간에는 동시에 task 를 수행함. 하나의 dispatch queue 내에서만 serialize 됨
•
시스템은 한번에 실행되는 총 task수를 결정합니다. 따라서, 100개의 다른 큐에서 100개의 task를 가진 앱은(100개 이상의 유효코어가 없는 한) 모든 task를 동시에 실행 할 수 없습니다.
•
시작될 새 task를 선택 할 때, 큐 priority level이 고려됩니다. Serial queue priority를 결정하는 방법은 Providing a Clean Up Function For a Queue를 참고하세요.
•
큐의 task는 큐에 추가 될 때, 실행할 준비가 되어있어야 합니다. 이전에 Cocoa Operation queue를 사용했다면, 이것이 model operation에 사용되는 것과 다르다는 점에 유의하세요
•
Private dispatch queues는 reference-counted객체입니다. 자신의 코드에 큐를 유지하는 것 외에도, dispatch sources를 큐에 첨부될 수 있으며 retain count를 증가시킬 수 있다는 점에 유의해야합니다. 따라서 모든 dispatch sources가 취소(canceled)되었는지 확인하고, 모든 retain call이 적절한 release call과 균형을 이루도록 해야합니다.
Queue-Related Technologies ( in GCD )
dispatch queues외에도 Grand Central Dispatch를 사용하여 코드를 관리하는 데 도움이 되는 몇가지 기술을 제공합니다.
1.
Dispatch groups : Dispatch groups은 완료(completion)을 위해 블록 객체 집합을 모니터링 하는 방법입니다. 그룹은 필요에 따라 동기적/비동기적으로 블록을 모니터링 할 수 있습니다. 그룹은 다른 task의 완료 여부에 따라 코드에 유용한 동기화 메커니즘을 제공합니다.
2.
Dispatch semaphores : Dispatch semaphores는 전통적인 세마포어와 유사하지만, 일반적으로 더 효율적입니다. 세마포어를 사용 할 수 없기 때문에 호출 쓰레드(calling thread)를 차단해야하는 경우에만 세마포어가 커널로 호출됩니다. 세마포어를 사용 할 수 있으면, 커널 호출이 수행되지 않습니다.
3.
Dispatch sources : dispatch source는 특정 타입 시스템 이벤트에 대한 응답(response)으로 notifications을 생성합니다. Dispatch sources를 사용하여 프로세스 notifications, 신호(signal) 및 descriptor events와 같은 이벤트를 모니터링 할 수 있습니다. 이벤트가 발생하면 Dispatch sources는 처리를 위해 지정된 dispatch queue에 비동기적으로 task코드를 제출(submit)합니다.