GCD 란


Multicore Process 를 위한 Thread programming 의 방법이다.

기존의 스레드 관리는 직접 락을 걸고, 스레드풀을 관리하는 수고가 있었지만

GCD는 스레드를 OS 에서 관리하고 분배한다.


Dispatch Queue


Dispatch Queue는 작동방식이 Serial이든 Concurrent든 항상 FIFO ( First in First out ) 방식으로 동작한다.


Queue 의 동작방식


Serial Queue -> 동작이 순차적으로 FIFO 한다.

Concurrent Queue -> 동작이 동시적으로 GCD 에서 컨트롤하여 FIFO 한다.



Queue 의 종류


여러가지의 Queue 중에 대표적으로 main과 global 이있다.


DispatchQueue.main


시스템시작시 자동으로 생성하는 메인스레드 큐 이다.

기본적으로 Serial Queue 로 동작한다.

대표적인 예로 UI 변경작업은 메인큐에서 실행해야한다.


DispatchQueue.global


메인스레드 큐 와 반대되는 개념으로 백그라운드에서 동작하는 큐이다.

기본적으로 Concurrent Queue로 동작한다.

대표적인 예로 서버와의 통신작업같은경우 시간이 얼마나 걸릴지 모르고 작업량이 많기때문에 

백그라운드로 실행하여 후처리를 메인큐에서 하는경우가있다.

Qos 를 활용하여 우선순위를 설정해줄수있다


DispatchGroup


여러가지 작업을 동시에 실행할때 Group을 Concurrent queue 로 작업하여 결과물을 빠르게 얻는다

Group queue는 실행되는 작업이 다 완료되었을때 Notify 를 호출하여 끝났다는 신호를 준다


Qos (Quality of Service)


작업을 Multi-threading & Concurrent 하게 실행하고자 할때 Qos 를 정의한 Global queue 를 사용한다

userInteractive

중요도가 높고 즉각적인 반응이 요구되는 작업을 실행할때 사용하는 Qos

UI 업데이트같은 유저의 액션에 즉각적으로 반응해야하는 작업이 필요할때 사용

Global queue 지만 main-thread 에서 실행된다

userInitiated

userInteractive 에 비해 우선순위는 낮지만 async 하고 빠른결과값을 기대할때 사용

utility

시간이 상대적으로 오래걸리는 작업을 위해 사용

I/O, 통신 등의 작업에 주로 사용

background

유저가 인지하지도 못하는 백단에서 실행되는 작업

utility 에 비해 상대적으로 천천히 작업하는경우 사용



Sync, Async


Sync


큐에 등록한 스레드가 작업이 끝날때까지 대기하고 작업이 끝났다는 신호가 오면 다음 큐를 실행한다. ( 등록해놓은 큐를 순차적으로 실행한다 )


Async


큐에 등록한 스레드가 작업이 끝날때까지 대기하지않고 다음 큐를 병렬로 실행한다. ( 등록해놓은 큐를 동시적으로 실행한다 )


차이점은 작업이 완료될때까지 기다리느냐 아니냐의 차이이다.

Sync 같은 경우 사용법을 제대로 숙지하지않으면 스레드가 죽지않는 교착상태에 빠질 수가있어 되도록이면 Async를 사용하는게 좋다.


After


큐에 등록한 스레드에 시간차를 두어 실행 할 수 있게 한다.









+ Recent posts