Concurrency Programming Guide - 2
Concurrency Programming Guide - 1
Concurrency Programming Guide - 2
GCD (Grand Central Dispatch)
Dispatch Sources
-
Dispatch sources
는특정타입의 시스템 이벤트를 비동기적으로 처리하기 위한
C기반 메커니즘 -
Dispatch sources
는특정타입의 시스템 이벤트에 대한 정보를 캡슐화
하고해당 이벤트
가발생
할 때 마다특정 블록객체 또는 함수
를Dispathch queue
로전송
한다. -
Dispatch sources
를사용
하여다음 타입의 시스템 이벤트
를모니터링
할 수 있다.-
Timers - 타이머
-
Signal handlers - 시그널 처리(관리, 핸들러)
-
Descriptor-related events - 디스크립터 관련 이벤트
-
Process-related events - 프로세스 관련 이벤트
-
Mach port events - 마이크로커널 포트 이벤트
-
Custom events that you - 내가 트리거 한 커스텀 이벤트
-
-
Dispatch sources는 GCD 기술의 일부이다.
Operation Queues
-
Operation queue
는Concurrent dispatch queue
와Cocoa 개발환경
과동등
하며NSOperationQueue 클래스
에 의해구현
된다. -
operation queues
는작업의 실행 순서
를결정할 때 다른 요인
을고려
-
이러한 요소
중가장 중요한 것
은주어진 작업
이다른 작업의 완료 여부에 의존하는지 여부
-
task
를정의 할 때
,종속성
을구성
하고이를 사용
하여task
에대한 복잡한 실행 순서 그래프
를만들 수 있다
.
-
-
operation queue
에제출
하는task
는NSOperation 클래스
의인스턴스
여야 한다. -
#
Operation 객체
는수행 할 task
와해당 task
를수행하는 데 필요한 데이터
를캡슐화
하는Objective-C 객체
이다. -
NSOperation 클래스
는추상 기본 클래스
이기 때문에,일반적으로 사용자 지정 하위 클래스를 정의하여 task를 수행
한다. -
Foundation 프레임워크
에는task
를수행
하기 위해만들고 사용 할 수 있는
몇가지구체적인 하위 클래스가 포함
되어 있다. -
Operation 객체
는KVO(key - value observing)알림
을생성
하므로,작업 진행 상황
을모니터링 하는 유용한 방법
이 될 수 있다 -
operation queues
는항상 operation을 동시에 실행
하지만,종속성을 사용
하여필요할 때 순차적
으로실행되도록 할 수 있다
.
Asynchronous Design Techniques (비동기 디자인 테크닉)
-
동시성(concurrency)
을 지원하기 위해 코드를 재설계하는 것을 고려하기 전에, 그렇게 해야하는지 여부를 자문해야 한다 -
동시성은 주 쓰레드가 사용자 이벤트에 자유롭게 응답할 수 있도록 함으로써 코드의 응답성을 향상시킬수 있다.
-
동일한 시간 내에 더 많은 코어를 활용하여 더 많은 작업을 수행함으로써 코드의 효율성을 향상시킬수도 있다.
-
그러나 오버헤드가 증가, 코드의 전체적인 복잡성 증가
- 그러므로 코드 작성 및 디버그가 더 어려워진다.
-
-
복잡성을 추가하기 때문에, 동시성은 제품주기가 끝날 때 앱에 접목 할 수 있는 기능이 아니다.
-
올바르게 하려면, 앱에서 수행하는 작업과 이러한 작업을 수행하는데 사용된 데이터 구조를 신중하게 고려해야 한다.
-
코드가 잘못 실행되면 코드 실행속도가 이전보다 느려지고, 사용자에게 응답해주는 속도가 느려질 수 있다.
- 따라서 설계주기 초반에 몇가지 목표를 세우고 취해야 할 접근법에 대해 생각해봐야 한다.
-
모든 앱마다 요구사항이 다르며, 수행 할 task 집합이 다르다.
-
문서가 앱 및 관련 작업을 설계하는 방법을 정확하게 알려주는것은 불가능하다.
Define Your Application’s Expected Behavior (앱의 예상 동작 정의)
-
앱에 동시성을 추가하는 것에 대해 생각하기 전에, 항상 앱의 올바른 동작으로 간주되는 것을 정의하여 시작해야 한다.
-
앱의 예상 동작을 이해하면, 설계를 나중에 검증 할 수 있다.
-
동시성을 도입하여 얻을 수 있는 예상 성능 이점에 대한 아이디어를 제공해야한다.
-
가장 먼저 해야할 일은 앱이 수행하는 task와 각 task와 관련된 객체 또는 데이터 구조를 열거하는 것 이다.
-
처음에는 사용자가 메뉴 항목을 선택하거나 button을 클릭 할 때 수행되는 task로 시작하고자 할 수 있다.
-
이러한 task는 개별 동작을 제공하며 잘 정의 된 시작점과 끝점을 갖는다
-
또한 Timer 기반 작업과 같이 사용자 상호작용 없이 앱이 수행 할 수 있는 다른 타입의 작업을 열거해야 한다.
-
-
-
상위 수준의 task 목록을 얻은 후에는 각 task를 성공적으로 완료하기 위해서 취해야하는 일련의 단계로 세분화
-
이 레벨에서는 데이터 구조와 객체에 대해 수정해야 할 사항과 이러한 수정이 앱의 전체 상태에 미치는 영향에 주로 염두해야한다.
-
또한 객체와 데이터구조 사이의 모든 종속성을 기록해야 한다.
-
-
예를들어, task가 객체배열에 동일한 변경을 가하는 경우, 한 객체에 대한 변경이 다른 객체에 영향을 미치는지 여부는 주목해야한다.
-
객체가 서로 독립적으로 수정 될 수 있는 경우, 해당 객체를 “동시에” 수정 할 수 있다.