Process (프로세스)
운영체제로부터 시스템 자원을 할당받는 작업의 단위
하나의 프로그램에서 일어나는 여러 개의 작업을 프로세스 여러 개를 생성하여 각자 하나씩 처리하도록 해주는 것
멀티 프로세싱의 장점
- 프로세스는 독립된 메모리 영역을 각자 할당 받으므로 프로세스 간 서로의 자원에 침투할 수 없음
- 독립된 구조이기 때문에 안정성이 높음
단점
- 멀티 프로세스 들은 동시에 진행되는 것 처럼 보이지만 실제 CPU는 모든 프로세스를 빠르게 왔다갔다 하는 과정으로 동시에 진행하는 것 처럼 보이는 것. 이처럼 다른 프로세스를 왔다갔다 하면서 진행하면 컨텍스트 스위칭을 함. 프로세스는 메모리가 모두 독립적으로 존재하므로 ContextSwitching 시 CPU의 부담이 커지고 오버헤드가 발생하게 됨
Thread (스레드)
한 프로세스 내에서 동작되는 여러 실행의 흐름
프로세스 내에서 동작하므로 메모리 영역을 독립적으로 할당 받지 못함
멀티 스레드의 장점
- 스레드 간 Code, Data, Heap 영역을 공유하므로 Context Switching이 빠름
- 프로세스를 생성하여 자원을 할당하는 것이 아니기 때문에 생성/종료 시간도 프로세스보다 빠름
- 프로세스 간 통신이 까다로운 반면에 스레드는 Stack 영역을 제외하고 나머지 영역을 공유하므로 통신 방법이 훨씬 간단
단점
Stack 영역을 빼고 공유하므로 설계가 까다로움
자원 공유로 인해 여러 스레드에서 동시에 같은 자원에 접근할 경우 동기화 문제가 발생함
독립적이지 않아서 하나의 스레드에 문제가 발생하면 전체 스레드가 영향을 받음
단일 작업 기준
Synchronous (동기)
작업이 동시 발생한다는 의미가 아닌, 요청-응답이 동시 발생한다는 의미
하나의 작업이 끝나기 전까지 다른 작업을 수행하지 못함
장점: 설계가 간단하고 직관적
단점: 응답이 주어질 때까지 아무것도 못하고 대기해야 함
Asynchronous (비동기)
요청에 대한 응답이 동시에 발생하지 않음
작업이 끝나기 전에 다음 작업을 실행한다. 작업 자체가 오래 걸리거나 동시 실행이 필요한 작업이라면 비동기로 처리할 수 있음
장점: 응답이 주어질 때까지 기다리지 않고 다른 작업을 하므로 자원을 효율적으로 사용할 수 있다.
단점: 동기보다 설계가 복잡하다.
다중 작업 기준
Serial
Synchronous 와 동일 의미가 아님. 앞 작업과 뒷 작업을 순차적으로 실행시킬 것인지 정하는 것
GCD 사용할 때 SerialQueue가 활용의 예시
대표적으로 사용하는 Main Queue가 Serial Queue
Queue = FIFO
Serial은 내 Queue에 들어온 작업들을 순차적으로 실행시키겠다는 의미
Concurrent
Queue에 들어온 작업들을 동시다발적으로 실행시키겠다는 의미
Main Thread (Interface Queue)
- Serial Queue
- iOS에서 Main Thread는 오직 한 개만 존재함
- 평소에 작성하는 코드들이 Main Thread에서 동작하는 것
- Main Thread는 Interface Thread라고도 불리는데, UI 관련된 작업은 반드시 Main Thread에 붙기 때문
** Main Thread는 Main Queue에서 실행되는데 이 Main Queue는 Serial Queue라서 한번에 한 개의 Task 밖에 실행하지 못함
UI를 실행하는 데 영향을 줄만한 코드들은 Main Thread에서 실행하면 안되고 Global Thread로 실행시켜줘야 함.
Global Thread (Background Thread)
- Concurrent Queue
- iOS에서의 Framework들은 모두 Background에서 구동 됨
- 몸체는 Background에 있지만, 가끔 필요할 때 Main Thread에게 Delegate(손)을 뻗는 구조
- 이렇게 동작하지 않으면 앱 화면이 계속 멈춰있게 될 것
- 코드 실행이 오래 걸리는 작업은 직접 Background Thread로 실행시켜줘야 함
iOS에서의 멀티스레드 API
NSOperation
- Objective-C언어 기반의 고수준 API
- 내부적으로는 C로 구현된 GCD를 고수준 언어로 Wrapping한 것이라 GCD보다 다소 무겁고 약간의 오버헤드를 발생시킴
- 그러나 고수준인만큼 GCD엔 없는 기능(작업 취소, KVO, 작업 재사용 등등)들을 사용할 수 있다는 장점을 가지고 있음
- NSOperation 동작 방식은 작업단위인 NSOperation을 NSOperationQueue에 추가하여 실행시키는 방법
- NSOperation Queue는 Concurrent Queue로 동작
- 그래도 이거보다는 GCD를 많이 씀
GCD
- C언어 기반의 저수준 API
- 멀티코어 시스템에서 동시성 실행을 제공하는 프로그래밍 언어 요소, 런타임 라이브러리 등을 의미
- NSOperation에 비해 가볍고 성능면에서 좋음
- 장점 - Block(Closure)로 구현되어 있어 코드 가독성면에서 좋고 간단하게 사용 가능
- 단점 - 작업 취소, KVO, 재사용 등은 직접 만들어줘야 한다
- GCD는 NSOperation Queue를 사용하는 NSOperation 과 달리 Dispatch Queue를 사용하여 멀티스레드를 지원
Dispatch Queue
DispatchQueue.main.async {}
DispatchQueue.global().sync {}
DispatchQueue.global().async {}
QoS (Quality of Service)
Global Queue의 우선 순위
- userInteractive: 중요도가 높고 즉각적인 반응이 요구되는 작업(UI 업데이트, 이벤트 핸들링 등), 즉각적으로 실행
- userInitiated: usserInteractive 까진 아니더라도 유저가 빠른 결과를 기대할 때 사용, 저장된 파일을 열거나 할 때 사용, 몇 초 이하거나 거의 즉각적
- default: 작업을 분리하지 않을 때 사용되는 QoS로 기본 값임
- utility: 즉각적인 결과가 필요하지 않을 때 프로그레스바가 등장하는 작업에 어울림, 몇 초~ 몇 분
- background: 급히 필요하지 않은 작업일 때 사용자에겐 보이지 않는 처리 (ex. 백업), iPhone 저전력 모드에선 실행되지 않는다, 몇 분 ~ 몇 시간
- unspecified: QoS 정보가 없음. 시스템에게 QoS 추론 신호를 줌
'면접' 카테고리의 다른 글
iOS 기술면접 정리 - 5. Swift (2) (0) | 2023.02.08 |
---|---|
iOS 기술면접 정리 - 5. Swift (1) (0) | 2022.07.10 |
iOS 기술면접 정리 - 3. Autolayout (0) | 2022.07.10 |
iOS 기술면접 정리 - 1. Common (0) | 2022.07.03 |