Lite Actor:方舟Actor并发模型的轻量级优化
原文:https://mp.weixin.qq.com/s/8biIBddpy6GKgakazg1vcg,点击链接查看更多技术内容。
并发模型是用来实现不同应用场景中并发任务的编程模型,通过合理地使用多线程,可以缩减应用程序的开发和维护成本,同时还能更好地提升应用程序在多核设备中的运行性能。随着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仍有很大的探索空间,期待广大开发者加入我们,共同见证万物互联的无限可能。

Lite Actor:方舟Actor并发模型的轻量级优化的更多相关文章
- 关于并发模型 Actor 和 CSP
最近在看<七天七并发模型>这本书,在书上介绍了 Actor 和 CSP 这两种并发模型.这两种模型很像,但还是有一些不同的地方.看完之后,比较困扰的是: 在什么场合使用哪种模型比较好呢? ...
- 三分钟掌握共享内存 & Actor并发模型
吃点好的,很有必要.今天介绍常见的两种并发模型: 共享内存&Actor 共享内存 面向对象编程中,万物都是对象,数据+行为=对象: 多核时代,可并行多个线程,但是受限于资源对象,线程之间存在对 ...
- 共享内存 & Actor并发模型哪个更快?
HI,前几天被.NET圈纪检委@懒得勤快问到共享内存和Actor并发模型哪个速度更快. 前文传送门: 说实在,我内心10w头羊驼跑过...... 先说结论 首先两者对于并发的风格模型不一样. 共享内存 ...
- Actor模型和CSP模型的区别
引用至:http://www.jdon.com/concurrent/actor-csp.html Akka/Erlang的actor模型与Go语言的协程Goroutine与通道Channel代表的C ...
- 三分钟掌控Actor模型和CSP模型
回顾一下前文<三分钟掌握共享内存模型和 Actor模型> Actor vs CSP模型 传统多线程的的共享内存(ShareMemory)模型使用lock,condition等同步原语来强行 ...
- 并发模型与IO模型梳理
并发模型 常见的并发模型一般包括3类,基于线程与锁的内存共享模型,actor模型和CSP模型,其中尤以线程与锁的共享内存模型最为常见.由于go语言的兴起,CSP模型也越来越受关注.基于锁的共享内存模型 ...
- Java并发模型(一)
学习资料来自http://ifeve.com/java-concurrency-thread-directory/ 一.多线程 进程和线程的区别: 一个程序运行至少一个进程,一个进程至少包含一个线程. ...
- Go_CSP并发模型
go语言的最大两个亮点,一个是goroutine,一个就是chan了.二者合体的典型应用CSP,基本就是大家认可的并行开发神器,简化了并行程序的开发难度,我们来看一下CSP. 11.1.CSP是什么 ...
- 一网打尽 Java 并发模型
本篇文章我们来探讨一下并发设计模型. 可以使用不同的并发模型来实现并发系统,并发模型说的是系统中的线程如何协作完成并发任务.不同的并发模型以不同的方式拆分任务,线程可以以不同的方式进行通信和协作. 并 ...
- web并发模型
并发:cpu划分时间片,轮流执行每个请求任务,时间片到期后,换到下一个. 并行:在多核服务器上,每个cpu内核执行一个任务,是真正的并行 IO密集型的应用,由于请求过程中很多时间都是外部IO操作,CP ...
随机推荐
- 图像识别算法--VGG16
前言:人类科技就是不断烧开水(发电).丢石头(航天等).深度学习就是一个不断解方程的过程(参数量格外大的方程) 本文内容: 1.介绍VGG16基本原理 2.VGG16 pytorch复现 图像识别算法 ...
- 2024-03-09:用go语言,我们把无限数量的栈排成一行,按从左到右的次序从 0 开始编号, 每个栈的的最大容量 capacity 都相同。实现一个叫「餐盘」的类 DinnerPlates, Di
2024-03-09:用go语言,我们把无限数量的栈排成一行,按从左到右的次序从 0 开始编号, 每个栈的的最大容量 capacity 都相同.实现一个叫「餐盘」的类 DinnerPlates, Di ...
- STM32标准库通用定时器输入捕获
STM32标准库定时器输入捕获 1.输入捕获介绍 输入捕获为STM32定时器的一个功能,可以用来测量输入信号的频率和占空比. 具体原理:当输入信号经过比较捕获通道时,STM32会依据通道的极性设置决定 ...
- git拉项目, 1.新建目录 2 git clone 地址 . (重点最后的点)
- Win10使用Dism++离线安装.Net3.5
.Net3.5的安装包在Win10已经不能使用了,在线安装.Net3.5会很卡(跟网络无关),最好是使用Dism++提取Win10系统镜像文件离线安装. 打开Dism++软件,按照如下步骤操作: 选择 ...
- 基于ESP8266的JSON解析实例分析
什么是JSON? JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.采用完全独立于编程语言的文本格式来存储和表示数据.其简洁和层次结构清晰的特点使得 J ...
- live555使用NDK21编译出arm64-v8a和armeabi-v7a
一.编译环境 ubuntu环境 NDK21,下载地址链接 live555源码live555源码 二.编写编译脚本 环境和源码弄好后,就可以开始进行编写编译脚本 1 编写arm64-v8a脚本 将下载好 ...
- .gvfs 文件夹 异常
PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明 本文作为本人csdn blog的主站的备份.(Bl ...
- FFmpeg 基本操作摘要(一) (转流、解码、编码)
PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明 本文作为本人csdn blog的主站的备份.(Bl ...
- HISI3520DV300 折腾记录(二)之《内存映射、存储(DDRC,FMC)、启动模式分析》
PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明 本文作为本人csdn blog的主站的备份.(Bl ...