共计 2174 个字符,预计需要花费 6 分钟才能阅读完成。
并发模型是用来实现不同利用场景中并发工作的编程模型,通过正当地应用多线程,能够缩减应用程序的开发和保护老本,同时还能更好地晋升应用程序在多核设施中的运行性能。随着 IoT 时代下利用场景的一直简单、多核设施的一直增多,并发模型显得无足轻重,本期咱们将为大家带来方舟编译器对传统 Actor 并发模型的轻量级优化。
一、什么是并发模型?
在操作系统中,并发是工作在不影响最终执行后果的状况下无序或者按局部程序执行的能力,如图 1 所示,在一个时间段中可能有多个工作都处于已启动运行到运行结束之间,同时,并发单元也能够在多核设施下并行执行,能够极大地提高多核设施的运行性能。
图 1 并发单元的并行执行
在日常开发中,因为并发工作多种多样,工作拆分形式可能不同,线程间的通信形式也可能不同,所以不同场景下的多线程并发工作能够通过不同的并发编程模型来实现。常见的并发模型又分为内存共享的并发模型和音讯通信的并发模型。其中,基于内存共享的并发模型存在数据竞争,往往须要锁或者其它同步机制来爱护共享的可变数据。而基于音讯通信的并发模型,不须要开发者去面对锁带来的一系列简单偶发的问题,同时并发度也绝对较高。
作为基于音讯通信并发模型的典型代表,Actor 并发模型深受宽广开发者的追捧。上面,咱们将为大家带来 Actor 并发模型的解析。
二、Actor 并发模型
Actor 是一种历史悠久的分布式并发模型,基于事件(音讯)机制传递数据,能无效地防止线程中资源抢夺、死锁等状况。本节咱们将为大家介绍 Actor 并发模型的交互原理以及在 JS 中的利用。
-
交互原理
如图 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 仍有很大的摸索空间,期待宽广开发者退出咱们,独特见证万物互联的有限可能。