原文: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并发模型的轻量级优化的更多相关文章

  1. 关于并发模型 Actor 和 CSP

    最近在看<七天七并发模型>这本书,在书上介绍了 Actor 和 CSP 这两种并发模型.这两种模型很像,但还是有一些不同的地方.看完之后,比较困扰的是: 在什么场合使用哪种模型比较好呢? ...

  2. 三分钟掌握共享内存 & Actor并发模型

    吃点好的,很有必要.今天介绍常见的两种并发模型: 共享内存&Actor 共享内存 面向对象编程中,万物都是对象,数据+行为=对象: 多核时代,可并行多个线程,但是受限于资源对象,线程之间存在对 ...

  3. 共享内存 & Actor并发模型哪个更快?

    HI,前几天被.NET圈纪检委@懒得勤快问到共享内存和Actor并发模型哪个速度更快. 前文传送门: 说实在,我内心10w头羊驼跑过...... 先说结论 首先两者对于并发的风格模型不一样. 共享内存 ...

  4. Actor模型和CSP模型的区别

    引用至:http://www.jdon.com/concurrent/actor-csp.html Akka/Erlang的actor模型与Go语言的协程Goroutine与通道Channel代表的C ...

  5. 三分钟掌控Actor模型和CSP模型

    回顾一下前文<三分钟掌握共享内存模型和 Actor模型> Actor vs CSP模型 传统多线程的的共享内存(ShareMemory)模型使用lock,condition等同步原语来强行 ...

  6. 并发模型与IO模型梳理

    并发模型 常见的并发模型一般包括3类,基于线程与锁的内存共享模型,actor模型和CSP模型,其中尤以线程与锁的共享内存模型最为常见.由于go语言的兴起,CSP模型也越来越受关注.基于锁的共享内存模型 ...

  7. Java并发模型(一)

    学习资料来自http://ifeve.com/java-concurrency-thread-directory/ 一.多线程 进程和线程的区别: 一个程序运行至少一个进程,一个进程至少包含一个线程. ...

  8. Go_CSP并发模型

    go语言的最大两个亮点,一个是goroutine,一个就是chan了.二者合体的典型应用CSP,基本就是大家认可的并行开发神器,简化了并行程序的开发难度,我们来看一下CSP. 11.1.CSP是什么 ...

  9. 一网打尽 Java 并发模型

    本篇文章我们来探讨一下并发设计模型. 可以使用不同的并发模型来实现并发系统,并发模型说的是系统中的线程如何协作完成并发任务.不同的并发模型以不同的方式拆分任务,线程可以以不同的方式进行通信和协作. 并 ...

  10. web并发模型

    并发:cpu划分时间片,轮流执行每个请求任务,时间片到期后,换到下一个. 并行:在多核服务器上,每个cpu内核执行一个任务,是真正的并行 IO密集型的应用,由于请求过程中很多时间都是外部IO操作,CP ...

随机推荐

  1. STL-list模拟实现

    #pragma once #include"16my_Itetator.h" //测试用 #include<iostream> //测试用 using std::cou ...

  2. C++ mySQL数据库连接池(windows平台)

    C++ MySQL数据库连接池 新手学了C++多线程,看了些资料练手写了C++数据库连接池小项目,自己的源码地址 关键技术点 MySQL数据库编程.单例模式.queue队列容器.C++11多线程编程. ...

  3. win上vscode出现undefined reference to `__imp_WSACleanup'

    示例代码 #include <iostream> // 推荐加上宏定义 #define WIN32_LEAN_AND_MEAN #include <winsock2.h> #i ...

  4. Netty笔记(4) - 对Http和WebSocket的支持、心跳检测机制

    对HTTP的支持 服务端代码: 向 PipeLine中 注册 HttpServerCodec Http协议的编码解码一体的Handler 处理Http请求 封装Http响应 public class ...

  5. PHP四则运算类(支持加、减、乘、除、小中括号)

    <?php /** * 四则运算(支持加.减.乘.除.小中括号) * Class calculator */ class calculator { //保留几位小数点 public $point ...

  6. CYQ.Data 支持 KingbaseES人大金仓数据库

    KingbaseES人大金仓数据库介绍: KingbaseES是一种关系型数据库管理系统,也被称为人大金仓数据库.KingbaseES 是北京人大金仓信息技术股份有限公司研发的,具有自主知识产权的通用 ...

  7. Java 程序员第一次运行 Python 项目,使用 python-pptx 提取 ppt 中的文字和图片

    人工智能时代,最需要学习的编程语言是:python .笔者是个 python 小白,昨天花了两个小时,第一次成功运行起来 python 项目 . 项目是 powerpoint-extractor ,可 ...

  8. Zabbix“专家坐诊”第183期问答汇总

    问题一 Q:老师,请问一下zabbix采集的数据怎么过滤,获取数据是nottime=20:30 notafter=3,怎么过滤出netafter=3 ?谢谢. A:过滤器设置如下图. 问题二 Q:大佬 ...

  9. Java中使用JSON传递字符串的注意事项

    一.问题由来 项目开发中,由于实际需要将某一个功能模块抽取成了一个单独的服务,其他地方需要调用的时候,通过Spring提供的RestTemplate类发送请求进行调用. 经过测试这种方法完全可行,我和 ...

  10. 基于C语言的串口AT指令发送实例解析

    一 知识点 1 AI指令后面一定要加 \n\r 2 注意AT指令里面待双引号的这种,要使用斜杠隔开. 二 源码: void Set_Pdu_Mode(void) { u8 a = 1; if(atKe ...