lunchScreen/Interview_Questions

Global DispatchQueue 의 Qos 에는 어떤 종류가 있는지, 각각 어떤 의미인지 설명하시오.

Opened this issue · 4 comments

Global DispatchQueue 의 Qos 에는 어떤 종류가 있는지, 각각 어떤 의미인지 설명하시오.
  • 총 여섯 가지가 있고, unspecified를 제외하고 위에서 아래 순서로 빠르게 동작합니다.

  • DispatchQueue.global(qos: DispatchQoS)

    • DispatchQoS.userInteractive
      • In the middle of pinching, draging
    • DispatchQoS.userInitiated
      • If user has asked for right now
      • Button, Swipe actions
    • DispatchQoS.default
    • DispatchQoS.utility
      • long-running tasks whose progress the user does not follow actively
    • DispatchQoS.background
      • Use to perform work while your app is running in the background
    • DispatchQoS.unspecified

DispatchQueue에는 6가지의 qos가 존재하며 이에 따라 작업의 우선순위가 다릅니다.

  • userInteractive : 사용자와 직접 상호작용 하는 작업. (ex. UI 업데이트, 애니메이션 등) 즉각적인 반응을 필요로 하지만, 메인 스레드에서 처리하기엔 많은 로드가 필요한 작업들.
  • userInitiated : 클릭할 때 작업을 수행하는 것과 같은 즉각적인 결과가 필요한 작업. (ex. 저장된 문서 열기) userIneractive보다는 조금 오래 걸릴 수 있고 유저가 어느 정도 이를 알고 있음.
  • default : 일반적인 작업.
  • utility : 보통 progress bar와 함께 길게 실행되는 작업. (ex. 데이터 다운로드)
  • background : 유저가 직접적으로 인지하지 않는 시간이 덜 중요한 작업. (ex. 동기화 및 백업)
  • unspecified : QoS 정보가 없음을 나타냄. (거의 사용할 일 없음)

이렇게 설정하는 qos는 queue를 생성하거나 task를 보내는 상황(sync, async)에서 설정할 수 있습니다. 만약 이 때 두 곳에서 설정한 qos가 다를 경우 더 높은 곳의 qos를 따라갑니다.

DispatchQoS 구조체에는 userInterative, userInitiated, default, utility, background, unspecified로 총 6가지 static 객체가 있습니다.
(1) userInterative는 애니메이션, 이벤트 처리, 앱 사용자 인터페이스 업데이트 같은 사용자 인터페이스 작업에 대한 QoS 클래스,
(2) userInitiated는 사용자가 앱을 적극적으로 사용하지 못하게 하는 작업에 대한 QoS 클래스,
(3) default는 기본 QoS 클래스,
(4) utility는 사용자가 적극적으로 추적하지 않는 작업 관련 QoS 클래스,
(5) background는 생성한 작업의 유지 혹은 정리를 위한 QoS 클래스,
(6) unspecified는 QoS 클래스 없음을 의미하는 QoS 클래스입니다.

작업을 위해 QoS를 할당하면 해당 중요도를 표시하고 시스템이 해당 QoS의 priority를 지정하여 적절하게 스케줄링 한다.

Qos는 중요한 순으로 userInteractive, userInitiated, default, utility, background, unspecified 가 있다.

  • userInteractive: main thread에서 작업. 사용자 인터페이스 새로고침 또는 애니메이션 수행과 같이 사용자와 상호작용을 하는 작업일때 사용한다. 순식간에 끝난다.
  • userInitiated: 사용자가 시작한 작업이며, 저장된 문서를 열거나 사용자 인터페이스에서 무언가를 클릭할 때 작업을 수행하는 것과 같은 즉각적인 결과가 필요할때 사용한다. 몇초 또는 그 이하에 끝난다.
  • default: userInitiated와 utility 사이의 중요도로, 개발자가 작업을 분류하는데 사용하기 위한것이 아니다. Qos가 할당되지 않은 작업은 default로 처리되며 GCD global queue는 이 레벨에서 실행된다.
  • utility: 작업을 완료하는 데 약간의 시간이 걸릴 수 있으며 데이터 다운로드 또는 import와 같이 즉각적인 결과가 필요하지 않은 작업, 응답성, 성능 및 에너지 효율성 간의 균형을 제공하는데 중점을 둔다.
  • background: 색인 생성, 동기화 및 백업과 같이 백그라운드에서 작동하고 사용자에게 표시되지 않는 작업이다. 에너지 효율성에 중점을 둔다.
  • unspecified: Qos가 없음을 나타내며 시스템에 Qos를 추론해야 한다는 신호를 보낸다.

우선순위가 더 높은 큐의 작업은 우선적으로 더 많은 쓰레드에 배치되고 배터리를 집중적으로 소모하게 된다.