iOS - GCD API 동작 방식과 필요성(2)

hanni66·2022년 10월 11일
0

iOS

목록 보기
2/5
post-thumbnail

서론

지난번 간단하게만 지나갔지만, 더 자세하게 GCD에 대해 알아봐야겠다고 생각했다.
아직은 어렵게 다가오는 개념이지만 정리하면서 천천히 이해해 봐야겠다.

GCD에 자세한 개념

지난 포스팅에서는 개념적인 부분보다는 사용되었을 때 어떻게 작동하는지를 공부했다. 이번에는 GCD가 어떻게 생겨나게 됐을까?.. 부터 시작하게 된다.

프로세서의 clock속도가 빨라지면서 자연스럽게 소프트웨어도 빨라지던 예전과 달리 멀티 코어 프로세서에서는 멀티 프로세서에게 어떻게 프로그램의 동작을 잘 배분하는지가 중요해졌다.

GCD 이전에는 멀티 스레딩을 위해 Thread와 OperationQueue 등의 클래스를 사용했는데, Thread는 복합할 뿐 아니라 임계구역(Critical Section)등을 이용한 Lock을 관리하기 어려웠다. 그리고 OpertaionQueue는 GCD에 비해 무겁고 Boilerplate 코드들이 많이 필요하게되는 문제도 있었다.

그래서 GCD는 멀티 코어 프로세서 시스템에 대한 응용 프로그램 지원을 최적화하기 위해 Apple에서 개발한 기술이다.
스레드 관리와 실행에 대한 책임을 어플리케이션 레벨에서 운영체제 레벨로 넘겨버렸다.

GCD는 각 어플리케이션에서 생성된 DispatchQueue를 읽는 멀티 코어 실행 엔진을 가지고 있으며, Queue에 등록된 각 작업을 꺼내 스레드에 할당하고 개발자는 내부 동작을 자세하게 알 필요 없이 Queue에 딱 작업만 넘기면 된다. Thread를 직접 생성하고, 관리하는 것에 비해 작업만 넘기면 되니 관리 용이성과 이식성, 성능이 증가하게 되었다.

GCD의 특징

  • reduces the memory penalty for storing thread stacks in the app’s memory space.
    앱의 메모리 공간에 스레드 스택을 저장하기 위한 메모리 페널티를 줄인다.
  • eliminates the code needed to create and configure your threads.
    스레드를 생성하고, 구성하는 데 필요한 코드를 제거한다.
  • eliminates the code needed to manage and schedule work on threads.
    스레드에 대한 작업을 관리하고 예약하는 데 필요한 코드를 제거한다.
  • simplifies the code.
    코드를 단순화 한다.

DispatchQueue

GCD는 애플리케이션이 Block 객체 형태로 작업을 전송할 수 있는 FIFO 대기열(Queue)을 제공하고 관리한다.
Queue에 전달된 작업은 시스템이 전적으로 관리하는 스레드 풀(a pool of threads)에서 실행된다.

DispatchQueue는 2개의 타입(Serial, Concurrent)으로 구분된다.
앱을 실행하면 시스템이 자동으로 메인 스레드 위에서 동작하는 Main Queue (Serial Queue)를 만들어서 작업을 수행하고, 그 외에 추가적으로 여러 개의 Global Queue (Concurrent Queue)를 만들어서 큐를 관리한다.

각 작업은 동기(sync) 방식과 비동기(aync) 방식으로 실행 가능하지만, Main Queue에서는 async만 사용 가능합니다. Main Queue를 sync방식으로 동작시키면 데트락(deadlock) 상태에 빠지게 된다.

Serial Queue

큐에 추가된 순서대로 한 번에 하나의 task를 수행한다.

Global Queue

동시에 하나 이상의 task를 실행하지만, task는 큐에 추가된 순서대로 시작된다. Global Queue의 경우, Qos 클래스를 지정해 우선순위 설정이 가능하다.

결론

GCD를 공부하면서 Apple이 대단한 개념을 개발한 것 같아 신기했다. 그리고 개념이 너무 어렵다.. 하지만 재밌는 것 같아 더 알아보고 싶고, 더 좋은 앱을 개발하고 싶다.
다음 번 포스팅은 Qos에 대해 좀 더 자세하게 알아보고 공부해야겠다.

참고

https://developer.apple.com/documentation/dispatch
https://developer.apple.com/documentation/dispatch/dispatchqueue
https://beenii.tistory.com/155
https://jinshine.github.io/2018/07/09/iOS/GCD(Grand%20Central%20Dispatch)/#dispatchqueue-1

0개의 댓글