[iOS] 차근차근 시작하는 GCD — 5

GCD Dispatch Queue의 종류와 특성에 대해 알아봅시다

naljin
8 min readOct 31, 2020

Previously on GCD…

오랜만에 돌아왔습니다 GCD 시리즈! 자, 저번시간의 내용을 빠르게 요약해봅시다.

  1. task들을 큐로 보냄
  2. 큐의 특성이 serial이냐 concurrent에 따라 task를 하나의 혹은 여러개의 스레드로 보냄

좋아요. 기억들이 새록새록 떠오르시나여?

실제로 iOS 에서 제공하는 Dispatch Queue의 종류는 세가지가 있습니다.

  1. 메인 큐
  2. 글로벌 큐
  3. 커스텀 (프라이빗)

큐의 종류에 따라 특성이 다르기 때문에 작업의 특성, 원하는 일처리에 따라 대기열(큐)의 특성에 맞게 작업을 넣으셔야 해요.

으잉???? 종류와 특성?? 이게 무슨소리여!! 하시는 분들(물론 제 얘기 ㅎ)을 위해 포켓몬으로 예시를 들어볼게요.

자 우리의 상황에 대입해볼ㄲㅏ요?

종류와 특성(속성)의 이해가 단번에 되었으면 좋겠네요! 그럼 이제 dispatch queue의 세가지 종류에 대해 알아보러 가시죠!

Main Queue

  • 오직 한개만 존재
  • Serial 특성을 가진 Queue
  • 이곳에 할당된 task는 메인 스레드에서 처리 (UI 업데이트 내용 처리)
오랜만이야 메인스레드~

GCD 시리즈 1탄에서 코드 작성할때 별도의 처리를 하지 않는 이상 모든 일들은 메인 스레드가 작업하게 된다라고 말한게 기억 나시나요? 물론 안나겠지만 튼 그렇습니다.

메인 스레드에서 작업된다는건 이 task 들이 우선 메인 큐에 할당 됨을 의미하겠죠?

만약 이런 코드가 있었다면

사실은 이런 의미가 숨어있던겁니당. 이렇게 main 큐에 들어가고 있었던거져.

근데 진짜로 이렇게 코딩하면 에러나긴 함여 ㅋㅎ 왜 그런지는 제가 다음 강의를 들어야 알 수 있음 ㅎ

아 그리고 메인 큐의 특성이 Serial이라고 했잖아요? 기계적으로 외우려고 하지말고 한번 이해를 해봅시다.

  1. 메인 큐에서 task는 메인 스레드로만 보냄
  2. 메인 스레드는 오직 한개 밖에 없음
  3. 따라서 메인 큐에 있는 task들을 다른 곳에 분산시킬래도 분산 시킬만한데가 없음
  4. 큐의 특성은 무조건 Serial이 됨 (분산은 Concurrent의 특징)

Global Queue

  • Concurrent 특성을 가진 Queue
  • QoS (Quality Of Service)에 따라 여러개의 종류로 나뉨 (6종류)

오 메인큐와 달리 특성이 Concurrent 군요. 그러면 여러개의 스레드로 task를 분산시킬테니, 작업을 보낼때 순서가 중요하지 않은 것들을 글로벌 큐로 보내면 되겠네요.

글로벌 큐는 qos를 지정함으로써 작업의 중요도를 결정할 수 있습니다.

그러면 QoS의 종류를 살펴보자구요.

userInteractive

사용자와 직접 상호작용 하는 작업. (ex. UI 업데이트, 애니메이션 등)

사용자의 행동에 대한 즉각적인 반응이 기대 되지만, 이를 메인 스레드에서 처리하면 많은 로드가 걸리는 작업들을 userIneractive에서 처리해서 바로 동작하는 것처럼 보이게 함.

userInitiated

클릭할 때 작업을 수행하는 것과 같은 즉각적인 결과가 필요한 작업. (ex. 저장된 문서 열기)

하지만 userIneractive 보다는 조금 오래걸릴 수 있고 유저가 어느정도 이를 인지하고 있음.

default

일반적인 작업.

utility

보통 progress bar와 함께 길게 실행되는 작업. (ex. 데이터 다운로드)

background

유저가 직접적으로 인지하지 않는 시간이 덜 중요한 작업. (ex. 동기화 및 백업)

unspecified

QoS 정보가 없음을 나타냄. 거의 사용할 일 없다.

이렇게 설정된 qos에 따라 각각의 queue에 task들이 들어가 있을거예요.

여기서 실제로 어떻게 task들이 thread에 배치되냐하면

두둥. 이런식으로 우선 순위가 더 높은 일더 많은 스레드를 배치합니다.

참고로 .async(qos: .utility) 이런식으로 보내는 상황에 task의 qos를 지정할 수도 있습니다.

만약 queue의 qos와 task의 qos가 다른 상황에서 어떻게 동작하는지 궁금하신 분들은 나중에 글을 찌면 링크를 남겨놓도록 할게요.

Custom Queue

  • 커스텀으로 만듦
  • 디폴트로 Serial 특성을 가진 Queue. 하지만 Concurrent 설정 가능.
  • Qos 설정 가능

이렇게 생성할때 인자에 label 을 붙이면 custom queue가 됩니다. 얘는 Serial 특성을 갖구 있습니당.

하지만 위에서 Concurrent로 설정도 가능하다고 했어요. 바로 이렇게요.

qos를 따로 설정안했기 때문에 여기서의 qos는 OS가 알아서 추론합니다. 물론 설정할 수도 있답니다.

마무리

지금까지 세가지 종류의 DispatchQueue를 알아보았습니다!

Main Queue

  • 오직 한개만 존재
  • Serial 특성을 가진 Queue
  • 이곳에 할당된 task는 메인 스레드에서 처리 (UI 업데이트 내용 처리)

Global Queue

  • Concurrent 특성을 가진 Queue
  • Qos (Quality Of Service)에 따라 여러개의 종류로 나뉨 (6종류)

Custom Queue

  • 커스텀으로 만듦
  • 디폴트로 Serial 특성을 가진 Queue. 하지만 Concurrent 설정 가능.
  • Qos 설정 가능

오랜만의 GCD 시리즈 반가우셨나여? 다음 시리즈는 언제로 돌아올지 모르겠네요! ㅎㅎ 오늘 로또나 되길 기원하며..◠‿◠ 그럼 20000!

이전 포스팅 👈🏻

다음 포스팅 👉🏻

출처

--

--