플러터 엔진의 4가지 스레드
(본 글은 공부하며 적은 글로서 100% 맞음을 보장할 수 없습니다. 틀린 곳은 조언해주시면 감사하겠습니다!)
Dart Developers Korea 오픈채팅방 https://open.kakao.com/o/gYyufB6
지난 글에(https://brunch.co.kr/@myner/3) 이어서 아직 Flutter의 개요이다.
개요라고하기엔 너무 깊이들어간건가...
여하튼.. Dart를 지나 Flutter 엔진을 간략하게 보기로 하자~
Flutter Engine는 자체적으로 관리 스레드를 생성하지 않는다.
그럼 누가? 관리하는가? Embedder가 한다.
Embedder??
그것은 대체 무엇인가? 이를 찾기 위해 Flutter Engine의 소스 코드를 봐보자.
위 그림은 ios simulator 버전으로 컴파일 완료된 엔진 소스의 폴더 들이다. 보면 flutter/shell/platform/
embedder라는 패키지가 존재한다. 구성 파일들을 보면 engine, surface, platformview 등이 존재한다. 뭔가 딱 봐도 중요해 보인다!
Embedder는 사실 플랫폼 레이어에 속하게 된다. 플랫폼 레이어에서 Shell은 DartVM을 호스팅 한다. Shell은 고유한 플랫폼 API로 기본 플랫폼 API에 액세스하고 플랫폼 관련 Canvas 설정을 호스팅 한다. Embedder는 엔진을 가지고 있는 플랫폼의 중간계층을 나타 낸다고 볼 수 있다.
Flutter Engine은 Embeder에게 4개의 TaskRunner를 제공한다. Flutter 엔진은 Runner가 실제로 실행되는 스레드를 신경 쓰지 않아도 되지만 스레드 수명주기 동안 안정적으로 유지되어야 한다.
실제 코드에서 살펴보자
embedder/embedder.cc에서 FlutterEngineRun이라는 함수에 가서 보면
ThredHost를 생성하고 GPU, IO, UI 스레드를 만들어 관리하도록 한다. 그리고 아래에 보면 PlatformRunner초기화를 위해 EnsureInitializedForCurrentThread함수를 호출하였고 이렇게 총 4개의 스레드를 blink의 TaskRunners라는 클래스로 묵어서 관리한다.
thread_host의 내부를 보면 스레드 생성 코드를 볼 수 있다.
자세히 찾아보지 않았지만 느낌적 느낌으로 판단해보자...
MessageLoop에서 탄생한 PlatformRunner는 주 스레드로서 Android나 iOS로 치면 메인 UI스레드와 유사할 것 같다. Flutter Engine과의 모든 상호작용의 책임을 지게 될 것이고 다른 스레드에서 Flutter 엔진을 호출하면 예기치 않은 예외가 발생 할듯 싶다. Flutter Engine의 많은 모들은 스레드 세이프하지 않은걸로 보인다. 엔진이 실행되는 순간 모든 엔진 API 호출은 Platform Runner에서 발생한다. 또한 Platform의 메시지도 처리하게 된다.
UI Runner는 Dart Runner라고도 불린다. Flutter Engine에서 Dart Root isolated를 실행하는 데 사용된다. Root isolated는 응용프로그램의 주 코드를 실행하고 렌더링을 위해 Layer Tree준비까지 담당한다. Layer Tree가 무엇인지는 다음에 다루도록 하겠다. 지금은 그림을 그려야 할 도표 정도라고 생각하면 된다.
또한, Native Plugins, Timers, Microtasks 및 비동기 IO의 메시지 응답도 처리합니다.
GPU Runner는 GPU 관련 함수를 호출을 한다. UI Runner가 만들어준 Layer Tree를 보고 GPU명령어로 변환한다. 또한 플랫폼의 Frame Buffer, Surface LifeCycle 등등 GPU 자원을 사용하는데 책임을 지고 있다.
I/O Runner는 흔히 생각하는 그 I/O스레드라고 생각하면 된다. 작업이 오래 걸리는 부분을 이곳에서 실행시켜주는 것이다.
뭔가 주저리 주저리 쓴거같다.
뒤죽박죽... 나도 잘 모르겠다..
하지만 필자는 그리고 이 글을 보고있는 여러분 우리 모두는 느낌적 느낌을 소유하고 있으니... 마음으로 이해해보도록하자 .. (죄송...)
다음글(https://brunch.co.kr/@myner/6)은 Flutter에서는 실제 Androd, iOS 프로젝트가 Flutter와 어떻게 함께 구성되는지 구조를 보도록 하겠다!!
<참고문헌>
https://flutter.io/docs/resources/technical-overview
https://github.com/flutter/flutter
https://github.com/flutter/engine
https://docs.flutter.io/index.html
https://buildflutter.com/how-flutter-works/
https://www.yuque.com/xytech/flutter/kwoww1