몇 개월 전에 GCD를 처음 접하게 되면서 어떻게 공부는 해두었는데, 그 뒤로 이론과 원리는 서서히 까먹어가면서 잘도 실컷 쓰고 있었다...
그러다 갑자기, 누군가 나에게 그래서 GCD가 뭔데!?!?하면 속시원히 설명하지 못할 것 같다는 생각이 들었다.
그래서 이 지식이 옅어지려고 할 때마다 두고두고 보려고 쓰는 간단 정리글이다.
Grand Central Dispatch
동시성 프로그래밍을 하기 위해 다수의 스레드를 활용해야 하는데, 이 스레드의 관리를 시스템이 알아서 해주도록 만들어진 기술
코드로 작업의 순서와 동기/비동기 처리만 해주면 시스템이 스레드를 관리해줌
GCD
, Operation
, aync/await
이 있음동시성! 원코어 매니테스크!!!! 슉 슈슈슉 나는 손이 보이지 않을 정도로 빠르지
병렬!!! 매니코어 원테스크!!!!! 일이다!! 나눠!!!
하나의 CPU가 여러 Task를 Context Switching을 통해 빠르게 번갈아가면서 다수의 스레드에서 실행하는 것
하나의 Task를 작은 작업 단위로 나누어 다수의 CPU가 동시에 처리하는 것
CPU. 한번에 하나의 작업만 할 수 있다. 여러개의 작업을 동시성 프로그래밍을 통해 실행할 수 있지만 동시에 하는 것은 아님. 빠르게 조금씩 번갈아가면서...
작업 단위. 나는 작업대와 비슷한 개념으로 이해함
작업이 끝날 때까지 기다렸다가 완료된 뒤에 다음 작업을 실행
작업이 끝나는 것을 기다리지 않고 다음 작업을 실행
GCD를 사용하기 위한 Queue.
단일 스레드 작업 / 다중 스레드 작업
DispatchQueue에 별도의 설정을 하지 않으면 기본값은 Serial
sync를 사용하면 작업이 끝날 때까지 다음 코드로 넘어가지 않고 스레드가 멈춘 상태로 기다리게 되는데, 스레드가 멈춘다면 sync 블록의 코드도 실행되지 않고 결국 작업도 끝날 수가 없어지고 그래서 다음 코드로 넘어갈 수 없고... 하는 데드락 상태가 되기 때문
하지만 global 스레드에서 main.sync
를 호출하는 것은 가능하다.
global 스레드가 main.sync
를 호출하면 DispatchQueue는 main 스레드에서 sync 코드 블록을 실행하고, 그동안 global 스레드는 기다린다.
main에서 작업이 끝나면 다음 코드가 실행된다.