[iOS] 동시성 프로그래밍 - 번외 QoS 공식문서 톺아보기

Minw·2024년 5월 11일

iOS

목록 보기
6/7

안녕하세요!
오늘은 QoS에 대해 알아보려고 합니다.
동시성 프로그래밍을 공부하던중 QoS에 대해 궁금증이 생겨 공식문서 리뷰를 해보려고 합니다!
틀린 내용과 오역이 있을수도 있으니... 피드백 언제든지 환영입니다!

https://developer.apple.com/library/archive/documentation/Performance/Conceptual/EnergyGuide-iOS/PrioritizeWorkWithQoS.html#//apple_ref/doc/uid/TP40015243-CH39-SW1

1. QoS의 필요성?

1.1. 작업의 우선순위

앱과 작업들은 CPU, 메모리, 네트워크 인터페이스같은 유한한 자원을 두고 늘 경쟁을 하잖아요?

자원은 한정되어 있으니 어느 작업은 빨리 끝날것이고 다른 작업은 늦게 끝나게 될건데.. 이때 UI를 업데이트 하는 작업처럼 꼭 빨리 끝나야만 하는! 작업이 늦게 끝나게 된다면 큰일 나겠죠..?
따라서 반응성과 효율성을 위해 시스템은 작업에 우선순위(QoS; Quality of Service)를 둘 필요가 생기게 됩니다!

UI 업데이트처럼 사용자에게 직접적으로 영향을 주는 작업은 매우 중요하고, 백그라운드에서 발생하는 다른 작업들보다 더 높은 우선순위를 가지게 되는데요. 이러한 작업들은 빨리 완료되야 하므로 더 많은 에너지를 사용하고 시스템 자원에 빠른 접근을 할 필요가 생기게 됩니다.

시스템이 어느정도는 알아서 우선순위를 매겨주겠지만 개발자도 중요도에 따라 앱의 작업들을 잘 분류할 필요가 있습니다.

2. QoS에 대하여

2.1. QoS를 이용해 작업 분류하기

QoS 클래스는 NSOperation, NSOperationQueue, NSThread 객체, Dispatch queue, pthreads(POSIX threads)에 의해 작업을 분류하는데 사용됩니다.
작업에 QoS를 할당하면 시스템은 QoS에 따라 우선순위를 두고 스케쥴링을 하게 되는 것 입니다!

스케쥴링을 하면서 시스템 자원은 낮은 우선순위를 가진 작업에서 더 높은 우선순위를 가진 작업으로 재할당 될 수도 있겠죠?

위에서 더 높은 우선순위를 가진 작업들이 자원을 더 많이 사용하고 더 빨리 수행되기 때문에, 일반적으로 더 많은 에너지를 사용한다고 했는데요. 따라서 QoS를 적절히 나누는 것은 앱이 에너지 효율적이고 반응적임을 보장하게 됩니다!

2.2 QoS의 종류

공식문서에는 스케쥴링, CPU와 I/O 처리율, 타이머 지연과 같이 우선순위를 조정하는데 QoS 정보를 사용한다고 했는데요.
여기서 든 의문..
'스케쥴링은 당연히 우선순위와 관련이 있지만 나머지는..?'이라는 생각이 들어 구글링하던 중 깨닫게 되었습니다!

  1. CPU 또는 I/O의 처리율(throughput)과 우선순위
  • 높은 우선순위를 가진 작업은 자원을 더 할당받는다
    이 말은 즉, 더 많은 CPU의 사이클을 할당받거나 I/O 작업이 더 빨리 수행될 수 있다는 것을 의미합니다.
  • 시스템이 특정 작업을 더 중요하게 여겨 우선적으로 자원을 분배한다는 의미!
  1. 타이머 지연(timer latency)과 우선순위
  • 타이머 지연 : 타이머가 설정된 시간과 실제 실행된 시간의 차
  • 시스템의 다양한 요인(예: CPU 부하, 시스템 리소스 사용량 등)으로 인해 타이머가 정확한 예정 시간에 실행되지 않을 수 있는데요,
    이때 높은 우선순위의 작업에 대해서는 타이머 지연을 최소화하여 작업이 가능한 시간에 실행될 수 있도록 해야겠죠?

자 그럼 본격적으로 QoS의 종류에 대해 알아보도록 하죠!
공식문서에서는 작업에 QoS를 할당할 때, 유저와 다른 작업들에게 얼마나 영향을 미칠지 생각하라고 하는데요.

의역이 조금 들어갔지만.. 아래 표를 기준으로 고민하시면 될 것 같습니다...!

  • 주요 QoS 클래스
QoS 종류작업의 종류와 Qos의 초점실행시간
User-interactive메인 스레드에서 수행되거나, UI를 업데이트하거나,
애니메이션을 수행하는 것 처럼 유저와 직접적으로 상호작용하는 작업들
만약 작업이 빠르게 수행되지 않으면 UI가 멈출수도 있으므로
반응성과 성능에 중점을 둬야 됨.
거의 즉시
User-Initiated사용자가 시작한 작업(문서를 열거나 UI에서 어떤 것을 클릭했을 때 처럼 즉각적인 결과가 필요한 작업들)
계속해서 사용자와 상호작용을 하기 위해 필요한 작업들을 의미.
마찬가지로 반응성과 성능에 중점을 둬야 됨.
거의 즉시긴 한데몇초내로 걸림.
Utility데이터를 다운로드하거나 임포트 하는 것 처럼 즉각적인 결과를 낼 필요가 없고, 작업을 끝내는데 시간이 조금 걸리는 작업들
응답성, 성능 vs 에너지 효율의 밸런스를 맞추는데 중점을 둬야 됨.
몇초에서 몇분
Background백업, 인덱싱, 동기화처럼 백그라운드에서 작동하고 사용자에게 보이지 않는 작업들.
에너지 효율에 중점을 둬야 됨.
몇분에서 몇시간

IMPORTANT
사용자 활동이 없을 때는 앱을 유틸리티 또는 그보다 낮은 QoS(서비스 품질) 수준에서 최소한 90% 이상의 시간 동안 실행하도록 최적화할 것.

아이폰에서 저전력 모드가 활성화되면, 네트워킹을 포함한 임의의 작업과 백그라운드 작업이 일시 중단됨.

  • Special QoS 클래스
    : 주요 QoS 클래스 외에도, 특별한 유형의 QoS가 2가지 있는데요
    대부분의 경우 이러한 클래스들을 볼 일이 없지만, 알아두긴 해야된다고 하네요.
QoS 종류설명
Defaultuser-initiatedutility 사이의 우선순위.
이 QoS는 개발자들이 작업을 분류하기 위해 사용되도록 의도된 것이 아님.
QoS 정보가 할당되지 않은 작업은 기본값으로 처리되며, GCD 글로벌 큐는 이 수준에서 실행됨.
Unspecified이것은 QoS 정보의 부재를 나타내며, 시스템에 환경적 QoS를 추론하라는 신호를 준다.
스레드는 QoS에서 제외될 수 있는 레거시 API를 사용하는 경우, 명시되지 않은 QoS를 가질 수 있음.

좀 더 정확한 기준이 필요하신 분들은 Improving app responsiveness
이 문서를 참고하셔도 좋을 것 같습니다!

저는 슬쩍 훑어보기만 했는데 다음에 필요할 때 봐야겠어요.

이번 포스팅은 여기까지 하겠습니다!

0개의 댓글