본문 바로가기
프로그래밍 놀이터/iOS

[iOS Study] 병렬 프로그래밍 가이드 ( 병렬 앱 디자인 )

by 돼지왕 왕돼지 2017. 7. 1.
반응형

 [iOS Study] 병렬 프로그래밍 가이드 ( 병렬 앱 디자인 )


https://developer.apple.com/library/ios/documentation/General/Conceptual/ConcurrencyProgrammingGuide/ConcurrencyandApplicationDesign/ConcurrencyandApplicationDesign.html#//apple_ref/doc/uid/TP40008091-CH100-SW1


abstract base class, Apple, background, block object, c 기반 매커니즘, Callback, CLASS, Cocoa, concurrent, concurrent dispatch queue, core, CPU, custom events, custom task, DeadLock, dependent, descriptor-related events, dispatch queue, dispatch sources, event, Factor, FIFO, function, GCD, grand central dispatch, graphic processor, Interface, IOS, key-value observing, kvo, LOCK, match port event, Memory, notification, NSOperation, nsoperationqueue, object, Objective-C, open computing language, OpenCL, operation queue, OS, OSX, paging, Performance, pixel filter, process-related events, progress, Scale, Schedule, Scheduling, serial, serial dispatch, serial dispatch queue, signal handler, subclass, Synchronization, System, system event type, system level, task, thread, thread pool, thread 관리, timer, UI Thread, [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 를 써야 할 일이 생길텐데, 그 때는 최소한의 갯수를 유지하도록 노력해야 한다.




반응형

댓글