写点什么

Lite Actor:方舟 Actor 并发模型的轻量级优化

  • 2022 年 7 月 18 日
  • 本文字数:1973 字

    阅读完需:约 6 分钟

Lite Actor:方舟Actor并发模型的轻量级优化

并发模型是用来实现不同应用场景中并发任务的编程模型,通过合理地使用多线程,可以缩减应用程序的开发和维护成本,同时还能更好地提升应用程序在多核设备中的运行性能。随着 IoT 时代下应用场景的不断复杂、多核设备的不断增多,并发模型显得举足轻重,本期我们将为大家带来方舟编译器对传统 Actor 并发模型的轻量级优化。

一、什么是并发模型?

在操作系统中,并发是任务在不影响最终执行结果的情况下无序或者按部分顺序执行的能力,如图 1 所示,在一个时间段中可能有多个任务都处于已启动运行到运行完毕之间,同时,并发单元也可以在多核设备下并行执行,可以极大地提高多核设备的运行性能。


图 1 并发单元的并行执行


在日常开发中,由于并发任务多种多样,任务拆分方式可能不同,线程间的通信方式也可能不同,所以不同场景下的多线程并发任务可以通过不同的并发编程模型来实现。常见的并发模型又分为内存共享的并发模型和消息通信的并发模型。其中,基于内存共享的并发模型存在数据竞争,往往需要锁或者其它同步机制来保护共享的可变数据。而基于消息通信的并发模型,不需要开发者去面对锁带来的一系列复杂偶发的问题,同时并发度也相对较高。


作为基于消息通信并发模型的典型代表,Actor 并发模型深受广大开发者的追捧。下面,我们将为大家带来 Actor 并发模型的解析。

二、Actor 并发模型

Actor 是一种历史悠久的分布式并发模型,基于事件(消息)机制传递数据,能有效地避免线程中资源争夺、死锁等情况。本节我们将为大家介绍 Actor 并发模型的交互原理以及在 JS 中的应用。


1. 交互原理

如图 2 所示,在典型的 Actor 交互流程中,各个 Actor 并发地处理主线程任务,每个 Actor 内部都有一个消息队列及单线程执行模块,消息队列负责接收主线程及其他 Actor 的请求,单线程执行模块则负责串行地处理请求、向其他 Actor 发送请求以及创建新的 Actor。由于 Actor 采用的是异步方式,各个 Actor 之间相互隔离没有数据竞争,因此 Actor 可以高并发运行。


图 2 Actor 交互流程


2. 应用场景

Actor 并发模型被广泛应用于 Erlang、Haskell、Akka(Java)、JS 等编程语言,下面我们将介绍 Actor 并发模型在 JS 中的应用。


(1) Worker 介绍

众所周知,JS 从诞生起就是单线程,为解决因单线程造成的 I/O 阻塞问题,JS 通过异步回调的方式并结合事件机制,充分提高了单线程下对于轻量级事件的响应速度。但是如果遇到某些比较复杂的任务,比如 CPU 密集型运算任务、I/O 密集型任务、同步任务等,仍采用单线程执行就显得有点力不从心,无法解决复杂任务的线程阻塞问题。所以,JS 需要引入多线程任务支持。


Worker 是较为典型的 JS 多线程解决方案,基于 Actor 并发模型实现,为 JS 创造多线程并发环境。如图 3 所示,在 Worker 的交互流程中,JS 主线程可以创建多个 Worker 子线程,各个 Worker 线程间相互隔离,并通过序列化传递对象,等到 Worker 线程完成计算任务,再把结果返回给主线程。


图 3 Worker 交互流程


(2) Worker 缺陷

Worker 实现了复杂 JS 应用的多线程并发执行,在一定程度上提升了复杂 JS 应用的运行效率。但是,由于每个 Worker 线程都拥有独立的虚拟机实例,且各个实例之间不共享任何数据,使得 JS Worker 启动速度较慢、内存占用较高。

三、Lite Actor

为了让 JS 应用能充分利用多核设备的计算能力更好地提升性能,方舟编译器提出了 Lite Actor 概念,并针对 Worker 的缺陷进行了优化。


1.  原理介绍

方舟编译器 JS 运行时在传统 Actor 并发模型的基础上,通过共享 Actor 实例中的不可变对象,以减少每个 Actor 实例承载的数据,提升了每个 Actor 的运行性能,从而实现 Actor 并发模型的轻量级优化。


图 4 Lite Actor


2. Worker 优化

方舟编译器 JS 运行时基于 Lite Actor 概念对 Worker 进行了优化,具体优化如下:

● 方舟编译器 JS 运行时通过内置的字节码文件管理器,已完成了对多个 Worker 间缓存的字节码文件的共享,大大减少了字节码的预加载处理时间以及内存占用。

● 方舟编译器 JS 运行时结合 TS 类型分析系统与对象分离技术,已经实现了 Worker 中部分 TS 类型信息与准静态类型信息的识别与共享,在一定程度上减少 Worker 线程的内存使用以及 Worker 线程间的信息传递耗时。同时,由于已共享的部分无需进行序列化拷贝传递,所以 Worker 的序列化时长也得到了相应的优化。目前,剩余未共享部分数据仍存在很大的提升空间,这部分工作仍会持续展开,让我们共同期待。 

● 针对外部内存的数据,例如字节码中的字符串,由于不受 JS 内存管理,未来也可以实现共享。


图 5 Worker 优化


3. 性能对比

使用方舟编译器的 Lite Actor 优化后,Worker 的性能得到了显著的增长,如图 6 所示,不难看出,相较于传统 Actor 并发模型,Worker 的启动时长及内存占用均优化了 50%以上。 


图 6 性能及内存对比


以上就是本期全部内容,方舟编译器 JS 运行时通过对传统 Actor 并发模型的轻量级优化,极大地提高了 Worker 的启动性能。当前 Lite Actor 仍有很大的探索空间,期待广大开发者加入我们,共同见证万物互联的无限可能。



用户头像

每一位开发者都是华为要汇聚的星星之火 2021.10.15 加入

提供HarmonyOS关键技术解析、版本更新、开发者实践和活动资讯,欢迎各位开发者加入HarmonyOS生态,一起创造无限可能!

评论

发布
暂无评论
Lite Actor:方舟Actor并发模型的轻量级优化_HarmonyOS_HarmonyOS开发者社区_InfoQ写作社区