Swift

[Swift] GCD vs Swift Concurrency: 스레드 관리와 성능

yujaehui 2024. 4. 15. 12:47

GCD vs Swift Concurrency: 스레드 관리와 성능

GCD(Grand Central Dispatch)와 Swift Concurrency는 비동기 작업을 처리하고자 할 때, 스레드 관리 방식에 차이가 존재.

이 차이는 성능, 자원 효율성, 스레드 관련 문제에서 나타나게 됨.

특히 thread explosion이나 컨텍스트 스위칭과 같은 문제는 GCD에서 발생할 수 있음.


1. GCD에서의 스레드 관리

1.1. GCD의 기본 동작

GCD는 스레드 풀(thread pool)을 사용하여 작업을 처리. 비동기 작업이 큐에 적재되면, 큐는 적절한 스레드를 선택하여 작업을 실행.

시스템 리소스를 효율적으로 관리하기 위해 여러 개의 작업을 동시에 병렬 처리하며, 이를 통해 멀티코어 CPU의 성능을 최대한 활용한다고 볼 수 있음.

DispatchQueue.global().async {
    // 백그라운드에서 실행될 작업
}

1.2. Thread Explosion

GCD는 동시 큐(Concurrent Queue)에서 여러 작업을 병렬 처리하는데, 큐에 많은 작업이 제출되면 스레드 풀 한계에 도달하고, 새로운 스레드를 생성.

이때 과도한 스레드 생성으로 인해 시스템의 메모리 사용량과 CPU 부하가 증가하여 Thread Explosion이 발생할 수 있음.

스레드가 지나치게 많아지면 CPU가 컨텍스트 스위칭에 많은 시간을 소비하게 되어 성능이 급격히 저하될 수 밖에 없음.

  • 컨텍스트 스위칭
    • CPU가 한 스레드에서 다른 스레드로 전환할 때 발생하는 오버헤드.
    • 스레드의 수가 많아질수록 빈번한 전환으로 인해 성능 저하가 발생.

예시: 많은 비동기 작업이 동시에 큐에 제출되어 스레드 폭발이 발생하는 경우

for _ in 1...10000 {
    DispatchQueue.global().async {
        // 과도한 비동기 작업 실행
        print("작업 실행")
    }
}
  • 짧은 시간에 수천 개의 작업을 제출하여 스레드가 급격히 증가할 수 있고, 이로 인해 thread explosion 및 성능 저하가 발생할 수 있음.

2. Swift Concurrency에서의 스레드 관리

2.1. Swift Concurrency의 스레드 동작

Swift Concurrency는 스레드가 아닌 경량화된 Task를 사용하여 비동기 작업을 처리.

Task는 GCD의 스레드와 달리 시스템 리소스를 효율적으로 사용하며, 스레드 수를 과도하게 증가시키지 않고 작업을 처리할 수 있음.

2.2. thread explosion 방지

Swift Concurrency는 thread explosion을 방지하기 위해 Work-Stealing과 같은 알고리즘을 사용.

이 알고리즘은 여러 작업을 동적으로 스케줄링하여 필요 이상으로 스레드를 많이 사용하지 않도록 관리.

Swift Concurrency의 스케줄러는 오직 작업이 필요할 때만 스레드를 생성하고, 스레드 간의 작업 부하를 자동으로 조정.


3. GCD와 Swift Concurrency의 스레드 관리 비교

  GCD Swift Concurrency
작업 처리 방식 스레드 풀에서 작업을 스케줄링 및 실행 Task를 경량화된 단위로 스케줄링 및 실행
스레드 폭발 과도한 비동기 작업 제출 시 스레드 폭발 위험 경량화된 Task로 스레드 폭발 문제 해결
컨텍스트 스위칭 다수의 스레드로 인한 컨텍스트 스위칭 빈번 스레드를 효율적으로 재사용하여 컨텍스트 스위칭 감소
성능 최적화 스레드 관리에 따른 성능 저하 가능 Task 간 스레드 재사용 및 효율적 스케줄링으로 성능 최적화

4. Swift Concurrency가 GCD보다 스레드 관리에서 우월한 이유

  • 경량화된 Task
    • Swift Concurrency의 Task는 GCD의 스레드보다 가볍고, 스레드를 효율적으로 재사용할 수 있음.
  • thread explosion 방지
    • Swift Concurrency는 thread explosion 문제를 해결하기 위해 스레드 풀을 동적 관리하고, 필요할 때만 스레드를 생성하여 작업을 처리.
  • 컨텍스트 스위칭 감소
    • Swift Concurrency는 작업 간의 컨텍스트 스위칭을 최소화하여 CPU 자원을 절약하고, GCD보다 성능이 우수.
  • Work-Stealing 알고리즘
    • 작업 부하를 자동으로 조정하여 스레드를 적절히 분배하고, 과도한 스레드 생성을 방지.

5. GCD와 Swift Concurrency의 선택 기준

  • GCD는 여전히 저수준 스레드 관리와 제어가 필요한 경우 유용하기에, 복잡한 스레드 관리나 세밀한 성능 최적화가 필요할 때 적합할 수 있음.
  • Swift Concurrency는 비동기 작업의 가독성을 높이고 스레드 관리의 복잡성을 자동으로 처리하기에, 비동기 작업을 효과적으로 처리할 때 적합.

'Swift' 카테고리의 다른 글

[Swift] Protocol  (0) 2024.04.18
[Swift] Generic  (0) 2024.04.15
[Swift] Swift Concurrency  (0) 2024.04.15
[Swift] GCD  (0) 2024.04.13
[Swift] ARC  (0) 2024.04.13