본문 바로가기
개린이 이야기

GCD(Grand Central Dispatch)와 DispatchQueue에 관하여

by iOS 개린이 2022. 9. 23.

IOS 프로그래밍을 하다보면 DispatchQueue를 필수적으로 접하게 되는데 이 DispatchQueue가 GCD와 관련이 있기 때문에 GCD와 함께 DispatchQueue를 알아 볼 예정이다. 

1. GCD

-IOS 멀티 쓰레딩을 위해 NSOperation과 GCD라는 API를 제공한다. GCD는 멀티쓰레딩을 위한 C언어 기반의 저수준 API라고 한다.

-GCD는 멀티코어 시스템에서 Concurrency Programming(동시성 프로그래밍)을 하기 위해 애플에서 제공하는 API이다.

프로그램 작업을 효율적으로 처리(동기화작업이나 쓰레드 분업 등)하기 위해서 GCD를 사용한다,

여러 개의 스레드에 작업을 분배시키기 위해 GCD를 사용한다 정도로 이해하면 좋을 것 같다.

 

-위에서 "멀티쓰레딩을 위한", "동시성 프로그래밍을 위한" 이라는 말을 했는데 헷갈릴 수 있을 것 같아서 정리하자면

우리가 모든 작업들을 한 쓰레드에서만 처리하게 한다면 굉장히 비 효율적일 것이다. 그래서 여러 개의 쓰레드로 나누어서  작업을 분산처리하는 것이 멀티쓰레딩이고 멀티 쓰레딩을 할 수 있도록 프로그래밍 하는 것이 동시성 프로그래밍이다.

 

-그렇다면 우리는 동시성 프로그래밍을 위해 "몇 개의 쓰레드를 사용할까?", "몇 번쓰레드로 작업을 몇 개 보낼까?" 등처럼 쓰레드를 직접적으로 관리해주어야 하는지에 고민을 해야하는 것인가? 아니다. 그저 Queue(대기행렬)로 작업을 보내주면 GCD가 적절하게 스레드를 생성하고 작업을 분배하는 것이다. 

여기서 DispatchQueue는 GCD가 사용하는 Queue가 DispatchQueue인 것이다.

 

2. DispatchQueue

-IOS에서 동시성 프로그래밍을 돕기 위해 제공하는 queue

-DispatchQueue는 크게 MainQueue(Serial), GlobalQueue(Concurrent) 2가지로 나뉜다.

 

1) MainQueue(Serial)

-Serial이라서 작업을 순차적으로 처리한다.(한 번에 하나의 작업만 처리가능)

-IOS에는 MainThread가 존재하는데 이 MainThread에서 작업을 실행하고, 전역적으로 사용이 가능한 SerialQueue가 MainQueue다.

(TMI : 메인쓰레드는 오직 한 개만 존재하고, 평소에 우리가 코드에 별도의 처리를 하지 않는다면 모든 작업이 메인쓰레드에서 이루어지고, 모든 UIKit 관련 작업은 메인쓰레드에서 실행된다.(메인쓰레드에서 작동하게 만드는 것이 효율적임))

 

2) GlobalQueue(Concurrent)

-Concurrent라서 작업을 여러 쓰레드로 나누어 분산처리한다.

-globalQueue는 파라미터로 qos유형을 받는다. 여기서 qos란 Quality of Service로 Queue에서 작업의 중요도를 나누어주는 기능이다. 

우리는 한정된 자원과 에너지를 효율적으로 사용하기 위해서 qos를 통해 작업의 중요도를 표시해주어야 하고, 시스템이 작업의 우선순위에 따라 빠르게 처리해야 하는 작업과 그렇지 않은 작업을 나눈다.

 

qos의 우선순위

-userInteractive : 중요도가 높음. 메인쓰레드에서 UI관련 작업과 같이 즉각적인 반응이 요구되는 작업일 때 사용한다.

 

-userInitiated: userInteractive 다음으로 중요하며, 유저가 빠른 결과를 기대할 작업에 사용한다.

ex) 저장된 문서를 열거나, UI에서 어떤 것을 클릭할 때 작업 등과 같이 즉각적인 결과가 필요할 때 사용(거의 순식간, 몇 초)

 

-default : qos 기본값

 

-utility : 작업을 완료하기까지 시간이 조금 걸릴 수 있으며, 즉각적인 결과까지 필요하지 않을 때 사용한다. progressbar를 이용하여 작업시간을 보여줄 수 있다. 

ex) 네트워킹, 데이터 가져오기 등(몇 초에서 몇 분정도)

 

-background: 말 그대로 background에서 작동, 급하지 않거나, 사용자가 볼 수 없는 작업에 사용한다. 

ex) 동기화 및 백업(몇 분에서 몇 시간정도)

 

-unspecified: 시스템에 qos를 추론하라고 신호를 주는 역할

 

사용자 작업이 발생하지 않는 시간의 90%이상을 Utility Qos Level에서 실행하는 것이 좋다!!!!

 

 

 

 

참고:

 

[iOS] 차근차근 시작하는 GCD — 2. GCD와 Operation에 대해 알아봅시다 | by naljin | Medium

[Swift] GCD - Dispatch Queue 알아보기 :: colours_iOS (tistory.com)

iOS) GCD (Grand Central Dispatch) (tistory.com)

iOS Concurrency(동시성) 프로그래밍, 동기 비동기 처리 그리고 GCD/Operation - 디스패치큐와 오퍼레이션큐의 이해 - 인프런 | 강의 (inflearn.com)

iOS ) GCD - Dispatch Queue사용법 (1) (tistory.com)

iOS ) Prioritize Work with Quality of Service Classes (tistory.com)