기어가더라도 제대로

CGD, Dispatch Source(feat. Event) 본문

생각정리/번역글(blog, WWDC)

CGD, Dispatch Source(feat. Event)

Damagucci-juice 2022. 9. 1. 12:17

개요

system 함수를 호출 할 때 적지 않은 시간이 들것을 예상해야한다.

커널이나 다른 시스템 레이어에 문맥교환이 일어나면 프로세스에서 문백 교환이 일어나는 것보다 훨씬 비싼 자원이 소모된다.

그 결과 많은 시스템 라이브러리들은 비동기 작업 처리 인터페이스를 마련해놓았다. 덕분에 작업을 요청하고 요청이 처리되는 동안 다른 일들을 할 수 있다. GCD 는 블락과 디스패치 큐를 사용해서 요청을 제출하고 원래의 코드로 되돌아왔음을 알리는 결과를 가지는 일반적인 행동을 정립하였다.

디스패치 소스(Dispatch Source) 에 대해서 알아보기

Dispatch Source 는 저수준의 시스템 이벤트의 처리를 조율하는 근원적인 데이터 타입이다.
GCD 는 다음과 같은 Dispatch Source 에 타입에 대해 지원한다.

  • Timer dispatch source 는 주기적인 알림을 생성한다
  • Signal Dispatch source 는 UNIX signal 이 도착하면 알린다.
  • Descriptor Source 는 다양한 파일, 소켓 기반의 작업을 당신에게 알려준다.
    • data 를 읽을 준비가 되었을 때
    • write 작업이 준비 되었을 때
    • file이 file system 에서 삭제되거나, 이동되거나 이름이 바뀌었을 때
    • file 의 메타 정보가 바뀌었을 때
  • Process dispatch source 는 process 와 관련한 이벤트를 당신에게 알려준다.
    • 언제 프로세스가 종료되었는가
    • 언제 프로세스가 forkexec 타입의 호출을 발행했는가
    • 언제 signal 이 프로세스에 도착했는가?
  • Mach port dispatch sources 는 Mach에 관련한 이벤트를 알립니다.
  • Custom dispatch source 는 당신이 정의하고 스스로 촉발한 소스 입니다.

Dispatch Source 는 시스템과 관련한 이벤트의 처리를 해오던 비동기 콜백 함수를 대채한다.

dispatch source를 구성할 때, 당신은

  • events - 당신이 모니터링하고 싶은 이벤트
  • dispatch queue - 이러한 이벤트를 처리하는데 사용할 큐
  • code - 이러한 이벤트를 처리하는데 사용할 코드

등을 구체화해야한다.

특히 코드는 block object나 함수를 이용해 구체화 할 수 있다. 관심있는 이벤트가 도착하면, 디스패치 소스는 당신의 블럭이나 함수를 특정된 디스패치큐에 실행하라고 제출한다.

큐에 수동으로 보낸 task 들과 달리, 디스패치소스는 앱에 대한 지속적인 이벤트의 원천이다. 디스패치 소스는 디스패치큐에 그것을 명시적으로 취소하지 않는 이상 남아있다. 남아있는 동안 이벤트 소스는 그것에 관련된 task 코드를 디스패치 큐에 동일한 이벤트가 발생할 때마다 제출한다. 타이머 이벤트와 같은 몇몇 이벤트들은 일정한 간격을 두고 발생하지만, 대부분은 구체적인 조건이 충족되면 산발적으로 발생한다. 이러한 이유 때문에 디스패치 소스는 아직 작업이 걸려있는 동안 완성되지 않는 작업이 방출되지 않도록 관련한 디스패치 큐를 붙잡고 있다. (stream 도 disposebag 에 넣기전엔 붙잡고 있다.)

디스패치 큐이 이벤트가 밀리는 것을 막기 위해서, 이벤트 합치기 전략을 사용한다. 이전에 이벤트를 다루던 이벤트 핸들러가 디큐되고 실행되기 전에 새로운 이벤트가 도착하면, 디스패치 소스는 새로운 데이터와 새로운 데이터를 합친다. 이벤트의 타입에 따라 다른데, 오래된 타입을 새로운 유형으로 교체하는 것이 될 수도 있고 오래된 데이터를 유지한체 업데이트만 하는 경우가 있을 수 있다. 예를 들어 siganl 기반의 디스패치 소스는 가장 최근 signal 에 대한 정보를 제공하지만 또한 마지막 이벤트 핸들러가 발동되고 나서 총 몇개의 시그날이 전달되었는지도 보고를 한다.

출처

https://developer.apple.com/library/archive/documentation/General/Conceptual/ConcurrencyProgrammingGuide/GCDWorkQueues/GCDWorkQueues.html

 

Dispatch Sources

Dispatch Sources Whenever you interact with the underlying system, you must be prepared for that task to take a nontrivial amount of time. Calling down to the kernel or other system layers involves a change in context that is reasonably expensive compared

developer.apple.com

 

역자의 말

명시적으로 디스패치 소스를 취소하기 전까지는 관련 디스패치 큐를 붙잡고 있다는 말이
RxSwift의 stream과 DisposedBag 같다는 생각이 들었습니다.

signal 이라는 것이 뭔지 잘몰라 앞으로 공부를 해야겠네요.

Comments