Lite Actor:方舟Actor併發模型的輕量級優化
Lite Actor:方舟Actor併發模型的輕量級優化
併發模型是用來實現不同應用場景中併發任務的程式設計模型,通過合理地使用多執行緒,可以縮減應用程式的開發和維護成本,同時還能更好地提升應用程式在多核裝置中的執行效能。隨著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仍有很大的探索空間,期待廣大開發者加入我們,共同見證萬物互聯的無限可能。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70009402/viewspace-2906201/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- ActorLite:一個輕量級Actor模型實現(中)模型
- PHP下用Swoole實現Actor併發模型PHP模型
- 【Akka】Actor模型探索模型
- Jetlang是Java高併發Actor模型開源庫包Java模型
- C++併發程式設計框架Theron(1)——Actor模型介紹C++程式設計框架模型
- 關於Actor模型的實現模型
- 為什麼Actor模型是高併發事務的終極解決方案?模型
- 請教 Disruptor 同 Actor 模型的區別模型
- 三分鐘掌控Actor模型和CSP模型模型
- Java併發的四種風味:Thread、Executor、ForkJoin和ActorJavathread
- Akka系列(一):Akka簡介與Actor模型模型
- Java併發程式設計:Synchronized底層優化(偏向鎖、輕量級鎖)Java程式設計synchronized優化
- 在Golang中實現Actor模型的原始碼 - GauravGolang模型原始碼
- 用asio擼了一個簡單的Actor模型模型
- 強化學習(十四) Actor-Critic強化學習
- 使用Actor模型管理Web Worker多執行緒模型Web執行緒
- [譯文]greenlet:輕量級併發程式
- Akka 系列(七):Actor 持久化之 Akka persistence持久化
- 看圖學 - Swift actorSwift
- 適合C# Actor的訊息執行方式(2):C# Actor的尷尬C#
- Zorin OS 15 Lite 釋出:好看的輕量級 LinuxLinux
- comsat是用於Web開發的Java纖程Fiber和Actor模型WebJava模型
- 一個Java的Actor框架:kilimJava框架
- Java反應式事件溯源之第 2 部分:Actor 模型Java事件模型
- 四種Actor框架比較框架
- 一種適合C# Actor的訊息執行方式(中):C# Actor的尷尬C#
- actix/actix:Rust語言的Actor框架Rust框架
- Actor模型淺析 一致性和隔離性模型
- 【Scala篇】--Scala中Trait、模式匹配、樣例類、Actor模型AI模式模型
- Actor模型Akka贏得Github下載第一名模型Github
- 虛擬執行緒相對於Actor模型或平臺執行緒的主要優勢? - Reddit執行緒模型
- Actor-Critic(AC)——基礎篇
- Akka系列(二):Akka中的Actor系統
- Akka 系列(二):Akka 中的 Actor 系統
- 強化學習-學習筆記4 | Actor-Critic強化學習筆記
- Actor model 的理解與 protoactor-go 的分析Go
- 使用分散式Actor實現微服務分散式微服務
- 使用Moblin開發應用程式 -- Clutter之Actor與Stage