iOS Swift/iOS Swift - 기초

[iOS/Swift] GCD 멀티스레딩 with DispatchQueue (1)

주니어코더 2024. 3. 13. 17:56

 

 

 

 

 

 

 

GCD를 이용한
iOS 멀티스레딩 프로그래밍

 

 

Apple Developer 공식 문서를 살펴보며

iOS에서 GCD를 이용한 멀티스레딩 프로그래밍 방법을 알아보자

 

 

 

목차 

 

  1. 멀티 스레드란?
  2. GCD는 무엇?
  3. DispatchQueue란?
  4. Serial VS Concurrent
  5. DispatchQueue의 종류 - Main, Global, Custom
  6. qos
  7. Sync VS Async

 

 

 

 

 

 

 

 

멀티 스레드(Multi Thread)란?


 

멀티 스레드는 하나의 프로세스 내에서 여러 스레드가 동시에 작업을 수행하는 것

 

하나의 프로세스 내에서 여러 개의 스레드가 존재하고

스레드들이 프로세스의 자원을 공유하되 실행은 독립적으로 이루어지는 구조

 

 

 

 

 

 

GCD(Grand Central Dispatch)란?


 

GCD는 Grand Central Dispatch의 약자로

먼저 애플 공식 문서에는 GCD에 대해 이렇게 설명한다

 

 

https://developer.apple.com/documentation/DISPATCH

 

Dispatch | Apple Developer Documentation

Execute code concurrently on multicore hardware by submitting work to dispatch queues managed by the system.

developer.apple.com

 

 

Dispatch, also known as Grand Central Dispatch (GCD), contains language features, runtime libraries, and system enhancements that provide systemic, comprehensive improvements to the support for concurrent code execution on multicore hardware in macOS, iOS, watchOS, and tvOS.

 

위 글을 해석하면

 

GCD(Grand Central Dispatch)라고도 알려진 Dispatch에는 macOS, iOS, watchOS 및 tvOS의 멀티코어 하드웨어에 대한

동시 코드 실행 지원에 대한 체계적이고 포괄적인 개선 사항을 제공하는 언어 기능, 런타임 라이브러리 및 시스템 개선 사항이 포함되어 있습니다.

 

한마디로 GCD는 Apple 의 다중 스레드 프로그래밍 기술이다

 

GCD의 개념으로 동시성 프로그래밍을 지원하는 Swift의 API가 DispatchQueue이다!

 

 

 

 

 

DispatchQueue란?


 

Dispatch: 보내다, Queue: 대기열

둘을 합치면? DispatchQueue: 대기열에 보내다 

 

애플 개발자 공식문서에서 DispatchQueue에 대해 설명을 보자

 

https://developer.apple.com/documentation/dispatch/dispatchqueue

 

DispatchQueue | Apple Developer Documentation

An object that manages the execution of tasks serially or concurrently on your app's main thread or on a background thread.

developer.apple.com

 

Dispatch queues are FIFO queues to which your application can submit tasks in the form of block objects. Dispatch queues execute tasks either serially or concurrently. Work submitted to dispatch queues executes on a pool of threads managed by the system. Except for the dispatch queue representing your app's main thread, the system makes no guarantees about which thread it uses to execute a task.

 

위 글을 해석하면

 

Dispatch queues는 애플리케이션이 블록 객체 형태로 작업을 제출할 수 있는 FIFO Queues입니다. 

Dispatch queues는 작업을 순차적으로 또는 동시에 실행합니다. 

Dispatch queues에 제출된 작업은 시스템에서 관리하는 스레드 풀에서 실행됩니다. 

앱의 메인 스레드를 나타내는 디스패치 큐를 제외하고 시스템은 작업을 실행하는 데 어떤 스레드를 사용하는지 보장하지 않습니다.

 

 

한마디로

DispatchQueue는 GCD API에서 Thread 관리하는 Class이다
DispatchQueue 종류SerialQueueConcurrentQueue 두종류이다

 

 

 

 

 

 

SerialQueue VS ConcurrentQueue


 

DispatchQueueSerialQueue, ConcurrentQueue 두 가지로 나뉜다

 

Serial, Concurrnet 그게 뭐야? 🤔

Serial: 직렬의, Concurrent: 동시의

 

SerialQueue: 직렬큐로 이전 작업이 끝나면 다음 작업을 순차적으로 실행하는 큐

ConcurrentQueue: 동시큐로 이전 작업이 끝날 때까지 기다리지 않고 병렬 형태로 동시에 실행하는 큐

 

그럼 직렬큐와 동시큐의 차이는 뭔데?

 

SerialQueue ConcurrentQueue
이전 작업이 끝나면 다음 작업을 순차적으로 실행하는 직렬 형태의 큐 이전 작업이 끝날때 까지 기다리지 않고 병렬 형태로 동시에 실행하는 큐
분산처리 시킨 작업을 다른 한개의 쓰레드에서 처리하는 큐 분산처리 시킨 작업을 다른 여러개의 쓰레드에서 처리하는 큐
한 번에 하나의 작업만 수행 동시에 여러 작업을 수행

 

 

 

 

 

 

DispatchQueue의 종류 - Main, Global, Custom


 

DispatchQueue는 세 가지 종류(Main, Global, Custom)가 있다

 

 

Main Queue

  • Main Queue는 Main Thread에서 실행되는 DispatchQueue
  • UI 작업을 하는 코드는 메인 스레드에서 실행
  • Serial Queue의 특성을 가져 단일 스레드

 

 

Global Queue

  • Global Queue는 Main Thread가 아닌 Thread에서 실행되는 DispatchQueue
  • QoS(Quality of Service) 설정 가능
  • Concurrent 특성을 가진 Queue

 

QoS는 아래에서 더 자세히 알아보자

 

 

Custom Queue

  • Custom으로 생성하는 Queue
  • 기본은 Serial이지만 Concurrent로 설정 가능
  • QoS(Quality of Service) 설정 가능
  • 매개변수에는 label, qos, attributes가 존재

 

 

 

 

 

 

QoS (Quality of Service)


 

QoS는 Quality of Service의 약자로 Concurrent 하게 작업을 처리하면서 작업의 우선순위를 지정하기 위해 사용한다

 

우선 순위 이름 설명
1 userInteractive 사용자와 직접 상호작용하는 작업 ex)UI 업데이트, 에니메이션
2 userInitiated 사용자가 시작한 작업 ex)저장된 문서 열기
3 default 일반적인 작업
4 utility 사용자가 의도하였지만, 지속적으로 관찰하진 않는 작업 ex)progress bar
5 background 백그라운드에서 실행되는 작업 ex)동기화, 백업, Network작업
6 unspecified QoS 정보가 없음

 

 

 

 

 

 

Sync VS Async


 

Sync(동기)

  • 현재 스레드에서 작업이 완료될 때까지 대기하며, 작업이 완료될 때까지 다음 코드가 실행되지 않는다
  • 현재의 Queue는 block상태가 되며 그 작업이 끝날 때까지 기다려야 한다

 

 

❗️❗️❗️ 주의 ❗️❗️❗️

Sync 작업은 메인 스레드에서 주의해서 사용해야 한다

메인 스레드에서 Sync 작업을 실행하면 UI가 응답하지 않게 되어 데드락을 유발할 수 있다

 

 

 

Async(비동기)

  • Async는 작업을 현재 스레드와 별개의 다른 스레드에서 실행
  • Async 작업은 작업을 큐에 추가한 후에 즉시 다음 코드를 실행하며, 작업이 완료될 때까지 기다리지 않는다
  • 주로 메인 스레드를 차단하지 않고 비동기 작업을 수행할 때 사용한다. 주로 네트워크 호출, 파일 다운로드, 계산량이 많은 작업 등을 처리할 때 사용

 

 

 

👇👇👇 Async와 Sync에 대한 자세한 포스팅 👇👇👇

 

https://ohwhatisthis.tistory.com/24

 

[iOS/Swift] Async Sync 비동기 동기 처리 개념 예제

Swift 언어를 사용하여 동기(Synchronous)와 비동기(Asynchronous) 이해 🔥 예제를 통해 알아보자! 대용량 처리를 할 때 스레드는 어떻게 될까? 네트워크 통신 혹은 대용량 파일 처리하는 스레드의 경우

ohwhatisthis.tistory.com

 

 

 

 

 

 

 

 

 

 

반응형