티스토리 뷰

Ray wenderlich - Grand Central Dispatch Tutorial for Swift 4:

Part 1/2 번역

 

 

 

 

들어가기 전에..

 

 

 개발자 입장에서는 GCD가 세부적으로 어떻게 작동하는 지에 대해서는 알 필요가 없어졌고,

이 GCD 를 어떻게 활용할 것인가 고민해야 할 때이다.

 

GCD를 보다 잘 이해하기 위해선 'Thread(스레드)' 를 이해하고 있어야 하고, 

‘Thread 를 이해하기 위해선 ‘Process’, ‘Context Switching’ 등의 개념을 숙지해야 한다. 

본인의 GCD 공부에 많은 도움이 되었던 잘 정리가 되어있는 블로그 링크들을 통해

 

잠시 개념을 숙지하고 시작할 수 있도록 하자.

 


링크 1 : (https://magi82.github.io/process-thread/)

링크 2 : (https://jeong-pro.tistory.com/93)

링크 3 : (https://philip1994.tistory.com/45)


Introduction (Ray wenderlich 내용 X)

 

 프로세서의 클럭 속도가 빠르게 올라가면서 자연스럽게 소프트웨어도 빠르게 올라가고 있는 상황에 

예전과 달리 현재 멀티 코어 프로세서에서는 멀티 프로세서에게 어떻게 프로그램의 동작을 잘 배분하는 중요해졌다.

 

 GCD 이전에는 멀티 스레딩을 위해 ‘Thread’  ‘OperationQueue’ 등의 클래스를 사용했는데,

 

Thread 복잡하고Critical Section’ 등을 이용한 ‘Lock’ 관리하기 까다로웠

 OperationQueue GCD 비해 무겁고 ‘Boilerplate’ 코드들이 많이 필요한 문제 있음

 

 

멀티 코어 프로세서 시스템에 대한 응용 프로그램 지원을 최적화하기 위해

Apple 에서 개발한 기술 GCD (Grand Central Dispatch).

 

 - Thread 직접 생성하고 관리하는 것에 비해 관리 용이성과 이식성, 성능 증가 

 

 

 

 

Grand Central Dispatch (GCD) is...

 

 

 

 동시 작업(Concurrent operations) 관리하기 위한 저수준(low-level)의 API

 

 무거운 작업(computationally expensive tasks) 백그라운드로 미룸으로서(By defering) 

앱의 응답 속도를 향상시키도록 도와준다

 

 ‘locks’ ‘threads’ 보다 작업이 쉬운 동시성을 지닌 모델(Concurrency Model) 이다.

  (‘Thread’ 복잡하고 ‘Critical Section’ 등을 이용한 ‘Lock’ 관리하기 까다로웠음. 사실 이건 나도 GCD 이전에는 프로그래밍을 하지 않았기 때문에 잘 모르겠다. 그냥 "힘들었구나" 하고 받아들이고 GCD 의 이해를 높인 후 심화 과정으로 공부하기로 한다.)

 

 

 

 

 

GCD Concepts

 

 - GCD 이해하기 위해서는 ‘concurrency’ ‘threading 관련된 개의 개념을 숙지하고 있어야 한다.

 

 

 

Topic 1 .Concurrency

 

 

 - iOS에서 프로세스 혹은 어플리케이션은 하나 이상의 thread(쓰레드 이루어져 있다. 

 

 - OS 스케줄러(operating system scheduler) 스레드를 서로서로 독립적으로(independently) 관리한다.

 

 - 스레드는 동시에 실행될 있다. 하지만 스레드의 실행 여부, 실행 시기, 실행 방법을 결정하는 것은 전적으로 시스템에 달려있다. (but it’s up to the system to decide if this happens, when this happens, and how it happens.)

 

 - 싱글 코어를 가진 디바이스는 ‘time-slicing’ 이라 불리는 메소드를 통해 'Concurrency(동시성)' 의 개념 구현한

     디바이스는 하나의 스레드를 작동시키며, '컨택스트 스위치(context switch) 실행하는 방식으로 다른 스레드를 작동시켰다.

    (필자 : * 컨텍스트 스위치의 개념과 단점을 꼭 알고 있어야 합니다 *)

 

 

 

 

 - 반면에 멀티 코어 디바이스는  다수의 스레드를 'Parallelism(병렬)' 의 개념을 통해 동시에 실행한다.

 

 - GCD는 스레드들의 최상단에서 구축되고, 그 내부에서 GCD 는 공유의 'thread pool' 을 관리한다.

  (Thread pool : 수 많은 작업을 실행하기 위해 만들어진 실행 스레드 풀을 말한다.)

  (A pool of threads of execution created to perform a number of tasks)

 

 - GCD를 사용하면 코드 블록이나 작업 항목을 'dispatch queues' 에 추가할 수 있고, GCD는 실행할 스레드를 (스스로) 결정하게 됩니다.

 

 - 코드를 구조화하게 되면, 우리는 동시에 실행할 수 있는 코드 블록과 그렇게 하지 말아야 할 코드 블록을 발견하게 될 것이며

   따라서 이는 우리에게 동시 실행의 장점을 가지기 위한 GCD의 사용을 가능하게 해주는 것이죠.

 

 - GCD는 시스템과 가용할 수 있는 시스템 리소스에 기반하여 필요한 병렬 처리 수준을 결정합니다. 

   중요한 것은 병렬 처리는 동시성을 필요로 하지만, 동시성은 병렬 처리를 보장하지 않는다는 것입니다(parallelism requires concurrency, but concurrency does not guarantee parallelism)

 

 - 왜냐하면, 기본적으로 동시성(Concurrency)은 '구조(Structure)' 에 관한 것이지만 반면에 병렬(Parallelism)은 '실행(Execution)' 에 관한 것이기 때문이죠.

 

 

 

Topic 2. Queues

 

 - 전술했듯, GCD는 'DispatchQueue' 라는 적절한 이름의 클래스를 통해 'dispatch queues' 에서 작동한다. 

    이 queue 에 작업 단위를 제출하면 GCD 는 이 작업 단위를 FIFO(First In First Out) 의 순서로 실행하며, 제출된 첫 작업이, (나중에 시작되는 것이 아닌) 가장 먼저 시작되는 첫 작업이 되는 것을 보장합니다.

 

 - Dispatch Queues 는 'thread-safe' 하다. 이는 우리가 다수의 스레드에 동시에 엑세스할 수 있다는 것을 의미합니다.

   (필자: 쓰레드에 대해 이해하고 있어야 스레드 세이프의 의미를 이해할 수 있습니다)

 

 - GCD의 이점은, 디스패치 큐가 자신의 코드의 일부에 스레드 안전성을 어떻게 제공하는지를 이해할 때에야 비로소 분명하게 나타날 것입니다.

 

 - 따라서 가장 중요한 것은 올바른 디스패치 큐의 종류를 선택해야 하며, 자신의 작업(task)을 큐에 제출하기 위한 올바른 디스패칭 함수(dispatching function) 를 선택하는 것에 있습니다.

 

 - Queuesserial(순차적인) 혹은 concurrent(동시적인) 가 될 수 있습니다. 

 

  * Serial : Serial Queues 는 주어진 때에 오직 하나의 작업이 실행되는 것을 보장합니다. GCD가 실행 타이밍을 통제합니다. 우리는 하나의 작업의 끝과 다음 작업의 시작 사이의 걸리는 시간을 알 필요가 없게 될 것입니다.

  (필자 보충 : main 큐가 Serial 입니다)

 

 

  * Concurrent :  Concurrent Queues 는 다수의 작업이 동시에 실행되는 것을 가능하게 합니다. Queue 는 작업들이 우리가 추가한 순서에 따라 시작할 수 있게 보장해줍니다. (필자 보충 : global 큐가 Concurrent 입니다)

                          

작업은 임의의 순서로 끝날 수 있으며 다음 작업이 시작하기 위해 걸릴 시간에 대해, 그리고 어느 시간에 몇 개의 작업이 실행 중인지에 대해서도 몰라도 됩니다.

                          

이것은 의도된 것인데, 우리의 코드가 이러한 디테일한 구현에 의존하지 않도록 하기 위함입니다. 

(your code shouldn't rely on these implementation details.)

 

 

 작업 1, 2, 3이 차례로 빠르게 시작되는 방법에 유의해야 합니다. 작업 1은 작업 0 이후에 시작하는데 시간이 걸렸고, 또한 작업 3이 작업 2 이후에 시작되었지만 먼저 완료되었음을 알 수 있습니다.

 

 작업이 언제 시작되는 지에 대한 결정은 전적으로 GCD 에게 달려있습니다. 만약 한 작업의 실행 시간이 다른 작업과 오버랩된다면, 그 작업을 다른 코어에서 실행해야만 하는지의 여부(만약 다른 코어가 사용가능한 상태라면) 

 

 혹은 다른 작업을 실행하기 위해서 컨텍스트 스위치를 대신 실행해야 하는지를 결정하는 것도 GCD 에 달려 있습니다. 

 

 

 

Part 2 에서는 Queue의 3개의 주요 타입부터 이어서 알아보겠습니다.

댓글은 큰 힘이 됩니다. 틀린 부분 지적 감사드리겠습니다.

 

 

 

 

 

 

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함