본문 바로가기
YAGOM CAREER STARTER

[TIL] 20230307: 동기/비동기/직렬/동시성, DispatchQueue

by Rhode 2023. 3. 7.

본문은 야곰 아카데미 커리어 스타터 캠프를 통해 학습한 내용을 회고한 글입니다.


동기/비동기/직렬/동시성 Sync/Async/Serial/concurrent

동기/비동기 Sync/Async

동기와 비동기는 하나의 스레드 내에서 작업을 수행하는 방식의 차이를 의미한다.

일반적인 동기와 비동기에 대한 설명은 다음과 같다:

동기 Synchronous 비동기 Asynchronous
  • 큐에 보낸 태스크들이 완료될 때까지 기다린 후 다음 태스크를 실행하는 것을 의미한다.
  • 요청과 그 결과가 동시에 일어난다는 것이다.
  • 바로 요청을 하면 시간이 얼마나 걸리든 요청한 자리에서 결과가 주어져야한다.
  • 순서에 맞춰 진행되는 장점이 있지만, 여러가지 요청을 동시에 처리할 수 없다.
  • 설계가 매우 간단하고 직관적이라는 장점이 있다.
  • 결과가 주어질 때까지 아무것도 못하고 대기해야한다는 단점이 있다.
  • 큐로 보낸 태스크의 완료 여부에 상관 없이 바로 다음 태스크를 수행하는 것을 비동기라고 한다.
  • 요청과 결과가 동시에 일어나지 않는다는 것이다.
  • 하나의 요청에 따른 응답을 즉시 처리하지 않아도, 그 대기 시간동안 또 다른 요청에 대해 처리 가능한 방식이다.
  • 결과가 주어지는데 시간이 걸리더라도 그 시간 동안에 다른 작업을 할 수 있으므로 자원들을 효율적으로 사용할 수 있다는 장점이 있다.
  • 설계가 동기에 비해 복잡하다는 단점이 있다.

 

직렬/동시성 Serial/concurrent

직렬과 동시성은 스레드를 사용하는 방식의 차이를 의미한다.

일반적인 직렬과 동시성에 대한 설명은 다음과 같다:

직렬 Serial 동시성 Concurrent
  • 큐에 쌓인 태스크들을 하나의 스레드에 몰아 넣는다.
  • 일반적으로 단일의 main 스레드만을 사용하는 대기열을 직렬큐라고 한다.
  • 태스크의 시작과 종료에 대한 순서 예측이 가능하다.
  • 순서가 중요한 작업들을 처리할 때 사용한다.
  • 큐에 쌓인 태스크들을 여러개의 스레드에 나눠서 처리한다.
  • 일반적으로 독립적이지만 유사한 여러개의 작업을 main 스레드에서 여러 스레드로 할당해 처리할 때 사용하는 것을 동시큐라고 한다.
  • 태스크의 시작과 종료에 대한 순서예측이 불가능하다.
  • 순서가 중요하지 않고 빠르게 처리할 때 사용한다.

 

조합

이 조합들에 대해서 다음과 같이 정리할 수 있다:

동기 - 직렬 Sync - Serial 비동기 - 직렬 Async - Serial
메인 스레드는 큐로 보낸 태스크가 완료될 때까지 기다리며 (Sync)
큐로 보내진 태스크는 순차적으로 실행되기 때문에 이전 태스크가 끝나길 기다린다 (Serial)
메인 스레드는 큐로 보낸 태스크의 완료 여부와 상관 없이 다음 태스크를 실행하고 (Async)
큐로 보내진 태스크는 순차적으로 실행되기 때문에 이전 태스크가 끝나길 기다린다 (Serial)
동기 - 동시성 Sync - Concurrent 비동기 - 동시성  Async - Concurrent
메인 스레드는 큐로 보낸 태스크가 완료될 때까지 기다리며 (Sync)
큐로 보내진 태스크는 이전 태스크와 상관 없이 다른 스레드에 보내지며 동시에 실행된다 (Concurrent)
메인 스레드는 큐로 보낸 태스크의 완료 여부와 상관 없이 다음 태스크를 실행하고 (Async)
큐로 보내진 태스크는 이전 태스크와 상관 없이 다른 스레드에 보내지며 동시에 실행된다 (Concurrent)

 

 

은행 창구 매니저

은행 창구 매니저에서는 어떤 전략을 선택해야할까?

동기 - 동시 전략이 가장 적절하다고 생각한다.

메인 스레드인 은행에서는 큐로 보낸 태스크가 완료될 때까지 기다려야한다.

고객 응대가 끝나기 전에 다른 고객을 응대할 수는 없기 때문이다.

그리고 여러명의 은행원, 즉 각각의 스레드는 동시에 고객을 응대할 수 있기 때문이다.

 

 

DispatchQueue

GCD를 사용하기 위한 대기열

대기열들에 작업을 추가해주기만하면 알아서 스레드를 관리하여 작업을 처리하도록 도와줌

FIFO(First In, First Out)로 작업을 처리

 

main/global

DispatchQueue.main과 DispatchQueue.global()은 이미 만들어져있는 큐로 각각 Serial, Concurrent 큐에 해당

main은 일반적인 Serial큐와는 달리 앱이 실행되는 동안 늘 메모리에 올라와 있음

main에 작업을 추가하면 Serial 큐인 main 스레드에서 작업을 처리 -> main 스레드에만 작업을 쌓을 경우 동시에 여러 작업 처리 불가

global에 작업을 추가하면 Concurrent Queue이기 때문에 새로운 스레드를 만들어 그 위에서 작업을 처리

global 스레드는 main 스레드가 아닌, 작업을 처리하기 위해 발생한 스레드들을 의미

main 스레드와 달리 global 스레드는 global()이 호출되면 작업을 처리하기 위해 메모리에 올라왔다가, 작업이 끝나고 나면 메모리에서 제거

 

 

 

 

 

참조

https://trumanfromkorea.tistory.com/52

 

[Swift] GCD & Dispatch Queue

[Swift] GCD & Dispatch Queue 프로그램은 실행되며 여러가지 작업을 수행해야 하는데, 멀티스레드 프로그래밍을 이용하지 않고 하나의 스레드에서 작업을 모두 수행한다면 당연히 많은 시간이 걸릴것

trumanfromkorea.tistory.com

https://80000coding.oopy.io/4690385f-97d9-4add-9e94-004c47c82820

 

[GCD] 동기/비동기/Serial/Concurrent 에 대해 알아보자

동시성을 위해 iOS 에서 지원하는 기술인 GCD 와 Operation 의 간단한 개념과 특징을 알아보고

80000coding.oopy.io