1. 程式人生 > >Erlang記憶體管理和執行模式筆記

Erlang記憶體管理和執行模式筆記

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模式的,具體記憶體優化看應用場景而定了