<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

關于Actor并發模型的解析

HarmonyOS開發者 ? 來源:HarmonyOS開發者 ? 作者:wengchangcheng ? 2022-07-18 09:23 ? 次閱讀

并發模型是用來實現不同應用場景中并發任務的編程模型,通過合理地使用多線程,可以縮減應用程序的開發和維護成本,同時還能更好地提升應用程序在多核設備中的運行性能。隨著IoT時代下應用場景的不斷復雜、多核設備的不斷增多,并發模型顯得舉足輕重,本期我們將為大家帶來方舟編譯器對傳統Actor并發模型的輕量級優化。

一、什么是并發模型?

操作系統中,并發是任務在不影響最終執行結果的情況下無序或者按部分順序執行的能力,如圖1所示,在一個時間段中可能有多個任務都處于已啟動運行到運行完畢之間,同時,并發單元也可以在多核設備下并行執行,可以極大地提高多核設備的運行性能。

33e08234-0636-11ed-ba43-dac502259ad0.png

圖1 并發單元的并行執行

在日常開發中,由于并發任務多種多樣,任務拆分方式可能不同,線程間的通信方式也可能不同,所以不同場景下的多線程并發任務可以通過不同的并發編程模型來實現。常見的并發模型又分為內存共享的并發模型和消息通信的并發模型。其中,基于內存共享的并發模型存在數據競爭,往往需要鎖或者其它同步機制來保護共享的可變數據。而基于消息通信的并發模型,不需要開發者去面對鎖帶來的一系列復雜偶發的問題,同時并發度也相對較高。

作為基于消息通信并發模型的典型代表,Actor并發模型深受廣大開發者的追捧。下面,我們將為大家帶來Actor并發模型的解析。

二、Actor并發模型

Actor是一種歷史悠久的分布式并發模型,基于事件(消息)機制傳遞數據,能有效地避免線程中資源爭奪、死鎖等情況。本節我們將為大家介紹Actor并發模型的交互原理以及在JS中的應用。

1. 交互原理

如圖2所示,在典型的Actor交互流程中,各個Actor并發地處理主線程任務,每個Actor內部都有一個消息隊列及單線程執行模塊,消息隊列負責接收主線程及其他Actor的請求,單線程執行模塊則負責串行地處理請求、向其他Actor發送請求以及創建新的Actor。由于Actor采用的是異步方式,各個Actor之間相互隔離沒有數據競爭,因此Actor可以高并發運行。

33f7d09c-0636-11ed-ba43-dac502259ad0.png

圖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 線程完成計算任務,再把結果返回給主線程。

34107480-0636-11ed-ba43-dac502259ad0.png

圖3 Worker交互流程

(2) Worker缺陷

Worker實現了復雜JS應用的多線程并發執行,在一定程度上提升了復雜JS應用的運行效率。但是,由于每個Worker線程都擁有獨立的虛擬機實例,且各個實例之間不共享任何數據,使得JS Worker啟動速度較慢、內存占用較高。

三、Lite Actor

為了讓JS應用能充分利用多核設備的計算能力更好地提升性能,方舟編譯器提出了Lite Actor概念,并針對Worker的缺陷進行了優化。

1.原理介紹

方舟編譯器JS運行時在傳統Actor并發模型的基礎上,通過共享Actor實例中的不可變對象,以減少每個Actor實例承載的數據,提升了每個Actor的運行性能,從而實現Actor并發模型的輕量級優化。

3427dbf2-0636-11ed-ba43-dac502259ad0.png

圖4 Lite Actor

2. Worker優化

方舟編譯器JS運行時基于Lite Actor概念對Worker進行了優化,具體優化如下:

●方舟編譯器JS運行時通過內置的字節碼文件管理器,已完成了對多個Worker間緩存的字節碼文件的共享,大大減少了字節碼的預加載處理時間以及內存占用。

●方舟編譯器JS運行時結合TS類型分析系統與對象分離技術,已經實現了Worker中部分TS類型信息與準靜態類型信息的識別與共享,在一定程度上減少Worker線程的內存使用以及Worker線程間的信息傳遞耗時。同時,由于已共享的部分無需進行序列化拷貝傳遞,所以Worker的序列化時長也得到了相應的優化。目前,剩余未共享部分數據仍存在很大的提升空間,這部分工作仍會持續展開,讓我們共同期待。

●針對外部內存的數據,例如字節碼中的字符串,由于不受JS內存管理,未來也可以實現共享。

34342542-0636-11ed-ba43-dac502259ad0.png

圖5 Worker優化

3. 性能對比

使用方舟編譯器的Lite Actor優化后,Worker的性能得到了顯著的增長,如圖6所示,不難看出,相較于傳統Actor并發模型,Worker的啟動時長及內存占用均優化了50%以上。

34460d8e-0636-11ed-ba43-dac502259ad0.png

圖6 性能及內存對比

以上就是本期全部內容,方舟編譯器JS運行時通過對傳統Actor并發模型的輕量級優化,極大地提高了Worker的啟動性能。當前Lite Actor仍有很大的探索空間,期待廣大開發者加入我們,共同見證萬物互聯的無限可能。

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 模型
    +關注

    關注

    1

    文章

    2790

    瀏覽量

    47925
  • 編譯器
    +關注

    關注

    1

    文章

    1585

    瀏覽量

    48746
  • 方舟
    +關注

    關注

    0

    文章

    18

    瀏覽量

    8395

原文標題:Lite Actor:方舟Actor并發模型的輕量級優化

文章出處:【微信號:HarmonyOS_Dev,微信公眾號:HarmonyOS開發者】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    鴻蒙原生應用開發-ArkTS語言基礎類庫多線程并發概述

    并發模型是用來實現不同應用場景中并發任務的編程模型,常見的并發模型分為基于內存共享的
    發表于 03-22 15:40

    鴻蒙原生應用開發-ArkTS語言基礎類庫多線程并發概述

    并發模型是用來實現不同應用場景中并發任務的編程模型,常見的并發模型分為基于內存共享的
    發表于 03-28 14:35

    sushu---Actor Framework基本介紹

    一練]Actor Framework框架(1125-1201)2016-02-28 20:15:20新寫的一篇帖子:sushu---Actor Framework一種使用方式主貼里面循序漸進的介紹了一些信息?,F在
    發表于 01-03 20:05

    Actor Framework -- Test Sequence

    本帖最后由 shenjianym 于 2019-10-29 08:13 編輯 用Actor Framework框架寫了一個關于測試序列(生成隨機數并判斷)的程序。該程序使用的是LabVIEW2017版本,加2017版JKL狀態機。注:程序跑第二次的時候會出現BUG,
    發表于 10-28 15:28

    ActorFramework在測控設備上的應用

    Actor模型是1973年提出的一個分布式并發編程模式,在Erlang語言中得到廣泛支持和應用。在Actor模型中,
    發表于 05-27 09:04

    Actor框架介紹

    Actor Framework是一個軟件類庫,適用于多線程應用程序,每個操作者(Actors)執行獨立的線程任務,操作者本身可以傳遞消息也可以在操作者之間傳遞消息。1.右鍵我的電腦新建--操作者2.
    發表于 01-13 22:10

    ActorFramework開發實例-用戶管理模塊

    (1)Actor模型介紹Actor模型是1973年提出的一個分布式并發編程模式,在Erlang語言中得到廣泛支持和應用。在
    發表于 08-16 14:23

    Lite Actor:方舟Actor并發模型的輕量級優化

    基于消息通信并發模型的典型代表,Actor并發模型深受廣大開發者的追捧。下面,我們將為大家帶來Actor
    發表于 07-18 12:00

    移動應用高級語言開發——并發探索

    并發架構—Actor模型,具有無鎖、容易維護和測試、容錯性好以及分布式編程等優勢,但啟動較慢,并發的實例開銷大。對于JS并發API—Work
    發表于 08-28 17:08

    HarmonyOS使用多線程并發能力開發

    一、多線程并發概述 1、簡介 并發模型是用來實現不同應用場景中并發任務的編程模型,常見的并發
    發表于 09-25 15:23

    七種常見的并發編程模型簡介

    1. 線程與鎖 線程與鎖模型有很多眾所周知的不足,但仍是其他模型的技術基礎,也是很多并發軟件開發的首選。 2. 函數式編程 函數式編程日漸重要的原因之一,是其對并發編程和并行編程提供了
    的頭像 發表于 03-15 17:21 ?4471次閱讀

    Go并發模型的實現原理

    Go語言是為并發而生的語言,Go語言是為數不多的在語言層面實現并發的語言;也正是Go語言的并發特性,吸引了全球無數的開發者。
    的頭像 發表于 04-15 08:49 ?1093次閱讀

    在LabVIEW中創建Actor Framework的抽象消息及接口

    由于面向對象需要降低耦合性,那么基于類的操作者也需要考慮如何降低耦合性。當Nest Actor給Root Actor發送消息時,需要調用Root Actor的消息類的Send ***.vi,這就導致了Nest
    的頭像 發表于 09-23 10:51 ?5597次閱讀

    NVIDIA Triton 系列文章(10):模型并發執行

    前面已經做好了每個推理模型的基礎配置,基本上就能正常讓 Triton 服務器使用這些獨立模型進行推理。接下來的重點,就是要讓設備的計算資源盡可能地充分使用,首先第一件事情就是模型并發
    的頭像 發表于 01-05 11:55 ?741次閱讀

    基于Actor Framework仿真線性編碼器

    在學習LabView面向對象編程過程中,相信大家也都接觸到了Actor Framework。該框架于2010年NI Week首次公布,經過多年不斷迭代更新,逐漸成為LabVIEW中最為重要的并發開發框架。
    的頭像 發表于 12-22 10:15 ?348次閱讀
    基于<b class='flag-5'>Actor</b> Framework仿真線性編碼器
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>