GCD (Grand Central Dispatch)

wani·2020년 8월 4일
0

멀티 쓰레드를 쉽게 생성하고, 관리하고, 멀티코어에 자동으로 분산시켜 주는 라이브러리

  • 유휴 코어를 탐지해서 다른 어플에 피해를 주지 않는 선에서, 스레드에 할당, 스케줄링
  • (스레드 풀링) 한번 생성한 스레드를 재사용.

1. Serial Queue / Concurrent Queue

Dispatch Queue 내에서 작업을 처리할 때, 내부에서 동작되는 방식.

둘 다 Queue 이기 때문에 작업의 시작은 순서대로 진행됨.

Serial Queue

  • 동작과정

큐에 추가된 순서대로 한번에 하나의 작업을 실행.

실행중인 Task는 Dispatch Queue에서 관리하는 고유한 쓰레드에서 실행됨.

Serial Queues 는 특정 자원에 대한 접근을 동기화 할 때, 보통 사용한다.

Concurrent Queue

이전 작업의 완료유무와 상관없이 순서대로 큐의 모든 작업을 실행

이 때 실행중인 task는 dispatch queue에서 관리하는 임의의 고유한 쓰레드에서 실행됨.

QoS (quality-of-service)

각각의 DispatchQueue에 우선순위를 부여하는 기준.

더 높은 우선순위를 갖는 DispatchQueue일 수록 상대적으로, 더 빨리 실행되며 더 많은 자원을 갖는다.

  • Userinteractive

  • Userinitiated

  • default

  • Utility

  • Background

  • Unspecifed

2. Sync / Async

Sync

sync는 해당 작업이 모두 완료된 후에 return된다. 즉, 해당 Dispatch Queue 를 실행하는 쓰레드를 중단시키고 (Blocking), Queue 내의 작업들을 모두 처리한 뒤, 제어권을 돌려받는다.

Async

async의 경우, 작업을 전달하자마자 return하기 때문에(nonblocking), caller는 중단되지 않는다.

main.sync를 사용하면 안되는 이유

DispatchQueue.main

The dispatch queue associated with the main thread of the current process.

앱의 main 쓰레드에서 task를 실행하는, 전역적으로 사용 가능한 serial queue

main thread에서는 sync 작업의 return을 기다리고, sync 작업은 메인 스레드에서 실행되어야 하기 때문에 데드락이 발생한다.

UIKit 클래스를 메인 스레드 에서만 실행해야 하는 이유

https://medium.com/@duwei199714/ios-why-the-ui-need-to-be-updated-on-main-thread-fd0fef070e7f

UIKit은 Thread-Safe하지 않다

그렇기 때문에 만약 UIkit이 메인 스레드만이 아닌, 여러 스레드에서 동시에 작동한다고 가정한다면,하나의 스레드에서 테이블뷰를 삭제했는데, 다른 스레드에서 테이블 뷰에 접근하거나, 그 반대의 경우도 일어날 위험이 생긴다.

View의 Drawing Cycle

보통 각 View들의 변화는 즉각적으로 발생하지 않는다. 이들은 보통 RunLoop의 마지막에 view의 기간내 모든 변경사항들을 종합하여 한번에 이루어진다. 이러한 과정을 View Drawing Cycle 이라고 한다.

이러한 Drawing Cycle은 하나의 Main RunLoop에서 돌아가기 때문에 의미가 있고, 만약 여러 Thread에서 각각의 Drawing Cycle이 존재한다면, 각 변경사항들에 대한 순서를 동기화할 수 없다.

예를 들어 기기를 회전하고, 각 Layoute들을 새로고침할 때, 모든 변경사항들이 한번에 이루어지는게 보장되지 않을 수 있다. 만약 회전하기 전에, 새로고침이 먼저 이루어진 View의 경우엔 혼자 다른 방향을 가질 수도 있는 것이다.

profile
🍃

0개의 댓글