[iOS Study] 병렬 프로그래밍 가이드 ( 병렬 앱 디자인 )
-
전통적 방법으로의 복수개의 코어를 사용하는 방법은 여러개의 thread 를 만들어 사용하는 것이다.
그러나 thread 를 사용한 코드는 scale 측면에서 좋지 않다.
core 가 처리하기 좋은 thread 의 갯수를 아는 것도 쉽지 않고, thread 들을 효율적으로 관리하는 것도 쉽지 않다.
-
System 환경에 dependent 하지 않는 thread 처리를 가능하게 하는 것을 apple 의 os 는 제공한다.
Thread 를 버리세요
-
Thread 를 사용한 방법은 전통적으로 많이 사용되어져 왔지만, scale 측면에서 좋지 않다.
-
OS X 와 iOS 에서는 thread 대신에 scale 을 제공하는 병렬처리를 위해,
비동기 디자인 방식을 사용하고 있다.
비동기 태스크들은 background 에 있는 thread 를 사용하여 전달받은 task 를 수행시키고,
callback 함수들을 호출하는 등의 형태로 결과를 전달해준다.
-
task 를 비동기로 수행시키는 방법 중 하나는 GCD ( Grand Central Dispatch )이다.
GCD 는 thread 를 관리하는 코드를 system level 로 옮긴 것이다.
그래서 개발자가 해야할 일은 task 를 정의하고, 적절한 dispatch queue 에 전달하는 것으로 완료된다.
GCD 가 thread 를 만들고, scheduling 하는 등의 작업을 모두 수행해준다.
-
Operation queue 는 Objective-C 의 object 로 dispatch queue 처럼 작동한다.
전달한 task 를 최선의 방법으로 효율적으로 관리하고 수행해준다.
Dispatch Queue
-
dispatch queue 는 c 기반의 매커니즘으로 custom task 를 수행한다.
이 녀석은 serial 혹은 concurrent 방식으로 작동할 수 있는데 보통은 선착순으로 진행한다. (FIFO)
-
serial dispatch queue 는 한 가지 task 를 한번에 수행한다.
해당 task 가 모두 끝나면 그 후에 다음 task 를 꺼내 수행한다.
-
concurrent dispatch queue 는 task 의 종료여부와 상관없이
queue 에서 task 를 지속적으로 꺼내서 수행시킨다.
-
dispatch queue 는 다음의 장점을 갖는다.
간단한 interface 를 갖는다.
thread pool 을 알아서 관리해준다.
더 빠르게 수행할 수 있게 알아서 관리해준다.
메모리 측면에서도 더 효율적이다.
deadlock 에 걸리지도 않는다.
scale 측면에서도 유리하다.
serial dispatch 는 lock 이나 synchronization 등에서 더 자유롭다.
-
dispatch queue 에 전달하는 task 는 function 이나 block object 형태이다.
-
dispatch queue 는 GCD ( grand central dispatch ) 기술의 일부분이다.
Dispatch Sources
-
dispatch sources 는 system event 를 비동기적으로 처리하기 위한 c 기반의 매커니즘이다.
-
dispatch source 는 특정 system event type 을 캡슐화하며,
해당 event 가 발생하면 dispatch queue 에 특정 block object 나 함수를 전달하여 수행하게 한다.
-
다음과 같은 system event 에 대해 dispatch source 를 사용할 수 있다.
Timer
Signal handler
descriptor-related events
process-related events
mach port event
당신이 야기하는 custom events
Operation Queue
-
operation queue 는 cocoa 에서 사용하는 dispatch queue 이며, NSOperationQueue class 를 구현한 것이다.
-
기본 dispatch queue 는 FIFO 방식으로 task 를 처리하는 반면, operation queue 는 다른 factor 를 주어 우선순위라던지 작동방식 등을 수정할 수 있다.
-
operation queue 에 전달되는 task 는 NSOperation 객체여야만 한다.
NSOperation 는 abstract base class 로, subclass 를 만들어야 한다.
기본구현된 녀석도 제공을 하고 있으니 참고하면 된다.
-
NSOperation object 는 key-value observing (KVO) notification 을 가지고 있어,
task의 progress 를 보기에 좋다.
-
operation queue 는 항상 concurrent 하게 작동하기 때문에,
다른 task 와 디펜던시를 주어야 serial 방식으로 작동하게 할 수 있다.
비동기 디자인 테크닉
-
비동기를 사용하는 것은 UI thread 의 자유를 더 보장하고,
더 많은 core 를 활성화시켜 더 좋은 performance 를 낼 수 있다는 이야기이기도 하지만,
코드가 어려워질 수 있고, 디버깅도 어려울 수 있다는 단점도 가지고 있기 때문에
꼭 비동기를 해야 하는지 반드시 고려해보아야 한다.
-
비동기를 사용하는 것이 무조건 성능 개선으로 이어지는 것도 아니다.
비동기로 무거운 작업 ( CPU 던 메모리던.. ) 을 수행하면,
전체적인 퍼포먼스가 늦어질 수 있다.
memory 측면에서 paging 같은 현상이 발생하면 최악의 경우가 되기도 한다.
그래서 항상 performance tool 과 함께 task 에서 하는 일을 잘 쪼개는 것도 생각해야 한다.
OpenCL 과 병렬
-
OS X 에서는 OpenCL 을 사용하여 비동기 처리가 가능하다.
Open CL 은 Open Computing Language 의 약자로 일반적인 목적의 계산을 수행하는 graphic processor 이다.
-
pixel filter 라던지, 복잡한 수학적 계산이라던지 이런 것들을 잘 정의할수만 있다면,
OpenCL 을 이용하여 병렬적인 계산을 더 nice 하게 할 수 있다.
-
OpenCL 이 병렬 계산을 하는 데 좋긴 하지만 일반적인 계산에는 좋지 않을 수 있다.
data 를 준비하고 전송하는데 많은 노력이 필요하기 때문이다.
반대로 OpenCL 을 통해 생성된 데이터를 가져오는 데도 엄청난 노력이 필요하다.
Thread 를 써야 할 때
-
operation queue, dispatch queue 등이 만병 통치약은 아니다.
언젠가는 thread 를 써야 할 일이 생길텐데, 그 때는 최소한의 갯수를 유지하도록 노력해야 한다.
'프로그래밍 놀이터 > iOS' 카테고리의 다른 글
[iOS Study] 병렬 프로그래밍 가이드 ( dispatch source ) (0) | 2017.07.03 |
---|---|
[iOS Study] 병렬 프로그래밍 가이드 ( operation queue ) (0) | 2017.07.02 |
[iOS] can't return type callbacks for 3 (0) | 2017.06.28 |
[iOS] Java 의 equals 구현하기 (0) | 2017.06.27 |
[iOS] 연락처의 Favorite 정보를 AddressBook 을 통해 가져올 수 있는가? (0) | 2017.06.26 |
댓글