[iOS CS Study] GCD란?

Oxong·2021년 7월 7일
0

iOS CS Study

목록 보기
7/18

21.07.03

공부한 것을 정리하는 용도의 글이므로 100% 정확하지 않을 수 있습니다.
참고용으로만 봐주시고, 내용이 부족하다고 느끼신다면 다른 글도 보시는 것이 좋습니다.
+ 틀린 부분, 수정해야 할 부분은 언제든지 피드백 주세요. 😊

                                                 by. ryalya



들어가기 전
GCD에 대해 이해하기 위해 여러 글들을 참고했지만, 내 이해를 힘껏 올려준 글이 하나 있었다.

여러개로 나눠져있었지만, 그 글을 이해하기 위해 보고 정리한 것이므로 더 자세한 내용이 궁금하다면 아래 블로그를 참고하도록 하자. (1~4까지 나눠져 있다.)

차근차근 시작하는 GCD


GCD (Grand Central Dispatch)

Swift에서 스레드 관련 작업은 Grand Central Dispatch API를 통해 처리한다.

GCD는 클로저 블록 안에 있는 특정 작업을 큐에 올리고, 해당 큐를 특정 스레드에 실행하는 방식이다.

멀티 코어와 멀티 프로세싱 환경에서 스레드 프로그래밍을 효율적으로 할 수 있도록 애플이 개발한 기술로 적절하게 사용하여 Thread-safe하게 구현하는 것이 중요하다.


우리가 Queue에 작업을 보내면 그에 따른 스레드를 적절히 생성해서 분배해주는데,
GCD에서 사용하는 queue의 이름이 Dispatch Queue!

--> Dispatch Queue에 작업을 추가하면 GCD는 작업에 맞는 스레드를 자동으로 생성해서 실행하고, 작업이 종료되면 스레드를 제거한다.

이미지 출처 : GCD 개념 출처 블로그


<예시>
DispatchQueue.global().async {
  // task (작업의 한 단위)
}

→ global().DispatchQueue.에 비동기(async)로 task를 보내면, 클로저 내의 task는 하나의 작업 뭉탱이기 때문에 그 안의 동작들은 순차적으로 처리한다.

★ async (비동기) : DispatchQueue로 task를 보낸 후, (Queue에서 그 일을 처리하든말든 신경 쓰지 않고) 나는 남아있는 내 할일을 한다!

<예시>
DispatchQueue.global().sync {
  // task (작업의 한 단위)
}

★ sync (동기) : DispatchQueue로 task를 보낸 후, Queue에서 그 일을 끝내면 남아있는 일을 한다.



※ 참고 : Operation

Operation에서 사용하는 queue의 이름은 Operation Queue.
얘도 내부적으론 GCD 위에서 동작한다. 다만 좀 더 기능들이 추가된 형태.

  • 동시에 실행할 수 있는 동작의 최대 수 지정
  • 동작 일시 중지 및 취소


❓ 비동기 처리가 필요한 이유

async와 sync예시에서 알 수 있는 차이점은? 시간 절약 !
시간이 많이 드는 작업의 대부분은 서버와의 통신이기 때문에 네트워크와 관련된 작업들은 내부적으로 비동기적으로 구현이 되어있다.

URLSession.shared.dataTask(with:request) { (data, response, error) in }

위의 코드처럼 URLSession으로 통신을 하는 것 = 내부적으로 다른 스레드 사용 + 비동기로 구현이 되어 있는 걸 사용하고 있는 것!



그렇다면 dispatchQueue에 task를 보냈을 때, Queue는 쌓여 있는 task 들을 다른 스레드로 어떻게 보낼까??

이미지 출처 : GCD 개념 출처 블로그


queue는 task들을 한 개의 스레드로 몰아 넣을지 여러 스레드의 분배할 지를 선택하게 되는데, 이는 queue의 특성에 따라 결정된다!


1. Serial (직렬)

→ (메인 스레드에서) 분산 처리 시킨 작업을 “다른 한개의 스레드에서” 처리하는 큐

이미지 출처 : GCD 개념 출처 블로그

2. Concurrent(동시)

→ (메인 스레드에서) 분산 처리 시킨 작업을 “다른 여러개의 스레드에서” 처리하는 큐

이미지 출처 : GCD 개념 출처 블로그



어떤 큐(Queue)를 사용할 것인가?

"작업 순서의 중요도, QoS (Quality of Service)"


Serial 큐에 담긴 작업들은 오직 하나의 스레드에만 분배

모든 작업들이 그 전 작업이 끝나길 기다렸다가 하나씩 실행 되기 때문에 task의 시작과 종료에 대한 순서 예측이 가능하다.


Concurrent 큐에 담긴 작업들은 여러개의 스레드로 분배

선입선출이라는 Queue의 특성상 작업들이 순서대로 분배되어 실행되긴 하겠지만, 그것들이 끝나는 순서는 알 수 없다.


EX) 어떤 Data를 받아올 때,

어떤 데이터가 먼저 들어와야 할지 순서는 됐고, 그냥 빠르면 돼!!Concurrent Queue 사용

아니. 순서가 중요해...Serial Queue 사용



SerialQueue.sync

: 메인 스레드의 작업 흐름이 queue에 넘긴 태스크가 끝날때까지 멈춰있고(sync), 넘겨진 task는 queue에 먼저 담겨있던 작업들과 같은 스레드에 보내지기 때문에 해당 작업들이 모두 끝나야 실행 (Serial Queue)

ConcurrentQueue.sync

: 메인 스레드의 작업 흐름이 queue에 넘긴 태스크가 끝날때까지 멈춰있고(sync), 넘겨진 task는 queue에 먼저 담겨있던 작업들과 다른 스레드에 보내질 수 있기 때문에 해당 작업들이 모두 끝나지 않아도 실행 (Concurrent Queue)

SerialQueue.async

: 메인 스레드의 작업 흐름이 태스크를 queue에 넘기자마자 반환되고 (async), 넘겨진 task는 queue에 먼저 담겨있던 작업들과 같은 스레드에 보내지기 때문에 해당 작업들이 모두 끝나야 실행 (Serial Queue)

ConcurrentQueue.async

: 메인 스레드의 작업 흐름이 태스크를 queue에 넘기자마자 반환되고 (async), 넘겨진 task는 queue에 먼저 담겨있던 작업들과 다른 스레드에 보내질 수 있기 때문에 해당 작업들이 모두 끝나지 않아도 실행 (Concurrent Queue)



Reference

GCD 개념 출처 1
GCD 개념 출처 2
GCD 개념 출처 3

0개의 댓글