Dart VM 的相关简介与运行模式解析,rrxjava原理

本文介绍了Dart VM的运行机制,包括Dart代码在隔离宇宙中的执行,以及多线程与VM的关系。重点讨论了JIT编译过程,包括从源代码到内核二进制文件的转换,以及未优化和优化编译器的工作原理,如内联缓存和去优化。此外,还提到了Flutter的热重载和编译流程。
摘要由CSDN通过智能技术生成

VM 中
的任何 Dart 代码都在某个 isolate 中运行,可以将其描述为:具有自己的内存(堆)并且通常具有自己的控制线程(mutator 线程)的 Dart 隔离宇宙

VM 可以有许多 isolate 同时执行 Dart 代码,但它们不能直接共享任何状态,只能通过端口传递消息进行通信(不要与网络端口混淆!)。

这里的 OS 线程和 isolate 之间的关系有点模糊,并且高度依赖于虚拟机嵌入到应用程序的方式,但是主要需要保证以下内容:

  • 一个 OS 线程一次只能进入一个 isolate ,如果它想进入另一个 isolate,它必须离开当前 isolate
  • 一次只能有一个与 isolate 相关联的 Mutator 线程,Mutator 线程是执行 Dart 代码并使用 VM 的公共 C API 的线程。

然而同一个 OS 线程可以先进入一个 isolate 执行 Dart 代码,然后离开这个 isolate 并进入另一个 isolate 继续执行;或者有许多不同的 OS 线程进入一个 isolate 并在其中执行 Dart 代码,只是不会同时发生。

当然,除了单个 Mutator 线程之外,isolate 还可以关联多个辅助线程,例如:

  • 一个后台 JIT 编译器线程;
  • GC sweeper 现场;
  • 并发 GC marker 线程;

VM 在内部使用线程池 (dart::ThreadPool) 来管理 OS 线程,并且代码是围绕 dart::ThreadPool::Task 概念而不是围绕 OS 线程的概念构建的。

例如在 GC VM 中将 dart::ConcurrentSweeperTask 发布到全局 VM 的线程池,而不是生成专用线程来执行后台清除,并且线程池实现要么选择空闲线程,要么在没有可用线程时生成新线程;类似地,用于 isolate 来消息处理事件循环的默认实现实际上,并没有产生专用的事件循环线程,而是在新消息到达时将dart::MessageHandlerTask 发布到线程池

dart::Isolate 类相当于一个 isolatedart::Heap 类相当于 isolate 的堆,dart::Thread 类描述了线程连接到 isolate 相关的状态。

请注意,该名称 Thread 可能会让人有些困惑,因为所有 OS 线程都附加到与 Mutator 相同的 isolate,将重用相同的 Thread 实例。有关 isolate 消息处理的默认实现,请参阅 Dart_RunLoopdart::MessageHandler

通过 JIT 运行源代码

本节将介绍当从命令行执行 Dart 时会发生什么:

// hello.dart
main() => print(‘Hello, World!’);

$ da

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值