Dispatch(GCD)

Groot·2022년 10월 10일
0

TIL

목록 보기
81/148
post-thumbnail

TIL

🌱 난 오늘 무엇을 공부했을까?

📌 Dispatch

  • 시스템에서 관리하는 디스패치 대기열에 작업을 제출하여 멀티코어 하드웨어에서 동시에 코드를 실행합니다.

Overview

  • GCD(Grand Central Dispatch)라고도 하는 Dispatch에는 macOS, iOS, watchOS 및 tvOS의 멀티코어 하드웨어에서 동시 코드 실행 지원에 대한 체계적이고 포괄적인 개선 사항을 제공하는 언어 기능, 런타임 라이브러리 및 시스템 개선 사항이 포함되어 있습니다.

  • BSD 하위 시스템, Core Foundation 및 Cocoa API는 모두 이러한 개선 사항을 사용하도록 확장되어 시스템과 애플리케이션이 모두 더 빠르고 효율적이며 향상된 응답성을 제공하도록 지원합니다.
  • 단일 응용 프로그램이 여러 개의 코어를 효과적으로 사용하는 것이 얼마나 어려운지 생각해 보십시오. 컴퓨팅 코어 수가 다른 여러 컴퓨터에서 또는 이러한 코어를 놓고 경쟁하는 여러 응용 프로그램이 있는 환경에서 수행하는 것은 고사합니다.
  • 시스템 수준에서 작동하는 GCD는 실행 중인 모든 응용 프로그램의 요구 사항을 더 잘 수용하여 균형 잡힌 방식으로 사용 가능한 시스템 리소스와 일치시킵니다.

📌 DispatchQueue

  • 앱의 메인 스레드나 백그라운드 스레드에서 순차적으로 또는 동시에 실행되는 작업을 관리하는 개체입니다.

📍 Declaration

class DispatchQueue : DispatchObject

📍 Overview

  • 디스패치 큐는 애플리케이션이 블록 객체 형태로 작업을 제출할 수 있는 FIFO 큐입니다.
  • 디스패치 큐는 작업을 순차적으로 또는 동시에 실행합니다.
  • 디스패치 큐에 제출된 작업은 시스템에서 관리하는 스레드 풀에서 실행됩니다.
  • 앱의 기본 스레드를 나타내는 디스패치 큐를 제외하고 시스템은 작업을 실행하는 데 사용하는 스레드를 보장하지 않습니다.

  • 작업 항목을 동기식 또는 비동기식으로 예약합니다.
  • 작업 항목을 동기적으로 예약하면 해당 항목의 실행이 완료될 때까지 코드가 기다립니다.
  • 작업 항목을 비동기식으로 예약하면 작업 항목이 다른 곳에서 실행되는 동안 코드가 계속 실행됩니다.

    Important
    main queue에서 작업 항목을 동기적으로 실행하려고 하면 교착 상태가 발생합니다.

📍 Avoiding Excessive Thread Creation

  • 동시 실행을 위한 작업을 설계할 때 현재 실행 스레드를 차단하는 메서드를 호출하지 마십시오.
  • 동시 디스패치 대기열에 의해 예약된 작업이 스레드를 차단하면 시스템은 대기열에 있는 다른 동시 작업을 실행하기 위해 추가 스레드를 생성합니다.
  • 너무 많은 작업이 차단되면 시스템에서 앱의 스레드가 부족해질 수 있습니다.

  • 앱이 너무 많은 스레드를 사용하는 또 다른 방법은 너무 많은 개인 동시 디스패치 큐를 만드는 것입니다.
  • 각 디스패치 큐는 스레드 리소스를 소비하기 때문에 추가 동시 디스패치 큐를 생성하면 스레드 소비 문제가 악화됩니다.
  • 개인 동시 대기열을 만드는 대신 전역 동시 디스패치 대기열 중 하나에 작업을 제출하십시오.
  • 직렬 작업의 경우 직렬 대기열의 대상을 전역 동시 대기열 중 하나로 설정합니다.
  • 그렇게 하면 스레드를 생성하는 개별 큐의 수를 최소화하면서 큐의 직렬화된 동작을 유지할 수 있습니다.

📍 Memory Management for Dispatch Queues

  • 디스패치 큐 및 기타 디스패치 객체는 참조 카운트 데이터 유형입니다.
  • 직렬 디스패치 대기열을 만들 때 초기 참조 횟수는 1입니다.
  • dispatch_retain 및 dispatch_release 함수를 사용하여 필요에 따라 해당 참조 횟수를 늘리거나 줄일 수 있습니다.
  • 대기열의 참조 횟수가 0에 도달하면 시스템이 대기열을 비동기적으로 할당 해제합니다.

  • 큐와 같은 디스패치 객체를 유지하고 해제하여 사용되는 동안 메모리에 남아 있도록 하는 것이 중요합니다.
  • 메모리 관리 Cocoa 객체와 마찬가지로 일반적인 규칙은 코드에 전달된 대기열을 사용하려는 경우 대기열을 사용하기 전에 유지하고 더 이상 필요하지 않을 때 해제해야 한다는 것입니다.

📍 DispatchQoS

🔗 Getting the Quality-of-Service Class

userInteractive -> userInitiated -> default -> utility -> background -> unspecified

profile
I Am Groot

0개의 댓글