Process와 Thread의 차이점
| 구분 | 프로세스 (Process) | 스레드 (Thread) |
|---|
| 정의 | 실행 중인 프로그램의 인스턴스 | 프로세스 내에서 실행되는 작업 단위 |
| 메모리 영역 | 독립적인 메모리 공간을 가짐 | 같은 프로세스 내의 메모리 공간을 공유 |
| 생성 비용 | 높음 | 낮음 |
| 통신 방식 | IPC (Inter-Process Communication) 필요 | 공유 메모리로 직접 접근 가능 |
| 예시 | 카카오톡 앱, 사파리 앱 등 | UI 업데이트 스레드, 백그라운드 다운로드 스레드 |
iOS에서 프로세스와 스레드 관리 방법
- iOS에서는 앱마다 기본적으로 하나의 프로세스만 할당
- 앱 내에서 여러 작업을 병렬로 처리할 필요가 있을때, 스레드(혹은 GCD기반 큐) 사용
- iOS는 GCD와 OperationQueue로 스레드 관리를 추상화 하여 효율적 처리
하나의 앱에서 여러 프로세스를 사용하는 경우는 없는가?
- 거의 없다. 대부분의 iOS앱은 하나의 프로세스 내에서 실행되며, 필요한 작업을 스레드를 통해 분산처리
- 예외적으로, App Extension(ex Widget, Siri Extension)은 별도의 프로세스로 실행
왜 스레드를 주로 사용하는가?
- 스레드는 프로세스보다 생성 및 관리 비용이 낮고, 메모리 공유가 가능하기 떄문에, 리소스 효율성 높음
멀티 스레딩은 왜 필요한가?
- UI응답성과 성능 향상을 위해 필요
- 사용자의 입력, 애니메이션, 스크롤 등에 영향을 주지않고 무거운 작업(ex 네트워크, 디스크 I/O, 이미지 처리 등)을 위해 백그라운드 스레드에서 처리해야함
메인 스레드에서 시간이 오래 걸리는 작업을 처리하면 어떤 문제가 생길까?
- 앱이 Freezing된것 처럼 보이고, 응답없음(App Not Responding, ANR)으로 이어질 수 있음
- iOS는 UI 관련 작업은 반드시 Main 스레드에서만 실행되어야 하기 때문에 긴작업이 있을 시 전체 UI가 멈춤
GCD(Grand Central Dispatch)란?
Apple에서 제공하는 멀티스레딩 처리 프레임워크로
개발자가 직접 스레드를 만들 필요 없이
Queue에 작업을 등록하면, 시스템이 적절한 스레드에서 실행
주요 기능
- Serial / Concurrent Queue
- async / sync 작업
- QoS(Quality of Service) 설정
- 메인 스레드 호출 등
GCD없이 스레드를 작접 생성/관리 한다면?
| 문제점 | 설명 |
|---|
| 복잡한 동기화 | 여러 스레드 간 데이터 공유 시 race condition 발생 가능 |
| 스레드 수 제한 관리 어려움 | 스레드가 너무 많아지면 오히려 성능 저하 |
| 메모리 및 리소스 누수 위험 | 생성된 스레드가 적절히 종료되지 않으면 문제 발생 |
| iOS는 앱의 리소스를 제한함 | 직접 만든 스레드는 iOS의 리소스 제한 정책에 맞지 않을 수 있음 |
GCD의 DispatchQueue 종류와 사용 목적
- Serial Queue(직렬 큐)
- 한 번에 하나의 작업만 실행
- 작업 순서를 보장하고 싶을 때 사용
let serialQueue = DispatchQueue(label: "com.example.serial")
serialQueue.async {
// 순차 실행
}
- Concurrent Queue (동시 큐)
- 여러 작업이 병렬로 동시 실행
- 순서 보장 필요없을 때, 성능 극대화 목적
let concurrentQueue = DispatchQueue(label: "com.example.concurrent", attributes: .concurrent)
concurrentQueue.async {
// 동시 실행
}
시스템 큐
| 큐 이름 | 설명 |
|---|
| DispatchQueue.main | Main 스레드(UI 처리 전용) |
| DispatchQueue.global() | 전역 concurrent queue (QoS 별로 선택 가능) |