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 queueConcurrent dispatch queueCocoa 개발환경동등하며 NSOperationQueue 클래스에 의해 구현된다.

  • operation queues작업의 실행 순서결정할 때 다른 요인고려

    • 이러한 요소가장 중요한 것주어진 작업다른 작업의 완료 여부에 의존하는지 여부

    • task정의 할 때, 종속성구성하고 이를 사용하여 task대한 복잡한 실행 순서 그래프만들 수 있다.

  • operation queue제출하는 taskNSOperation 클래스인스턴스여야 한다.

  • #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가 객체배열에 동일한 변경을 가하는 경우, 한 객체에 대한 변경이 다른 객체에 영향을 미치는지 여부는 주목해야한다.

  • 객체가 서로 독립적으로 수정 될 수 있는 경우, 해당 객체를 “동시에” 수정 할 수 있다.