Old_SWIFT(221012)/기본이야기

멀티 스레딩을 위한 API(GCD Queue)

KataRN 2022. 9. 30. 10:10
반응형

안녕하세요.

 

KataRN입니다.

 

오늘은 GCD Queue에 대해 작성하려고합니다.

 

GCD (Grand Central Dispatch)는 멀티 코어 프로세서 시스템에 대한 응용 프로그램 지원을 최적화하기 위해 Apple에서 개발한 기술입니다.

 

애플 공식 문서에서도 Thread 클래스 대신 GCD 사용을 권장한다고 합니다.

 

GCD는 백그라운드에서 스레드를 관리하면서 동시적으로 작업을 실행시키는 저수준 API를 제공하는 라이브러리입니다.

  • Dispatch Queues: 디스패치 큐는 FIFO 순서로 작업을 실행시키는 역할을 담당
  • Serial Dispatch Queue: 시리얼 디스패치 큐는 한번에 한 작업만 실행
  • Concurrent Dispatch Queue: 컨커런트 디스패치 큐는 시작한 작업이 끝나는것을 기다리지 않고 가능한 많은 작업을 실행
  • Main Dispatch Queue: 앱의 메인 스레드에서 작업을 실행할 수있는 전역에서 사용가능한 시리얼 큐

 

앱 실행시에 시스템에서 기본적으로 2개의 Queue를 만들어줍니다.

 

Main

  • UI와 관련된 작업은 모두 main큐를 통해서 수행하며 Serial Queue에 해당됩니다.
  • MainQueue를 sync메서드로 동작시키면 Dead Lock 상태에 빠집니다.

 

Global

  • UI를 제외한 작업에서 사용하며 Concurrent Queue에 해당합니다.
  • sync와 async메서드 모두 사용 가능합니다.
  • Qos클래스를 지정하여 우선순위 설정이 가능합니다.

 

QoS(Quality of service)

시스템은 QoS 정보를 통해 스케쥴링, CPU 및 I/O 처리량, 타이머 대기 시간 등의 우선 순위를 조정
총 6개의 QoS 클래스가 있으며 4개의 주요 유형와 다른 2 개의 특수 유형으로 구분 가능
[낮은순] unspecified -> background -> utility -> default -> userInitiated -> userInteractive [높은순]

Primary QoS classes

우선 순위가 높을 수록 더 빨리 수행되고 더 많은 전력을 소모
수행 작업에 적절한 QoS 클래스를 지정해주어야 더 반응성이 좋아지며, 효율적인 에너지 사용이 가능

  • User Interactive
    • 즉각 반응해야 하는 작업으로 반응성 및 성능에 중점
    • main thread 에서 동작하는 인터페이스 새로 고침, 애니메이션 작업 등 즉각 수행되는 유저와의 상호작용 작업에 할당
  • User Initiated
    • 몇 초 이내의 짧은 시간 내 수행해야 하는 작업으로 반응성 및 성능에 중점
    • 문서를 열거나, 버튼을 클릭해 액션을 수행하는 것 처럼 빠른 결과를 요구하는 유저와의 상호작용 작업에 할당
  • Utility
    • 수초에서 수분에 걸쳐 수행되는 작업으로 반응성, 성능, 그리고 에너지 효율성 간에 균형을 유지하는데 중점
    • 데이터를 읽어들이거나 다운로드 하는 등 작업을 완료하는데 어느 정도 시간이 걸릴 수 있으며 보통 진행 표시줄로 표현 Background
    • 수분에서 수시간에 걸쳐 수행되는 작업으로 에너지 효율성에 중점. NSOperation 클래스 사용 시 기본 값
    • background에서 동작하며 색인 생성, 동기화, 백업 같이 사용자가 볼 수 없는 작업에 할당
    • 저전력 모드에서는 네트워킹을 포함하여 백그라운드 작업은 일시 중지

Special QoS Classes

일반적으로, 별도로 사용할 일이 없는 특수 유형의 QoS

  • Default
    • QoS 를 별도로 지정하지 않으면 기본값으로 사용되는 형태이며 User Initiated 와 Utility 의 중간 레벨
    • GCD global queue 의 기본 동작 형태
  • Unspecified
    • QoS 정보가 없으므로 시스템이 QoS 를 추론해야 한다는 것을 의미

- 참고 : https://jinshine.github.io/2018/07/09/iOS/GCD(Grand%20Central%20Dispatch)/

 

sync / async

Dispatch Queue는 sync와 async라는 메소드를 가지고 있습니다.

- sync : 동기 처리 메소드로 해당 작업을 처리하는 동안 다음으로 진행되지 않고 계속 머물러 있습니다.

- async : 비동기 처리 메소드로 sync와는 다르게 처리를 하라고 지시후 다음으로 넘어갑니다.

 

 

구체적인 예제는 추후 추가하도록 하겠습니다.

오늘도 긴 글 읽어주셔서 감사합니다.

 

반응형