[iOS] DispatchQueue와 task의 QoS 가 다를때의 동작 방식

차근차근 시작하는 GCD — 5 번외편

naljin
Oct 31, 2020

배경 지식

GCD 시리즈 5편에서는 Dispatch Queue의 한 종류로 global queue가 있고, 이렇게 queue의 qos를 지정할 수 있다고 했습니다.

let queue = DispatchQueue.global(qos: .background)

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

문제 상황

DispatchQueue.global(qos: .background).async(qos: .utility)

엥? 근데 이건 무슨 상황일까요. queue의 qos는 .background인데, 보내는 task의 qos는 .utility네여? 즉 task를 더 높은 qos로 보내는 상황으로 queue와 task의 qos가 달라요!

동작 방식

1. task QoS > Queue QoS

위의 예시처럼 task의 qos가 더 높을때는 task qos의 영향을 받아 해당 작업이 있는 동안 일시적으로 queue의 qos가 utility로 상승하게 됩니다.

이 상황을 좀 더 자세히 살펴볼게요. 뭐 대충 이런 코드가 있다고 합시다.

한줄 한줄 그림으로 표현해볼게요.

let queue = DispatchQueue.global(qos: .background)
queue.async(qos: .utility) {
print("북쪽에 계신")
print("아름다운")
print("메리메리")
print("리얼")
}

task를 보낼때 qos를 utility로 지정해서 queue의 qos도 덩달아 utility로 바뀌었군요!

queue.async {
print("카인드니스 여러분")
print("안녕하십니까")
}

오 utility로 담긴 task들이 아직 스레드로 분배 되지 않고 queue에 남아있어서 여전히 queue의 qos는 utility네요

그럼 큐에 담긴 task들을 스레드로 분배해볼까요?

두둥 utility로 들어왔던 task가 스레드에 모두 분배되자마자 queue의 qos가 background로 변경되었습니다!

이제 아래 코드 (초록색 task)로 들어온 애는 원래 queue의 qos(background)에 맞게 할당 될 수 있겠네요!

queue.async {
print("카인드니스 여러분")
print("안녕하십니까")
}

2. task QoS < Queue QoS

반대로 task의 qos가 낮은 상황에서는 큐의 qos를 따라가게 된다고 합니다.

마무리

신기하져?ㅎㅎ 그럼 모두 즐주행주~~!!

출처

--

--