Erlang併發機制 程序排程

2021-06-22 09:44:39 字數 2055 閱讀 5246

erlang

erlang排程器主要完成對erlang程序的排程,它是erlang實現軟體實時和程序之間公平使用cpu的關鍵。erlang執行時,有4種任務需要被排程:程序,port,linked-in driver,erlang虛擬機器的系統級活動。

erlang排程器主要有以下特點:

1. 程序排程執行在使用者空間 :erlang程序不同於作業系統程序,erlang的程序排程也跟作業系統完全沒有關係,是由erlang虛擬機器來完成的;

2. 排程是搶占式的:每乙個程序在建立時,都會分配乙個固定數目的reduction(r15b中,這個數量預設值是2000),每一次操作(函式呼叫),reduction就會減少,當這個數量減少到0時或者程序沒有匹配的訊息時,搶占就會發生(無視優先順序);

3. 每個程序公平的使用cpu:每個程序分配相同數量的reduction,可以保證程序可以公平的(不是相等的)使用cpu資源

reduction

受作業系統中基於時間片排程演算法的影響,一開始知道有reduction這個概念時,一直想搞清楚這個reduction到底對應多長的絕對時間,不過,從erlang本身對reduction的使用來看,完全沒有必要糾結這個問題。《erlang程式設計指南》一書中對reduction的說明如下:

程式中的每乙個命令,無論它是乙個函式呼叫,還是乙個算術操作,或者內建

函式,都會分配一定數量的reduction。虛擬機器使用這個值來衡量乙個程序的活

動水平。

smp支援

從r11b(2006)erlang開始支援smp(symmetrical multi processor,也就是多核)。erlang對smp的支援分為以下幾個階段:

1). 單排程器、單執行佇列:排程器執行在虛擬機器主程序中的乙個執行緒中,從單個任務佇列中獲取執行程序,因為只有乙個執行緒,所以對執行佇列的訪問不需要鎖;

2). 多排程器、單執行佇列:排程器的個數可以自定義(參見erl命令的+s引數,預設數量同cpu核的數量),每個排程器執行在乙個執行緒中,但是只有乙個執行佇列,所有排程器都從同乙個執行佇列獲取執行程序,所以會涉及到共享資源的訪問,需要用到鎖。

3). 多排程器、多執行佇列:每個排程器都繫結有乙個執行佇列,每個排程器都從各自的執行佇列中獲取執行程序。相比單執行佇列,多執行佇列會減少鎖衝突,提高效能,但是,因為涉及到多執行佇列,就必需要考慮負載問題:如果乙個排程器很忙,另乙個很閒,那怎麼辦?erlang虛擬機器存在乙個任務遷移的邏輯,來保證各個排程器達到平衡。

程序優先順序

erlang程序有四種優先順序:max, high, normal, low(max只在erlang執行時系統內部使用,普通程序不能使用)。erlang執行時有兩個執行佇列對應著max和high優先順序的執行任務,normal和low在同乙個佇列中。

排程器在排程發生時,總是首先檢視具體max優先順序的程序佇列,如果佇列中有可以進行的程序,就會執行,直到這個隊列為空。然後會對high優先順序的程序佇列做同樣的操作(在smp環境,因為同時有幾個排程器,所以在同一時間,可能會有不同優先順序的任務在同時執行;但在同乙個排程器中,同一時間,肯定是高優先順序的任務優先執行)。

普通程序在建立時,一般是normal優先順序。normal和low優先順序的程序只有在系統中沒有max和high優先順序的程序可執行時才會被排程到。通常情況下,normal和low優先順序的程序交替執行,low優先順序獲得cpu資源相對更少(一般情況下):low優先順序的任務只有在執行了normal優先順序任務特定次數後(在r15b中,這個數字是8)才會被排程到(也就是說只有在排程了8個normal優先順序的程序後,low優先順序的程序才會被排程到,即使low優先順序的程序比normal優先順序的程序更早進入排程佇列,這種機制可能會引起優先順序反**假如你有成千上萬的活動normal程序,而只有幾個low優先順序程序,那麼相比normal程序,low優先順序可能會獲得更多的cpu資源)。

排程演算法的實現見[$otp_src/erts/emulator/beam/erl_process.c --> schedule],下面的是演算法流程圖,**於這篇**:characterizing the scalability of erlang vm on many-core processors。

linux程序排程機制

linux是以執行緒為單位進行cpu排程的。所以下面的描述中所說的執行緒和程序從cpu排程角度來說是等效。linux程序優先順序 priority。程序的優先順序是作業系統自己給定並且動態調整的。使用者可以通過nice值來調整實際優先順序。centos6.2 kernel 2.6.32 程序的預設優...

Erlang程式設計入門之併發程式設計 程序

使用erlang而不是其他函式式語言的乙個很主要的原因就是 erlang具有處理併發和分布式計算的程式設計能力。我們這裡說的併發是指程式可以在同乙個時點處理多個執行緒的執行。例如,現代作業系統可以允許你使用word的同時使用excel,並且還開著乙個電子郵件客戶端程式,乙個列印的任務在後台也在執行著...

erlang 併發程式設計 併發01

erlang純訊息傳遞式語言 特點 建立新程序 通過pid給次執行緒發訊息,mod模組,func方法,args傳入引數 pid spawn mod,func,args 新起乙個併發程序執行fun,fun的屬性是當前值 pid spawn fun 傳送訊息 pid message接受訊息 receiv...