erlang的超輕量級程序是如何實現的

2021-05-24 14:27:13 字數 1124 閱讀 1060

在windows下做了實驗,用erlang shell起60萬個erlang程序,占用記憶體760多m,平均每個程序占用記憶體1.27k,建立每個程序的時間約4微秒。在配置好得多的linux伺服器上,用pthread起執行緒,平均每個執行緒建立時間48微秒。

查了一下資料(http://www.erlang.org/pipermail/erlang-questions/2006-october/023258.html,http://lambda-the-ultimate.org/node/1742#comment-21214,http://www.erlang.org/ml-archive/erlang-questions/200104/msg00072.html),了解了一下erlang程序的實現方式。總結一下erlang實現輕量級程序大概有以下幾點:

1,erlang在使用者態下實現的程序排程器。erlang虛擬機器在程序處於等待期間,或程序執行1000個reductions時進行切換。乙個reduction約等於一次函式呼叫。

2,面向語言的記憶體管理和程序切換機制提高了erlang的程序效率。也就是說,程序切換時,虛擬機器知道乙個程序哪些資訊是需要儲存的,哪些是沒必要儲存的(這個跟函式式語言應該很有關係,指標式語言中很難做到這一點)。而作業系統的執行緒切換時,棧、暫存器等所有上下文都需要儲存下來。

3,pthread給每個執行緒預先分配固定大小的棧空間,不管實際上能用多少;而erlang程序最小只有大概32到64個位元組的棧空間,當需要時可以增長。

4,只利用訊息傳遞進行通訊。對於在receive->處等待而導致切換的程序,沒有狀態需要儲存。

5,這個是我猜想的。跟函式式語言的惰性求值也有關係。

比如v->some_caculate(),

s1 -> somewhatlongoperation1(),

s2 -> somewhatlongoperation2(),

s3 -> concatenate(s1, s2).

如果程序在完成計算s2之後,計算s3之前發生切換。那麼由於惰性求值,v的值尚未進行計算(由於暫時用不到),因此程序切換時就不需要儲存v的資訊。

總結一下,erlang程序的效率主要來自有用的資訊都儲存在棧上;虛擬機器知道哪些資訊是有用的並且只儲存那些有用的資訊。更深入的理解還是要看一下erlang的實現,以及對函式式語言的深入了解。

超輕量級golang的Goroutine池

這是個goroutine的 pool type pool struct 兩種工作方式,一種是鏈式操作,另一種非鏈式操作,這裡只講鏈式操作 第一步初始化乙個池子,可以設定池子的容量,預設不限制 初始化並返回池子的指標 func new limit int pool 有傳入池子容量,賦值 iflen l...

Linux中的輕量級程序

在linux中,輕量級程序可以是程序,也可以是執行緒。我們所說的執行緒,在linux中,其實是輕量級程序之間共享 段,檔案描述符,訊號處理,全域性變數時 如果不共享,就是我們所說的程序。程序是資源管理的最小單位,執行緒是程式執行的最小單位。在作業系統設計上,從程序演化出執行緒,最主要的目的就是減小多...

linux 輕量級程序與普通程序的區別

核心執行緒只執行在核心態,不受使用者態上下文的拖累。處理器競爭 可以在全系統範圍內競爭處理器資源 使用資源 唯一使用的資源是核心棧和上下文切換時保持暫存器的空間 排程 排程的開銷可能和程序自身差不多昂貴 同步效率 資源的同步和資料共享比整個程序的資料同步和共享要低一些。輕量級程序 輕量級程序 lwp...