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 |