동시성

JG Ahn·2024년 11월 8일

swift 심화

목록 보기
7/18
post-thumbnail

동시성(Concurrency) 프로그래밍이란?

한번에 여러 작업을 동시에 수행하는 것을 목표로 하는 프로그래밍 방식

  • 하나의 프로세스에는 여러 개의 쓰레드가 존재하며, 각 쓰레드에서 병렬 작업을 수행
  • 별도로 지정하지 않으면 메인 쓰레드에서 작업이 진행됨

메인 쓰레드

  • UI 작업을 할 수 있는 유일한 쓰레드 (다른 쓰레드에서 UI작업을 할 경우 크래시 발생)
  • 별도로 쓰레드를 분리하지 않는다면, 모든 작업은 기본적으로 메인 쓰레드에서 실행
  • 메인 쓰레드에서 모든 작업을 처리할 경우, 속도 지연 및 성능 저하 문제가 발생할 수 있음

GCD(Grand Central Dispatch)

  • GCD는 iOS에서 제공하는 동시성프로그래밍을 쉽게 처리하기 위한 도구 중 하나
  • 작업을 Queue에 추가하면 OS가 적절한 Thread에게 일을 할당하여 처리
  • DispatchQueue를 사용하여 여러 개의 쓰레드에 업무를 분담 시킬 수 있다
  • DispatchQueue는 주로 2가지 큐를 제공하며 Main Queue, Global Queue로 구성
  • Queue를 사용하기 때문에 먼저 들어온 업무를 먼저 Thread에 전달함(FIFO)

Main Queue

  • 메인 쓰레드로 작업을 전달하는 Queue
  • 들어온 일을 하나씩 처리한다고 하여 Serial Queue(직렬큐)라고 불립니다.
DispatchQueue.main.async {
	// 작업
}

Global Queue

들어온 여러가지 작업을 동시에 처리할 수 있어 Concurrent Queue(병렬큐)라고도 불림

  • Global Queue에 할 일을 추가하면 OS는 여러 개의 쓰레드 분할 처리
  • 작업 우선순위를 지정하는 Quality of Service(QoS)를 설정 가능
    • 우선순위를 통해 자원분배를 효율적으로 수행
    • .userInteractive
      • 가장 높은 우선순위, 사용자에게 즉각적인 반응을 줘야 할 때 사용.
      • 애니메이션, 터치 이벤트 등
    • .userInitiated
      • 문서열기, 이미지 로드 등
    • .default
    • .utility
      • 긴 시간이 걸릴 수 있는 작업
      • 백그라운드에서 데이터 동기화, 파일 다운로드 등
    • .background
      • 사용자에게 보이지 않거나 중요하지 않은 작업
      • 데이터 백업, 데이터 정리 등등
    • .unspecified
      • QoS가 지정되지 않은 상태로, 시스템이 우선순위를 정하게 함
      • 사용되지 않음
DispatchQueue.global(qos: .background).async {
	// 사용자에게 보이지 않거나 중요하지 않은 작업 
}

async vs sync

각각의 Queue에는 동기 또는 비동기적으로 작업을 할당 가능

  • sync (동기)
    • 작업이 순차적으로 실행
    • 현재 작업이 끝날 때 까지 다음 작업은 대기
    • 작업이 끝날때까지 대기하기 때문에 대기시간 발생
    • 순서대로 실행되므로, 코드의 흐름을 이해하기 편하고 디버깅이 간편하지만, 성능 저하 발생할 수 있음
import UIKit

DispatchQueue.main.sync {
	print("Hello")
}

print("world")

// sync의 작업이 끝나기전에 print("world")가 호출되지 않음
// "Hello" "World"가 출력됨
  • async(비동기)
    • 작업 시작 후, 작업이 완료될때까지 기다리지 않고 다음 코드를 바로 실행
    • 여러 작업이 병행되어 빠른 처리가 가능하지만, 결과를 기다리는 구조로 인해 코드가 복잡해 질 수 있음

0개의 댓글