본문 바로가기

iOS

[Concurrency] GCD

728x90

바로 목차 ㄱ

  1. Main Queue
  2. 글로벌 큐와 Qos의 이해
  3. Custom Queue

 

GCD(디스패치 큐)의 종류와 특성

Queue의 종류

  • 디스패치 큐
    • 메인 큐
    • 글로벌 큐
    • 프라이빗 큐
  • 오퍼레이션 큐 

 

Main Queue

  • 유일하게 1개
  • 직렬 (Serial)
  • 메인 쓰레드 = 메인 큐
    • 1번 쓰레드 = 메인 쓰레드 = 메인 큐 
    • 유일
    • 코드로 작성하면 DispatchQueue.main 으로 작성할 수 있다.

 

// main으로 보낸다.
DiapatchQueue.main.async {
// 내부 코드 -> 1번 쓰레드에서 일을 한다.
}

 

DispatchQueue.main.asyncAfter(.now() + 2) {

}

위 코드의 의미는

✔️ 메인 큐로 작업을 보내는데,

✔️ 비동기적으로 보내고,

✔️ 지금으로부터 2초 뒤에

보낸다. 는 것이다.

 

 

Global Queue

글로벌 큐는 6가지 우선순위(Qos)에 따라서 나뉘어지는데 default 값은 concurrent이다.

 

위로 올라갈수록 우선순위가 높다.

 

🤔 왜 이렇게 중요도가 나타나는가?

(= 글로벌 큐를 종류로 나누는 것이 어떤 의미가 있는가?)

중요도/우선순위에 따라서 작업의 순서가 달라지는데, 보통 사용자와 근접할수록 우선순위가 높다.

 

 

DispatchQueue.global( ).async { 
	// task1
}

DispatchQueue.global(qos: .userInitiated ).async { 
	// task2
}

위와 같은 우선순위를 갖고 있는 큐에 작업 1과 작업 2를 보낸다고 할 때,

작업 1은 기본적으로 .default 로 보내지므로 작업 2의 우선순위가 더 높다고 할 수 있다. 

 

중요도에 따라서 다른 큐로 작업을 보낸다는 것은

작업 2가 더 중요한 큐로 보내졌다는 것을 의미한다.

 

즉, iOS가 알아서 우선적으로 중요한 일이라는 것을 인지하여

= 작업 2가 더 빠르게 처리되도록 하고

= 쓰레드에 우선순위를 매겨

= 더 많은 쓰레드를 배치하여

= 배터리를 우선순위가 높은 작업에 더 집중적으로 사용할 수 있도록 한다. 

 

 

🤔 큐의 우선순위를 .background로 했는데, 보내는 작업의 서비스 품질이 높다면?

// 백그라운드로 정의
let queue = DispatchQueue.global(qos: .background)
 
// 작업을 보낼때 더 높은 수준으로 보냄
queue.async(qos: .utility) {

}

 

→ 큐의 품질이 미리 설정한 .background가 아니라 작업의 영향을 받아서

→ .utility로 상승

 

Custom Queue

기본 설정은 직렬, 원하면 concurrent도 가능, Qos도 설정할 수 있다. 

 

// 레이블만 붙이면 됨
let queue = DispatchQueue(label: “com.inflearn.serial”)  

// 커스텀/프라이빗 큐는 동시큐로 설정도 가능
let queue2 = DispatchQueue(label: “com.inflearn.concurrent”, attributes: .concurrent)

-> 작업에 대해서 커스텀 큐의 경우, 우선 순위를 설정하지 않아도 OS가 알아서 추론한다.