lunchScreen/Interview_Questions

NSOperationQueue 와 GCD Queue 의 차이점을 설명하시오.

Opened this issue · 4 comments

NSOperationQueue 와 GCD Queue 의 차이점을 설명하시오.

쉽고 편한 MultiThreading 처리를 위해 제공하는 2가지 API로, GCD(Grand Central Dispatch)라는 C기반 Low Level API와 NSOperation이라는 Obj-C 기반의 High Level API가 있습니다.
GCD에는 Main DispatchQueue같은 SerialQueue와 Global DispatchQueue 같은 ConcurrentQueue가 있습니다. 이 DispatchQueue에서 sync와 async 메소드를 사용해 각각 동기, 비동기 처리를 할 수 있습니다.
NSOperation는 GCD보다 약간 더 오버헤드가 발생되고 느리지만, GCD에서는 지원하지 않는 작업간 의존성 추가, KVO, 작업 재사용/취소/중지 등을 지원합니다.

NSOperationQueue

Operation의 실행을 관리하는 큐이다. 준비 상태, 상호 운용 종속성, 우선 순위 등을 기반으로 실행하며 우선순위가 같은 경우 먼저 큐에 들어 온 순서대로 처리한다.

큐에 한번 들어가면 작업이 완료되었다고 보고 할 때(NSOperation의 finished가 true일 때)까지 대기열에 남아있는다.

ready, executing, finished의 과정을 통해 작업을 실행한다.

작업을 취소할 수 있고, KVO를 사용해 작업 진행 사항을 감시할 수 있다.

비동기적으로 실행되어야 하는 작업을 객체 지향적인 방법으로 사용하거나 작업 진행 상황을 감시하는 방법이 필요할 때 적합하다.

GCD

앱의 기본 스레드 또는 백그라운드 스레드에서 작업 실행을 serial 또는 concurrent 방식으로 관리하는 개체이다.

프로그래머가 실행할 태스크를 생성하고 Dispatch Queue에 추가하면 GCD는 태스크에 맞는 스레드를 자동으로 생성해 실행하고 작업이 종료되면 해당 스레드를 제거한다.

앱 실행시 시스템에서 기본적으로 Main Queue와 Global Queue를 만들어 준다.

작업이 복잡하지 않고 간단하게 처리하거나 특정 유형의 시스템 이벤트를 비동기적으로 처리할 때 적합하다.

OperationQueue는 operation들의 실행을 관리하는 큐입니다. 준비 상태, 상호 운용 종속성, 우선 순위를 기반으로 처리합니다. 큐에 한번 들어가면 작업이 완료됐다고 보고할때까지 대기열에 남아있습니다. 작업에 대한 취소가 가능합니다. Operation은 내부적으로 ready, executing, finished 상태를 가지며 암묵적으로 해당하는 KeyPath에 KVO 통지를 합니다. KVO를 통해 작업진행사항에 대한 감시가 가능합니다.

GCD(Grand Central Dispatch)는 운영체제 단위로 처리되는 스레드풀에 대한 관리를 간편하게 관리할 수 있도록하는 API입니다. 프로그래머가 실행한 작업을 생성하고 Dispatch Queue에 추가하면, GCD는 해당 작업에 맞는 스레드를 자동으로 생성해서 실행하고 작업이 종료되면 해당 스레드를 제거합니다. 앱의 기본 스레드 혹은 백그라운드 스레드에서 직렬(serial) 혹은 병렬(concurrent)적으로 관리하는 개체인 것입니다. 앱이 실행되면 기본적으로 2개의 Queue(Main Queue, Global Queue)를 보유합니다.

비동기적 실행 작업을 객체지향적으로 처리하고 싶을 경우 Operation Queue를 사용합니다. KVO를 통해 작업 진행상황을 감시하고 싶을 경우에도 적합합니다. 동시 실행 Operation 수도 지정할 수 있고, Operation을 일시중지, 재실행, 취소도 가능하기때문에 이런 기능이 필요한 경우에도 Operation Queue를 사용합니다.

GCD는 기능이 조금 제한적이고 약간의 오버헤드가 발생하지만 좀 더 간단하게 처리할 수 있다는 장점이 있습니다.

  • iOS에서는 multi-threading 처리를 위해 NSOperation과 GCD를 제공합니다.
  • NSOperationd은 추가적인 overhead가 존재하지만, 의존성을 추가할 수 있고, 재사용, 취소, 중지시킬 수 있습니다. 또한 작업의 상태를 ready, executing, finished로 구분하여 monitoring할 수 있으며, 동시 수행 작업의 최대 개수를 설정할 수 있습니다.
  • 일반적으로 더 고차원의 추상화를 원한다면 NSOperation을 사용하는 것이 좋습니다. 하지만, 적은 overhead로 단순한 작업을 수행하고 싶다면 GCD를 사용하는 것이 좋습니다.