본문 바로가기
Swift/Basic

GCD

by songmoro 2024. 10. 31.
728x90

GCD, Grand Central Dispatch

  • 병렬 코드 실행을 단순화하는 동시성 프로그래밍을 위한 프레임워크
  • 공유된 스레드 풀을 관리하는 주체
  • 스레드 관리의 복잡성을 추상화하여 수행할 작업에 집중
  • 새로운 스레드를 생성하는 경우
    • sync는 스레드 재사용, async는 스레드 생성

 

Dispatch Queue

  • 스레드를 다루는 GCD의 구성 요소
  • 보통 Dispatch Queue를 통해 작업을 지시하고, 컴플리션 핸들러를 통해 작업 완료를 알림
  • Thread safe하게 스레드들을 관리할 수 있는 도구
    • 멀티 스레드에서 어떤 함수, 변수, 객체에 여러 스레드가 동시에 접근해도 문제가 발생하지 않음
    • Re-entrancy: 하나의 일에 대해 부분적으로 실행
    • Mutual exclusion, Mutex: 공유된 데이터에 대해서 오직 하나만의 스레드만 읽거나 씀
    • Thread-local storage : 변수들은 지역화되어 있기 때문에 스레드는 private copy를 가짐
    • Atomic operations, lock 메커니즘: 공유된 데이터는 atomic 연산자에 의해서 처리
      • 다른 스레드에 의해서 인터럽트 않음
  • FIFO
  • Queue는 크게 두 가지
    • Serial Queue: Main Queue
    • Concurrent Queue: Global Queue
  • Task는 크게 두 가지
    • Sync, Async

 

NSOperation

  • GCD 기반
  • GCD에서 사용하기 어려운 기능을 위해 사용
    • 작업 중 취소 기능
    • 작업 전 다른 작업의 실행을 위해
    • 작업의 실행에 우선 순위 부여
    • 작업에 대한 상태 관리(취소, 정지, 시작)

 

Thread Explosion

  • 동시성 작업에서 너무 많은 스레드가 생성되어 컨텍스트 스위칭으로 인해 시스템의 성능이 저하되는 상황
    • 일반적으로 작업을 비동기 처리할 때 스레드를 생성
    • 관리되지 않는 스레드 생성이 쌓임
    • CPU가 너무 많은 스레드를 전환하는데 자원을 소비
    • 작업 처리 성능 저하 -> 시스템 성능 저하
  • 원인
    • 과도한 비동기 작업: 비동기 작업이 동시에 과도하게 발생
    • 병렬 큐 남용: 병렬 큐에서 비동기 작업이 필요 이상으로 많음
    • 스레드 풀의 한계: 스레드 풀에 허용된 스레드 수를 넘어서면 새로운 작업 요청이 새로운 스레드를 생성
    • Blocking 작업: 각 스레드가 실행 중 오래 걸리는 작업을 수행하면, 다른 작업을 위해 스레드 생성이 계속됨 -> 데드락
  • 문제
    • CPU 오버헤드 증가: 많은 스레드 전환(컨텍스트 스위칭) 때문에 CPU가 실질적인 작업보다 스레드 관리에 더 많은 시간 할애
    • 메모리 고갈: 각 스레드가 사용하는 메모리가 누적되어 메모리 부족 현상 발생
  • 방지
    • 비동기 작업 수 제한: 세마포어
    • QoS 사용: 중요하지 않은 작업은 QoS 지정
    • 태스크 그룹: 관련 작업은 같은 스레드에서
    • 의존성 관리: NSOperation 작업 의존성

 

728x90

'Swift > Basic' 카테고리의 다른 글

Data Type  (0) 2024.11.07
Concurrency  (0) 2024.11.07
Memory Management  (0) 2024.10.31
Memory  (0) 2024.10.31
Thread  (0) 2024.10.31