并发模型是用来实现不同利用场景中并发工作的编程模型,通过正当地应用多线程,能够缩减应用程序的开发和保护老本,同时还能更好地晋升应用程序在多核设施中的运行性能。随着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仍有很大的摸索空间,期待宽广开发者退出咱们,独特见证万物互联的有限可能。