Erlang記憶體管理和執行模式筆記
阿新 • • 發佈:2019-01-29
Erlang程序非常輕量級
程序間通過訊息傳遞進行通訊
程序接收訊息時無法判斷訊息是共享的還是物理上覆制過來的,這取決於Erlang執行時系統
每個程序都有一個郵箱,或者說是訊息佇列,佇列中包含所有發給該程序的訊息的指標
訊息本身是一個term,儲存在堆上
程序呼叫receive語句時會掃描郵箱直到找到第一個匹配的訊息
傳送訊息時接收者由程序id來指定,而不管程序位於何處
Erlang/OTP的三種執行時系統
Erlang/OTP的執行時系統基於process-centric架構,其中每個程序分配和管理自己的私有記憶體區域,這樣做的優勢是gc的latency很低
另外Erlang/OTP還帶有兩種執行時系統:communal和hybrid
communal中所有程序共享堆,hybrid則是每個程序對於自己的資料有自己的堆,而程序間的訊息則存放在共享的堆上
Process-centric的優點是gc的latency低,缺點是程序間通訊要複製訊息
Communal的優點是程序間通訊快,而gc 的latency大
Hybrid則恰好中合了這兩者的優點
Hybrid是最佳實踐,效能比其他兩者都好,並且支援大量執行緒伸縮性實現
Symmetric multiprocessing
erlang的beam模擬器
1,beam process-centric,預設的
2,beam.smp communal,共享記憶體
3,beam.hybrid hybrid,混合型
Actors vs. Erlang中說到:
引用
Actually Erlang has 3 memory models: private heap, shared and hybrid (which is somewhat in between). As far as I remember this feature is still experimental so I did not found any info about this in Erlang docs. I think hybrid architecture was switched on with "-hybrid" flag passed to erl. Shared heap was found to be not so good but hybrid architecture performs better on most of Erlang applictions.
很長一段時間裡Erlang/OTP都是預設使用process-centric執行時系統,使用private heap,完全無共享記憶體
自從OTP R12B開始,如果OS發現有多個核,SMP會自動開啟,利用多核優勢,見關於SMP Erlang的一些事實
這樣的話,以後Erlang就會預設搞成使用SMP架構,共享記憶體,給記憶體加鎖來實現隔離,充分利用多核優勢
這樣看來Erlang標榜的“無共享記憶體,純淨的訊息傳遞”架構已經被取締了,但是從上層程序間通訊呼叫模式來看還是訊息傳遞模式,只不過底層實現改了而已
然而我們使用啟動引數還是可以使用process-centric或hybrid模式的,具體記憶體優化看應用場景而定了