도입
PC 사양
- 4 코어 8 스레드
- 8 코어 16 스레드
❗️스레드 = 작업을 처리하는 애
“한 개의 스레드에만 작업을 시킬 것인가 혹은 다른 스레드로 보내서 분산 처리할 것인가” 문제
‘비동기’라는 개념이 일반적으로 필요한 이유는?
→ 대부분 서버와의 통신(네트워크 작업)이 필요하기 때문이다.
동기(Synchronous)
동기(Sync)동기는 단어 그대로 동시에 일어난다는 의미인데, 이는 작업이 전부 동시에 일어난다는 뜻이 아니라 "요청과 응답"이 동시에 일어난다는 뜻이다. 일반적으로 코드를 작성하게 되면 이러한 동기 방식으로 작동하기 때문에 코드 작성 순서대로 호출되고 결과가 출력된다.
- 시작한 작업이 완료가 되어야 그다음 작업을 시작할 수 있음.
- 한 번에 하나의 작업만 진행
- 하나의 작업이 끝나기 전까지 다른 작업에 대해서 수행할 수 없음 -> 작업 순서가 보장됨
- 어떤 작업이 수행 중이라면 다음 작업은 대기해야 함
- 결과의 순서가 중요한 경우에는 동기 코드로 작성을 해야 함.
비동기(Asynchronous)
"요청과 응답"이 동시에 일어나지 않는 방식으로 요청하면 상황에 따라서 뒤늦게 응답되거나 아예 응답되지 않을 수도 있다
- 시작한 작업이 완료되지 않더라도 그다음 작업을 시작함
- 한 번에 여러 작업을 진행할 수 있음
- 하나의 작업이 끝나지 않았더라도 다른 작업에 대해서 수행할 수 있음
- 즉, 작업이 먼저 실행되었다 하더라도 먼저 끝나는 것은 아님 -> 작업 순서가 보장되지 않음
- 동시에 작업을 실행할 수 있기에, 비동기 코드로 작성하는 것이 효율적이라고 생각할 수 있지만, 결과의 순서가 보장이 되지 않기에 결과의 순서가 중요한 경우 비동기로 작성하면 좋지 않음
- 동기 코드가 모두 실행되고 난 후에 비동기 코드 실행
그래서 비동기 어떻게 실행하는가
swift에서는 가장 대표적인 처리 방식으로 GCD(Grand Central Dispatch)라는 API가 존재.
GCD는 Queue에 작업을 보내면 이에 맞춰 스레드를 적절히 생성하여 분배해주는 역할을 하며, 여기서 사용되는 Queue가 Dispatch Queue이다.
DispatchQueue
:큐에 다가 보내는 것. 직접적으로 스레드를 관리하는 개념이 아닌, 대기열(큐)의 개념을 이용해서 작업을 분산 처리하고 OS에서 알아서 스레드 숫자(개수)를 관리
즉, DispatchQueue에 task를 추가하면 GCD가 task에 맞춰 스레드를 자동으로 생성하여 실행하고, task가 완료되면 스레드를 제거하는 일련의 과정을 관리해준다.( ex. DispatchQueue.global(). async { //task } )
DispatchQueue 사용 시, 동기와 비동기(sync, async), 직렬과 병렬(serial, concurrent)로 작업을 처리할 수 있다.
직렬(Serial)
- 분산 처리시킨 작업을 ‘다른 한 개의 스레드에서 작업’을 처리하는 것
- 작업에 순서가 필요할 경우
동시(Concurrent)
- 분산 처리시킨 작업을 ‘다른 여러 개의 스레드로 분산 처리’하는 것
- 작업에 순서가 필요하지 않은 경우 (독립적이지만 유사한 여러 개의 작업을 처리할 때 사용)
따라서 총 4가지의 조합이 가능.
순서가 중요할 때, 주로 직렬 처리를 사용한다.
'App Dev' 카테고리의 다른 글
[iOS] MVC/MVVM 패턴 (0) | 2022.12.07 |
---|---|
[IOS] CRUD in swift _ CoreData (0) | 2022.12.02 |
[IOS] IOS 앱 생명주기 (0) | 2022.11.24 |