Erlang并发机制 –进程调度
2019獨角獸企業重金招聘Python工程師標準>>>
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資源
4.?調度器保證軟實時性:Erlang中的進程有優先級,調度器可以保證在下一次調度發生時,高優先級的進程可以優先得到執行。
?
Reduction
受操作系統中基于時間片調度算法的影響,一開始知道有reduction這個概念時,一直想搞清楚這個reduction到底對應多長的絕對時間,不過,從Erlang本身對reduction的使用來看,完全沒有必要糾結這個問題。《Erlang編程指南》一書中對reduction的說明如下:
程序中的每一個命令,無論它是一個函數調用,還是一個算術操作,或者內置
函數,都會分配一定數量的reduction。虛擬機使用這個值來衡量一個進程的活
動水平。
看到這個定義的第一反應是,如果一個函數調用的執行時間很長怎么辦?那不是一個進程會長時間的占用資源?Erlang對這個問題的答案是Trap機制,上一篇中有提到過,它的其中一個功能就是把費時的操作分階段做,比如lists:reverser和lists:member可能會根據輸入的不同會有很大的變化,所以就會使用到Trap機制:先執行一段時間,再Trap,然后再次調度到的時候再繼續執行。
?
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。
轉載于:https://my.oschina.net/jackliang55/blog/215403
總結
以上是生活随笔為你收集整理的Erlang并发机制 –进程调度的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 晚上做梦梦到吃包子好吗
- 下一篇: VSS2005 上传pdf 空白