안녕하세요!
오늘은 QoS에 대해 알아보려고 합니다.
동시성 프로그래밍을 공부하던중 QoS에 대해 궁금증이 생겨 공식문서 리뷰를 해보려고 합니다!
틀린 내용과 오역이 있을수도 있으니... 피드백 언제든지 환영입니다!
앱과 작업들은 CPU, 메모리, 네트워크 인터페이스같은 유한한 자원을 두고 늘 경쟁을 하잖아요?
자원은 한정되어 있으니 어느 작업은 빨리 끝날것이고 다른 작업은 늦게 끝나게 될건데.. 이때 UI를 업데이트 하는 작업처럼 꼭 빨리 끝나야만 하는! 작업이 늦게 끝나게 된다면 큰일 나겠죠..?
따라서 반응성과 효율성을 위해 시스템은 작업에 우선순위(QoS; Quality of Service)를 둘 필요가 생기게 됩니다!
UI 업데이트처럼 사용자에게 직접적으로 영향을 주는 작업은 매우 중요하고, 백그라운드에서 발생하는 다른 작업들보다 더 높은 우선순위를 가지게 되는데요. 이러한 작업들은 빨리 완료되야 하므로 더 많은 에너지를 사용하고 시스템 자원에 빠른 접근을 할 필요가 생기게 됩니다.
시스템이 어느정도는 알아서 우선순위를 매겨주겠지만 개발자도 중요도에 따라 앱의 작업들을 잘 분류할 필요가 있습니다.
QoS 클래스는 NSOperation, NSOperationQueue, NSThread 객체, Dispatch queue, pthreads(POSIX threads)에 의해 작업을 분류하는데 사용됩니다.
작업에 QoS를 할당하면 시스템은 QoS에 따라 우선순위를 두고 스케쥴링을 하게 되는 것 입니다!
스케쥴링을 하면서 시스템 자원은 낮은 우선순위를 가진 작업에서 더 높은 우선순위를 가진 작업으로 재할당 될 수도 있겠죠?
위에서 더 높은 우선순위를 가진 작업들이 자원을 더 많이 사용하고 더 빨리 수행되기 때문에, 일반적으로 더 많은 에너지를 사용한다고 했는데요. 따라서 QoS를 적절히 나누는 것은 앱이 에너지 효율적이고 반응적임을 보장하게 됩니다!
공식문서에는 스케쥴링, CPU와 I/O 처리율, 타이머 지연과 같이 우선순위를 조정하는데 QoS 정보를 사용한다고 했는데요.
여기서 든 의문..
'스케쥴링은 당연히 우선순위와 관련이 있지만 나머지는..?'이라는 생각이 들어 구글링하던 중 깨닫게 되었습니다!
CPU 또는 I/O의 처리율(throughput)과 우선순위타이머 지연(timer latency)과 우선순위자 그럼 본격적으로 QoS의 종류에 대해 알아보도록 하죠!
공식문서에서는 작업에 QoS를 할당할 때, 유저와 다른 작업들에게 얼마나 영향을 미칠지 생각하라고 하는데요.
의역이 조금 들어갔지만.. 아래 표를 기준으로 고민하시면 될 것 같습니다...!
| QoS 종류 | 작업의 종류와 Qos의 초점 | 실행시간 |
|---|---|---|
User-interactive | 메인 스레드에서 수행되거나, UI를 업데이트하거나, 애니메이션을 수행하는 것 처럼 유저와 직접적으로 상호작용하는 작업들 만약 작업이 빠르게 수행되지 않으면 UI가 멈출수도 있으므로 반응성과 성능에 중점을 둬야 됨. | 거의 즉시 |
| User-Initiated | 사용자가 시작한 작업(문서를 열거나 UI에서 어떤 것을 클릭했을 때 처럼 즉각적인 결과가 필요한 작업들) 계속해서 사용자와 상호작용을 하기 위해 필요한 작업들을 의미. 마찬가지로 반응성과 성능에 중점을 둬야 됨. | 거의 즉시긴 한데몇초내로 걸림. |
| Utility | 데이터를 다운로드하거나 임포트 하는 것 처럼 즉각적인 결과를 낼 필요가 없고, 작업을 끝내는데 시간이 조금 걸리는 작업들 응답성, 성능 vs 에너지 효율의 밸런스를 맞추는데 중점을 둬야 됨. | 몇초에서 몇분 |
| Background | 백업, 인덱싱, 동기화처럼 백그라운드에서 작동하고 사용자에게 보이지 않는 작업들. 에너지 효율에 중점을 둬야 됨. | 몇분에서 몇시간 |
IMPORTANT
사용자 활동이 없을 때는 앱을 유틸리티 또는 그보다 낮은 QoS(서비스 품질) 수준에서 최소한 90% 이상의 시간 동안 실행하도록 최적화할 것.
아이폰에서 저전력 모드가 활성화되면, 네트워킹을 포함한 임의의 작업과 백그라운드 작업이 일시 중단됨.
| QoS 종류 | 설명 |
|---|---|
| Default | user-initiated와 utility 사이의 우선순위.이 QoS는 개발자들이 작업을 분류하기 위해 사용되도록 의도된 것이 아님. QoS 정보가 할당되지 않은 작업은 기본값으로 처리되며, GCD 글로벌 큐는 이 수준에서 실행됨. |
| Unspecified | 이것은 QoS 정보의 부재를 나타내며, 시스템에 환경적 QoS를 추론하라는 신호를 준다. 스레드는 QoS에서 제외될 수 있는 레거시 API를 사용하는 경우, 명시되지 않은 QoS를 가질 수 있음. |
좀 더 정확한 기준이 필요하신 분들은 Improving app responsiveness
이 문서를 참고하셔도 좋을 것 같습니다!
저는 슬쩍 훑어보기만 했는데 다음에 필요할 때 봐야겠어요.
이번 포스팅은 여기까지 하겠습니다!