Swift Concurrency - Thread Explosion

Tabber·2일 전

Swift Concurrency

목록 보기
6/7

스레드 폭주 (Thread Explosion)란?

스레드 폭주는 시스템이 감당할 수 없을 정도로 너무 많은 스레드가 한꺼번에 만들어져서, 오히려 성능이 뚝 떨어지거나 앱이 멈추는 현상을 말해요.

왜 발생하나요?

기존의 GCD 방식에서는 우리가 작업을 던질 때마다 시스템이 "어? 작업이 더 들어왔네? 스레드 하나 더 만들지 뭐~(스레드 생성 드가자)" 하고 스레드를 계속 늘릴 수 있었어요.

  • 상황 : 1,000개의 이미지 다운로드 작업을 동시에 던짐
  • 문제 : GCD가 1,000개의 스레드를 만들려고 시도함.

결과

  1. 메모리 부족 : 스레드 하나당 약 1MB의 메모리가 필요한데, 1,000개면 1GB가 스레드에 유지에만 쓰여요.
  2. Context-switching 지옥 : CPU는 하나인데 스레드는 너무 많으니, CPU가 일은 안 하고 "누구 일 해줄까?" 고민하며 스레드를 바꾸는 데에만 모든 에너지를 소모해요.

Swift의 해결책

Swift Concurrency는 코어 개수(예를 들자면 8개)만큼만 스레드를 딱 고정해서 만들어요.
일이 많아도 스레드를 더 만드는게 아니라, await을 만나면 하던 일을 잠시 내려놓고 다른 일이 집어 드는 "협력적(Cooperative)" 방식을 사용해 폭주를 막아요.

profile
iOS 정복중인 Tabber 입니다.

0개의 댓글