演講嘉賓 | 李勇彪
回顧整理 | 廖 濤
排版校對 | 李萍萍
嘉賓簡介
李勇彪,OpenHarmony項目群技術指導委員會編程語言TSG成員,華為OpenHarmony虛擬機編譯器專家。2021年至今,華為終端OS語言編譯運行時團隊架構師,負責OpenHarmony高級語言編譯運行時的整體技術架構。曾就職于阿里巴巴,參與并主導AliOS高級語言虛擬機的編譯優化、內存管理優化、多線程優化等項目。目前聚焦在移動OS的編程語言及語言虛擬機領域。
內容來源
第一屆開放原子開源基金會OpenHarmony技術峰會——編程語言及應用框架分論壇
正 文 內 容
隨著摩爾定律放緩現象的日益突出以及計算機多核系統架構的出現,并發編程持續引起了廣泛的關注。目前,移動應用領域的并發探索有哪些,在OpenHarmony上又有哪些成果和未來規劃呢?華為終端編譯器與運行時架構師李勇彪在第一屆OpenHarmony技術峰會上給大家帶來了幾點分享。
01?
并發的背景
摩爾定律由Intel的聯合創始人兼前CEO戈登·摩爾提出,即半導體芯片上集成的晶體管和電阻數量將每兩年增加一倍,微處理器的性能提高一倍,或價格下降一半。在過去的幾十年間,摩爾定律為算力乃至生產力的發展作出了巨大的貢獻,但至2022年,隨著Denard微縮效應遇到了元件物理的瓶頸,業界逐漸對這一觀點產生了強烈的分歧,一部分人士認為摩爾定律正在逐步放緩甚至有失效的傾向,另一部分人士認為摩爾定律仍然有效,僅是成本增加了。在該背景下,單芯片功耗約束了單核的性能,基于多核化的并發編程成為移動領域提升性能的重要技術手段。
摩爾定律放緩現象
那么,什么是并發呢?并發指同一時間應對多項任務的能力,一個時間段中有幾個任務都處于運行準備就緒狀態,在單核設備中,任一個時刻只有一個任務能夠運行,其運行順序是不固定的;而在多核場景中,同一時間可以多項任務并行。
并發與并行
02?
常見的并發模型
2.1??
線程和鎖
線程和鎖是并發模型的一種常見表示,下圖示意了一種典型的CPU多核架構,可以看出,L3 Cache在多核間共享,因此L3 Cache的一致性是保證程序在多核間正常運行的基礎。在確保單線程執行結果不變的前提下,可以做任意編譯器優化,如常量傳播、公共子表達式消除、內聯、標量替換、死代碼刪除、指令亂序等。由于不同的操作系統對內存一致性有不同的約束,需要通使用鎖等同步語義保證多線程內存一致性。目前,通過基于共享內存的樂觀鎖、自旋鎖、偏向鎖、精準內存屏障等手段可以實現性能優秀的多線程程序,但也存在一定的問題:線程和鎖方案的優化依賴軟件工程有良好的并發實踐規范和資深并發程序開發者,且容易引發死鎖,測試及維護的成本也很高。
一種 CPU 多核架構
2.2??
Actor 模型
Actor模型概念的提出已經幾十年了:一個actor是一個基本的計算單元,通過消息通信;內部維持可變狀態,兩邊互相不能直接修改。其優勢在于每個Actor易于維護以及測試,業務開發只需要關心業務的消息處理,測試只需要覆蓋消息流順序即可。此外,其容錯性也好,適合分布式編程。當然,Actor模型也存在一定的短板:存在信箱堆滿問題,不共享狀態,只通過消息通信交互,不適合細粒度并行。
Actor 模型
2.3??
函數式編程
函數式編程有以下特點:函數是一等公民;無副作用(無共享可變狀態);純函數構建一切。在函數式編程下,只要輸入一定,其輸出也一定符合預期。真實世界的函數式則更依賴參數化,會將函數副作用(Side Effect)上拋,盡量脫離開發者編寫的業務邏輯層,在框架內部進行處理,且有結構依賴。該模式具有確定性、健壯性(易維護易測試)以及天然支持并行化等優勢,但開發效率較低,實際的業務邏輯很難直接轉成函數式開發,且在部分場景下性能表現較差。
函數式編程
2.4??
并發模型特點
常見的并發模型主要分為兩類,一類僅基于共享內存,另一類則基于消息通信。基于共享內存的并發模型(線程與鎖),具有適用范圍廣、接近硬件工作方式的本質和正確使用時效率很高的優勢,但不可避免地存在測試及維護困難等問題,目前該模式已經逐漸被應用開發領域摒棄;基于消息通信的并發模型(Actor、函數式編程),具有容錯性好、特定場景性能表現很好且易于維護和測試的優勢,但也存在應用場景有限、不適合細粒度并行等短板。
03?
移動應用框架并發
3.1??
Dart 語言
Dart是一門新的編程語言,如同JAVA、PHP一樣,是為了解決編寫應用程序中的一些實際問題而被Google發明的,其早期主要是為了能夠在Web領域替換JavaScript(后文簡稱JS),后來Google內部用Dart編寫孵化了一個移動開發框架Sky,之后又被命名為Flutter,在移動跨平臺開發領域大放異彩。Dart的并發目標主要為了賦能框架支持任務并行化,解決開發者的并發任務和多線程開發需求。其僅共享不可變對象,而可變對象不共享,且提供了單線程并發(異步)和多線程并發(Isolate Spawn /Compute)的并發API。
Dart 并發架構
3.2??
Swift
Swift是蘋果公司于2014年WWDC蘋果開發者大會發布的新開發語言,可與Objective-C共同運行于macOS和iOS平臺,用于搭建基于蘋果平臺的應用程序。在2022年的Swift 5.5版本中,發布了并發API的說明,其并發目標主要為了減少應用開發者從想法到實現必須花費的時間,使體驗遠遠優于現有方案(隊列不可知、可維護性差且安全性低)。Swift的并發理念是,共享可變狀態不利于開發者,也不利于硬件,且無法突破單進程。因此,Swift希望能夠提供無損化的易用的API,在設計、可維護性、安全性、可伸縮性以及性能等方面持續改進。目前,Swift已提供的API有async/await、Task & TaskGroup、Actor等。
3.3??
流行移動操作系統并發模型趨勢
在移動應用開發領域中,迭代和更新頻繁,開發效率是一個關鍵因素,而鎖對于應用開發者過于底層,很難用好,難以調試,屬于高級用法。出于提供易用、簡單、高效的并發模型考慮,業界目前給應用開發者提供的多線程模型,有避免數據競爭、實現無鎖化的趨勢。例如,在Web上,JS在多線程使用的是消息通信機制(內存隔離,增加可轉移Builtin對象支持);在Flutter上,Dart在多線程使用的是消息通信機制 (內存隔離);在Android上,Kotlin原生先后提出過Worker API、不可變共享、對象轉移凍結等方案替換共享多線程方案(用戶不使用鎖);在IOS上,Swift 5.5實現了結構化編程和Actor,Swift整體并發的演進思路是默認安全的編程模型。
04?
OpenHarmony高級語言的并發探索
在JS世界的并發中,如前文所提到的JS并發架構—Actor模型,具有無鎖、容易維護和測試、容錯性好以及分布式編程等優勢,但啟動較慢,并發的實例開銷大。對于JS并發API—Worker來說,由于其每一個并發實例之間不共享,開發者需要封裝和解析消息命令,關心Worker實例的生命周期,在高負載和低負載時也需要精確調節Worker數量。
基于上述問題,OpenHarmony上實現了輕量化并發實例——Lite Actor。該功能支持不可變對象共享,對基礎架構進行了輕量化處理,大幅提升了啟動時間,且優化了啟動內存。
ArkCompiler并發實例運行
OpenHarmony也提供了TaskPool。TaskPool是一個更易用的并發任務API,能夠使開發者易于開發并發任務,減少代碼編寫量,讓其無需關心并發實例的生命周期和場景下并發任務的負載輕重。此外,TaskPool還能夠統一任務負載的資源管理,降低了系統的資源消耗,提升了系統的整體性能。在如圖所示的TaskPool架構中,通過Task Dispatch Manager實現優先級調度、負載均衡以及系統的統一管理等功能,通過Task Worker Threads實現自適應性和可伸縮性。
TaskPool統一任務池設計架構
在高級語言并發的發展中,業界更傾向于給開發者提供更易用、更好用以及更高效的并發API。OpenHarmony提供的并發API目前介于Dart和Swift之間,汲取兩者的長處,并對其現存問題進行持續的優化和改進。此外,OpenHarmony正在考慮引入準靜態對象,實現真正共享。
05?
總結
在OpenHarmony并發模型上,后續將對并發實例進一步輕量化,探索共享對象的無鎖并發。此外,在OpenHarmony并發調度上,也將針對現存的系統中線程泛濫問題,從時間和空間兩個維度設計相關方案進行優化和改進,并將開發一套統一的并行框架,在運行時根據任務依賴狀態和可執行資源自動并發調度和執行任務。
歡迎大家持續關注OpenHarmony并發研究工作,也期待與社區的開發者們共建OpenHarmony的并發能力。
E N D
審核編輯黃宇
-
語言開發
+關注
關注
0文章
6瀏覽量
1108 -
函數式編程
+關注
關注
0文章
11瀏覽量
2061 -
OpenHarmony
+關注
關注
25文章
3663瀏覽量
16159
發布評論請先 登錄
相關推薦
評論