글의 흐름
UI event async? -> async vs sync -> concurrency vs parallelism -> 멀티코어 vs 싱글코어 -> 멀티,싱글 쓰레드
Combine 을 공부하던 중 이런 문장이 있었다.
Since most typical code performs some work asynchronously, and all UI events are inherently asynchronous, its impossible to make assumptions about which order the entirety of your app code will executed.
대부분의 일반적인 코드는 일부 작업을 비동기식으로 수행하고 모든 UI 이벤트는 기본적으로 비동기식이므로 앱 코드 전체가 실행될 순서를 가정하는 것은 불가능합니다.
iOS 에서 UI는 Main Thread 에서 처리하는 것 으로 알고있다.
UI를 그리는게 두개의 Thread 가 동작하는 것도 아닌데 어떻게 UI event 가 기본적으로 Asynchronous하다는 뜻일까?
일단 Main thread 에서 UI를 업데이트 하는 코드를 생각해 보면 DispatchQueue.main 에서
- async
- sync
중에 async 를 해야한다.
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
DispatchQueue.main.async {
self.view.backgroundColor = .black
}
}
만약에 sync 로 UI를 업데이트 시키면
이런식으로 에러가 발생한다.
async vs sync 의 문제로 넘어간다.
데이터 로딩과 같은 무거운 작업을 실행할 때 UI를 느려지게 하거나 freeze 시킬 수 있다.
여기서 concurrency-동시성이 필요하다. (not parallelism-병렬성)
concurrency 는 2개 이상의 작업을 동시에 수행하도록 해준다.
// 단점으로는 이 접근 방법이 thread saftey 를 신경써야 한다는 것이다. 만약 다른 thread 가 같은 리소스를 문제가 발생하는 것 이다.
그래서 async를 사용하면 Dispatch block 실행되기를 기다리지 않고 queue가 다음 작업을 할 수 있게 해주지만
sync의 경우 dispatch block 이 다 될때 까지 queue 를 멈춰놓는다.
그래서 sync 는 deadlock 을 유발할 수 있기 때문에 UI를 담당하는 main queue 에서 sync 로 작업하는 것은 앱을 freeze시킬 것 이다.
그럼 정리해 보자면 sync는 이전 작업이 끝나면 다음작업을 하는 것이도 async 는 이전 작업의 완료 유무에 관계 없이 다음 작업을 실행한다. UI 는 async 로 해야되며 Main thread 에서 작업이 이루어 진다.
그럼 그 말은 asynchronous 한 작업은 꼭 multi-thread 가 아니여도 된다는 뜻이다.
그럼 이 비동기 방식이 multi-thread, single-thread랑은 관련이 없는 것인가?
관련있는 용어를 나열해보면
- synchronous
- asymchronous
- concurrency
- parallelism
- multi-thread
- single-thread
이렇게 구성된다.
sync 와 async는 알았으니 concurrency vs parralelism으로 넘어간다.
concurrency은 동시성으로 여러개의 작업이 같은 시간동안 시작되어 실행되고 완료하는 개념으로 꼭 동시에 실행되는걸 뜻하는 건 아니다.
동시성이라는 개념은 single-core 가 여러작업을 빠른 시간 내에 바꿔가며 cpu 입장에서는 한번에 하나씩 일을 처리하지만 사용자 입장에서는 "동시에 실행되는 것 같아 보이는" 처리 방식이다.
parralelism은 병렬성으로 말그대로 multi-core 를 지원하는 컴퓨터에서 각각의 cpu 각자 맡은 작업을 처리하며 실제로 하나 이상의 작업이 동시에 처리되는 것을 뜻한다.
그러면 multi thread 는 뭔가? 왜나온건가?
thread 는 프로세서 내에서의 작업 단위로 processor(cpu) 컴퓨터가 Thread를 관리하는 기법(thread pool등)에 따라
1대1, 1대 n 등의 관계로 매핑된다. (이때 이 thread 관리를 iOS 에서는 GCD 가 OS 레벨에서 관리해 주는것이다.)
그 말은 single core 도 multi thread 할 수 있고 multi core 도 multi thread 할 수 있다는 것이다.
thread가 나온 이유는 앞서 말했던 single core 에서 concurrency(동시성), asynchronous하게 작업을 하려면
각각의 작업공간 (PCB: Process Control Block) 을 바꿔줘야 했는데
이 작업공간은 프로세스마다 공유하는 공간이 없어 IPC (inter process communication) 이 필요했고 그에따라 Context Switching을 빠르게 할 수 없었다.
그래서 작업 공간을 공유하는 thread 개념이 나왔고 multi thread 방식으로 짧은 시간 내에 concurrency하게 작업을 효율적으로 처리할 수 있었다.
다시 처음 물음으로 돌아가자면
UI event 는 asynchronous 하게 동작해야지만 dead lock 과 같은 상황에서 UI 가 freeze 하지 않게 방지할 수 있으며
이러한 UI event 는 굳이 multi thread 여야지만 asynchronous 하게 동작 하는 것은 아니다.
왜냐하면 asynchronous 는 Queue 의 이전 작업의 완료를 기다리지 않고 다른 작업을 먼저 시작하는 방식이기 때문이기 때문이다.
두개 이상의 쓰레드에서 asynchronous 하게 작업을 하면 데이터 종속성 떄문에 문제가 발생할 수 있다.
'iOS > Combine' 카테고리의 다른 글
#12 Key-Value Observing (0) | 2020.10.30 |
---|---|
#9 Networking (0) | 2020.10.28 |
#3 Transforming Operators (1) | 2020.10.28 |
#2 Publishers & Subscribers (0) | 2020.10.27 |
#1 Hello, Combine (0) | 2020.10.27 |
댓글