iOS/Swift Concurrency

swift concurrency 등장배경

Hamp 2024. 10. 24. 17:55
반응형

[수정 2025.08.29]

회사에서 컨커런시를 깊게 공부한 팀원이, 스터디를 진행하는데, 몰랐던 내용과 조금 더 상세한 내용을

추가하거나 수정하려고한다.


파란색 제목은 모두 스터디를 진행한 팀원분의 자료에서

정리한 것을 참고했다는 점


🙏 동시성 VS 병렬성

 

동시성은 same time에 실행되는 것처럼 보이는 개념

 

병렬성은 실제 물리적으로 same time에 실행되는 개념


⏰ 과거 동시성 프로그래밍을 위한 기술

 

🧵NSTread와 PThread(POSIX Therad)

1. PThread(POSIX Thread)

  • POSIX 표준 스레드 API (C 함수 기반)
  • 가장 저수준의 스레드 제어 방법
  • ptherad_create, pthread_join 같은 함수로 직접 스레드 관리
  • iOS, macOS의 커널에서 실제 스레드를 실행할 떄, 사용되는 기술

 

2.NSThread

특징

  • Foundation 프레임워크에서 제공되는 객체지향 스레드 클래스
  • 내부적으로 pthread를 래핑해서 동작
  • Objective-C/Swift 코드에서 더 편리하게 스레드를 다룰 수 있는 고수준 API

한계

  • 부모 자식 관계가 없음
  • 개발자가 직접 스레드를 생성 (관리가 힘듬)
  • 호출 스택만으로 0.5키로 바이트정도를 차지
  • 스레드가 많아지면, 호출 스택만으로도 메모리가 폭발적으로 증가

 

💿 GCD (Grand Central Dispatch)

https://www.nyctourism.com/articles/guide-to-grand-central-terminal/

유래

  • GCD는 미국 NewYork에 있는 Grand Central Terminal에서 유래됐다고 한다. (유래까지 조사해오는 팀원 클라스)

목표

  • 안정함
    • 운영체제가 스레드 관리하고
  • 간편함
    • 작업단위는 클로저 형태로 큐에 넣어, 어떤 순서로 실행할지 관리

한계

  • 스레드 Block
  • thread explosion
    • 스레드 poll에 가용가능한(idle) 스레드가 없으면, 스레드를 생성함
    • 특히 custom concurrent queue를 만들 때, 여전히 thread-explosiona이 발생 가능, concurrent queue 사용 시, global queue를 권장
  • 우선순위 역전 현상 발생 가능(Queue 기반이기 때문에)

🥳  등장 배경

과거 동시성의 한계를 살펴봤다, 컨커린시 기준으로 바로 직전 기술이 GCD 기반으로 등장배경을 살펴보자.

 

 

기존의 코드는 탈출 클로저를 사용해서 비동기를 처리했다.

조금 극단적이긴하지만 보통 다음과 같은 상횡이다.

 

여기에는 크게 4가지 문제점이 있다. 

 

1. 중첩된 콜백

첫번째 문제점은 중첩된 콜백형태가 코드 가독성이 top -down approch에 위배된다.

코드는 보통 위에서 아래로 읽게 되는데 콜백이 중첩되면 아래에서 위로 올라가는 구조가 발생된다.

 

2. 에러 핸들링

에러가 발생할 때 탈출 메서드에 에러 관련 처리를 해줘야하는데 그 과정이 매우 번거롭다.

 

async , await을 이용해서 위 코드를 리팩할 수 있다.

 

코드 가독성과 에러 헨들링이 비약적으로 상승되는 효과를 볼 수 있다. 

 

3. thread explosion

 

기존 GCD에서 Concurrent Queue를 사용했을 때, 100개의 Task를 진행한다면 100개의 Thread가 생성된다.

 

 경우 CPU 가진 스레드의 수보다 많은 스레드가 생성되기 때문에 Thread Explosion 발생한다.

여기서 메모리 오버헤드, 스케줄링 오버헤드의 문제가 생긴다.

 

  1. 메모리 오버헤드
    • block 스레드는 메모리와 리소스를 보유하고 있다.
    • 일부는 다른 스레드에 필요한 lock 가지고 있을 수도 있기 때문에, 최악의 경우에는 데드락이 발생할 수도 있다.
  2. 스케줄링 오버헤드
    • CPU는 이전 스레드에서 새로운 스레드로 전환할 때 context switch를 수행한다.
    • 스레드의 갯수가 많아질수록 context switch가 많아지므로 CPU의 효율성이 낮아진다.


🎯 컨커런시의 목표

스터디에서 정리한 컨커런시의 목표는 다음과 같다.

  • 안전하고, 구조화된 동시성 프로그래밍을 구현하는 것
  • 적당한 스레드로 조절하는 것 (Thread-explosion 방지), 스레드 스위칭 오버헤드 절감
  • 스레드 생성은 OS(시스템)이, 개발자가 만들지 않을 것
  • 시스템이 만들어 놓은 스레드에, 코드를 보내는 패러다임
반응형