導航:首頁 > 源碼編譯 > 有限期任務的安排演算法的改進

有限期任務的安排演算法的改進

發布時間:2024-03-31 18:14:19

Ⅰ 怎麼優化hadoop任務調度演算法

首先介紹了Hadoop平台下作業的分布式運行機制,然後對Hadoop平台自帶的4種任務調度器做分析和比較,最後在分析JobTracker類文件的基礎上指出了創建自定義任務調度器所需完成的工作。
首先Hadoop集群式基於單伺服器的,只有一個伺服器節點負責調度整個集群的作業運行,主要的具體工作是切分大數據量的作業,指定哪些Worker節點做Map工作、哪些Worker節點做Rece工作、與Worker節點通信並接受其心跳信號、作為用戶的訪問入口等等。其次,集群中的每個Worker節點相當於一個器官,運行著主節點所指派的具體作業。這些節點會被分為兩種類型,一種是接收分塊之後的作業並做映射工作。另一種是負責把前面所做的映射工作按照約定的規則做一個統計。
Task-Tracker通過運行一個簡單循環來定期地發送心跳信號(heartbeat)給JobTracker.這個心跳信號會把TaskTracker是否還在存活告知JobTracker,TaskTracker通過信號指明自己是否已經准備
好運行新的任務.一旦TaskTracker已經准備好接受任務,JobTracker就會從作業優先順序表中選定一個作業並分配下去.至於到底是執行Map任務還是Rece任務,是由TaskTracker的任務槽所決定的.默認的任務調度器在處理Rece任務之前,會優先填滿空閑的Map任務槽.因此,如果TaskTracker滿足存在至少一個空閑任務槽時,JobTracker會為它分配Map任務,否則為它選擇一個Rece任務.TaskTracker在運行任務的時候,第一步是從共享文件系統中把作業的JAR文件復制過來,從而實現任務文件的本地化.第二步是TaskTracker為任務新建一個本地文件夾並把作業文件解壓在此目錄中.第三步是由Task-Tracker新建一個TaskRunner實例來運行該任務.
Hadoop平台默認的調度方案就是JobQueueTaskScheler,這是一種按照任務到來的時間先後順序而執行的調度策略.這種方式比較簡單,JobTracker作為主控節點,僅僅是依照作業到來的先後順序而選擇將要執行的作業.當然,這有一定的缺陷,由於Hadoop平台是默認將作業運行在整個集群上的,那麼如果一個耗時非常大的作業進入執行期,將會導致其餘大量作業長時間得不到運行.這種長時間運行的優先順序別並不高的作業帶來了嚴重的作業阻塞,使得整個平台的運行效率處在較低的水平.Hadoop平台對這種FIFO(FirstINAndFirstOut)機制所給出的解決辦法是調用SetJobPriority()方法,通過設置作業的權重級別來做平衡調度.
FairScheler是一種「公平」調度器,它的目標是讓每個用戶能夠公平地共享Hadoop集群計算能力.當只有一個作業運行的時候,它會得到整個集群的資源.隨著提交到作業表中作業的增多,Hadoop平台會把集群中空閑出來的時間槽公平分配給每個需要執行的作業.這樣即便其中某些作業需要較長時間運行,平台仍然有能力讓那些短作業在合理時間內完成[3].FairScheler支持資源搶占,當一個資源池在一定時段內沒有得到公平共享時,它會終止該資源池所獲得的過多的資源,同時把這些釋放的資源讓給那些資源不足的資源池.
Hadoop平台中的CapacityScheler是由Yahoo貢獻的,在調度器上,設置了三種粒度的對象:queue,job,task.在該策略下,平台可以有多個作業隊列,每個作業隊列經提交後,都會獲得一定數量的TaskTracker資源.具體調度流程如下.
(1)選擇queue,根據資源庫的使用情況從小到大排序,直到找到一個合適的job.
(2)選擇job,在當前所選定的queue中,按照作業提交的時間先後以及作業的權重優先順序別進行排序,選擇合適的job.當然,在job選擇時還需要考慮所選作業是否超出目前現有的資源上限,以及資源池中的內存是否夠該job的task用等因素.
(3)選擇task,根據本地節點的資源使用情況來選擇合適的task.
雖然Hadoop平台自帶了幾種調度器,但是上述3種調度方案很難滿足公司復雜的應用需求.因此作為平台的個性化使用者,往往需要開發自己的調度器.Hadoop的調度器是在JobTracker中載入和調用的,因此開發一個自定義的調度器就必須搞清楚JobTracker類文件的內部機制.作為Hadoop平台的核心組件,JobTracker監控著整個集群的作業運行情況並對資源進行管理調度.每個Task-Tracker每隔3s通過heartbeat向JobTracker匯報自己管理的機器的一些基本信息,包括內存使用量、內存的剩餘量以及空閑的slot數目等等[5].一
旦JobTracker發現了空閑slot,便會調用調度器中的AssignTask方法為該TaskTracker分配task。

Ⅱ 改進計算方法

在早期油氣資源評價中,通常應用評價模型,對各參數僅取一個固定值進行簡單的運算,所得結果也是一個值。實際上,對於地下評價對象,其大多數參數具有時空變化性,用一個固定值,不管是統計所得均值還是其他值,都很難代表該參數,更無法准確刻畫該參數的時空非均質性。在這種情況下,很顯然應用單值運算得到的結果很難反映地下評價對象的客觀實際。因此,為提高評價質量和結果可信性,必須改進計算方法。

14.4.1 應用網格化方法逼近資源分布

這種方法的基本思路是:

(1)根據大量觀測點數據,編制各單一參數的平面分布圖,通常為平面等值線圖,如生油岩等厚圖等,個別為分區等級圖,如演化程度圖。以這些平面分布圖簡化表示各參數空間變化,主要是把各參數的垂向變化,用平均值簡化為非變化的固定值,如所謂生油岩有機質豐度等值線圖,即是把各點垂向上有機質豐度變化簡化為非變化的固定值。(2)在平面上建立固定的網格,其網格一般是按均勻法設置,但也可用非均勻網格,網格的多少視各變數平面變化快慢、計算機速度和容量而定。原則上是網格越多、越細就越准確地刻畫參數平面變化情況。

(3)以同一網格在各參數分布圖上讀取網格結點(或網格中點)上參數具體數值。

(4)針對每一個網格結點(或網格中點),按照資源評價模型,分別計算生烴量、排烴量等,然後編制生烴量、排烴量等值線圖。

(5)依據各等值線間距所佔面積,計算該間距所佔的生烴量、排烴量等,再累加得全區生烴量、排烴量。乘以相應運聚系數即得全區資源量。

14.4.2 蒙特卡洛法

所謂蒙特卡洛法是一種數值計算方法,其含義是利用隨機抽樣方法在各參數分布曲線取定數值,然後根據評價模型進行運算,結果得到一定值,反復如上過程成千上萬次,結果就有成千上萬個定值,再將這些定值進行統計,得到結果分布曲線。該方法已廣泛應用於油氣資源評價,其優點是:以一個分布曲線來逼近地下評價對象及較可能值、最可能值。這更加符合人們對地下評價對象的認識過程和局限性、不確定性。

該方法的計算步驟如下:

(1)通過資料處理解釋、分析化驗、圖件讀取等方法,產生和採集、整理各參數的數據,原則上是越多越好。同時剔除奇異點。

(2)根據整理的數據,統計建立各參數概率分布曲線。當數據較多,如多於幾十個時,統計分布曲線代表性強、可靠性高。但當數據少到只幾個或十餘個時,可依據該參數的分布概型(一般是經驗已知的分布模型,如正態分布、對數正態分布等),構造實際的分布曲線。但當數據少到只幾個且其分布概型也不確定時,最好用均勻分布或三角分布代替其分布。

(3)利用計算機產生隨機數,其中最簡單最基本的是均勻分布隨機數。要求隨機數產生後必須經過嚴格的檢驗(如均勻性檢驗、獨立性檢驗、組合規律性檢驗、連續性檢驗等),性質符合要求時方可投入使用。隨機數個數越多越好,最好成千上萬。隨機數值區間為0~1。

(4)以隨機數值為概率入口值,用插值法在某一參數分布取該概率所對應的參數值(圖14-1)。再用另一個隨機數值在另一參數分布曲線上求取該參數值(圖14-2)。以此類推。再將所求取的各參數的值(一個參數只一個值)按評價模型相乘除或加減,得到一個結果(圖14-3)。反復此過程,得到成千上萬個結果。

圖14-1 抽樣計算過程示意圖

(5)再將所得結果進行數理統計,得到結果概率分布圖(圖14-3)。一般而言,蒙特卡洛計算所用參數概率分布可以是各種各樣,但其結果分布一般都是正態分布或對數正態分布。

圖14-2 多參數抽樣計算過程示意圖

圖14-3 蒙特卡洛計算過程示意圖

14.4.3 模糊數學計算方法

在一些研究對象中,不同事物的界線是截然不同的,如水可以有冰、水、汽三種形態,其界限一般是明確的;而在某些對象,不同事物之間的界限是不明確的,例如在石油地質中,儲層的「滲透性好」和「滲透性差」是兩個截然不同的概念,但有時對於某個具體的對象,要把它歸到「滲透性好」或「滲透性差」卻不容易。模糊數學用隸屬度來描述這種情況,即用數值來表示某對象屬於某事物的程度,一個對象可以「屬於」兩類甚至兩類以上事物,分別以兩個隸屬度描述它屬於這兩類事物的程度,這樣,較合理地解決了這類問題。

當用模糊數學評價圈閉的含油氣性時,即用一個向量來表示一個圈閉:

油氣資源評價方法與實踐

研究對象含k個圈閉,則用集合Ui來表示這個圈閉群:

油氣資源評價方法與實踐

n個地質因素在評價圈閉的含油氣性中起的作用不同,各因素用一個權ai值表示其在評價中的作用大小:

油氣資源評價方法與實踐

每個地質因素用m個級別來表示其有利程度:

油氣資源評價方法與實踐

Ci是用整數表示的一種屬性,其具體值依m不同而異。

當m=3時,C=[-1 0 1]

當m=5時,C=[-2-1 0 1 2]

當m=7時,C=[-3-2-1 0 1 2 3]

一個圈閉的某個地質因素用它對各屬性的隸屬度來表示(如表14-1)。

表14-1 地質因素各屬性的隸屬度表

對一個圈閉用n個變數來描述,每個變數的表述將轉變為一個向量,而一個圈閉原來用一個向量表示,將變為用綜合評價變換矩陣R表示:

油氣資源評價方法與實踐

用各地質因素的權和各圈閉的綜合評價變換矩陣算出各圈閉的綜合評價,這個計算過程稱為合成:

油氣資源評價方法與實踐

式中h是樣品號,Rh是第h號樣品的綜合評價變換矩陣,Bh是n(變數數)個數構成的向量,其各元素為

油氣資源評價方法與實踐

這里,○表示某種演算法,這些演算法都是由下列4種基本演算法演化出來的(假設a、r為模糊集合中的兩元素)。

1)a∨r=max(1,r)

2)a∧r=min(a,r)

3)a·r=ar

4)a⊕r=min(a,1+r)

按照這樣合成得出一個樣品向量,然後計算綜合評價值(綜合得分)D:

油氣資源評價方法與實踐

結果為一個數。各圈閉按其D值排隊,就是這些圈閉的優劣排隊。每採用一個合成法,就有一個B,相應有一個D值,就有一個排隊,因為B的產生方法不同,各變數值所起作用不盡相同,同樣的原始數據會有不同的排隊結果。

14.4.4 神經網路計算方法

人工神經網路是指由大量與自然神經系統的神經細胞相類似的(人工)神經元互聯而成的網路。

神經網路的結構和特性是由神經元的特性和它們之間的連接方式決定的。人工神經元之間通過互聯形成網路。互聯的方式稱為連接模式。神經元之間的連接強度為連接權。當網路的連接權矩陣確定後,網路的連接模式也就確定了。

在人工神經網路中,信息處理過程或存貯知識的改變是通過修改神經元間的連接模式來完成的。這一修改過程稱做神經網路的訓練或學習。不同的權矩陣調整方式,就是不同的學習方式。

神經網路的學習和神經網路的結構沒有一一對應的關系。不同的神經網路可以採用相同的學習演算法進行訓練;同一神經網路也可以採用不同的學習演算法進行訓練。

一般採用多層前向神經網路,用誤差反傳(BP)演算法。

對於一個由3層組成的神經網路模型,第一層為輸入層,第二層為中間層,第三層為輸出層。第一層的神經元數為n,中間層的神經元數為1,第三層的神經元數為1。

第1層為輸入層,由M個樣品的n個神經元組成,約定第k個樣品(圈閉)的輸入,即第1層神經元為:xk1,xk2,…,xkn,相應的輸出為Tk,其中,k為樣品號,k=1,2,3,…,M,n為神經元數,在此可理解為自變數數。

第2層為隱層,其神經元數1是用戶設定的,由x與權系數矩陣W2相乘算出,第k個樣品的中間層為

油氣資源評價方法與實踐

F(t)採用S型(Signmoid)壓縮函數:

油氣資源評價方法與實踐

為了能控制u的取值,把第一式改為:x0=-1,w0j=ξ,記

油氣資源評價方法與實踐

則第二式成為

t的值除與Wij,xi有關外,還與變數數n有關,為了讓的值在0~1的范圍內,就需要

油氣資源評價方法與實踐

給一個適當的ξ值。

中間層到輸出層的計算與此相仿。只是它用另外一個W(矩陣)。

如果找到合適的W(兩個W陣),則由輸入的各樣品的X算出各樣品的y值應與原樣品的輸出值T相同或很接近。我們的任務就是要求這兩個W陣。

油氣資源評價方法與實踐

開始的W陣是隨機產生的。當然它算出各樣品的y不會等於T。我們用E(W)來衡量它的偏差:

油氣資源評價方法與實踐

當E(W)<ε時,學習完成。當E(W)>ε時,就要修改兩個W陣,讓E(W)逐漸變小,就現在的這個模型(一共有3層,輸出層只有一元)來說,修改W分兩步,第一步修改由u計算y的W,第二步修改由x計算u的W。

油氣資源評價方法與實踐

油氣資源評價方法與實踐

這樣,每次根據算出的y來指導修改兩層的W陣,直至E(W)<ε,學習完成。

學習完成後,得到兩個W陣,把待判樣品的x向量按既定的模式計算可得各樣品的y值,為具體對象的評價。

Ⅲ 寤惰繜浠誨姟鐨勫嚑縐嶉珮鏁堣В鍐蟲柟妗

鎴戜滑鎶婇渶瑕佸歡榪熸墽琛岀殑浠誨姟鍙鍋氬歡榪熶換鍔°備篃灝辨槸璇村綋鍙戠敓鏌愪釜浜嬩歡涔嬪悗鎴栬呬箣鍓嶇殑鏌愪釜鐗瑰畾鐨勬椂闂寸偣鎵ц岀殑涓緋誨垪鍔ㄤ綔銆
寤惰繜浠誨姟鐨勪嬌鐢ㄥ満鏅鏈変互涓嬭繖浜涳細

寤惰繜浠誨姟鐨勭壒鐐規湁浠ヤ笅榪欎簺錛

Redis瀹炵幇寤舵椂浠誨姟錛屾槸閫氳繃鍏舵暟鎹緇撴瀯ZSET鏉ュ疄鐜扮殑銆俍SET浼氬偍瀛樹竴涓猻core鍜屼竴涓獀alue錛屽彲浠ュ皢value鎸夌収score榪涜屾帓搴忋
寤舵椂浠誨姟鐨勫疄鐜板垎涓轟互涓嬪嚑姝ユ潵瀹炵幇錛
(1) 灝嗕換鍔$殑鎵ц屾椂闂翠綔涓簊core錛岃佹墽琛岀殑浠誨姟鏁版嵁浣滀負value錛宩obId+topicName+groupId+delayTime浣滀負key錛岄氳繃zadd鍛戒護灝嗘暟鎹瀛樻斁鍦▃set涓錛
(2) 鐢ㄤ竴涓榪涚▼瀹氭椂鏌ヨzset鐨剆core鍒嗘暟鏈灝忕殑鍏冪礌錛屽彲浠ョ敤ZRANGEBYSCORE key -inf +inf limit 0 1 withscores鍛戒護鏉ュ疄鐜;
(3) 濡傛灉鏈灝忕殑鍒嗘暟灝忎簬絳変簬褰撳墠鏃墮棿鎴籌紝灝卞皢璇ヤ換鍔″彇鍑烘潵鎵ц屽苟浣跨敤zrem鍘熷瓙鍛戒護鍒犻櫎鏁版嵁錛屽惁鍒欎紤鐪犱竴孌墊椂闂村悗鍐嶆煡璇銆
redis鐨刏SET鏄閫氳繃璺寵穬琛ㄦ潵瀹炵幇鐨勶紝澶嶆潅搴︿負O(logN)錛孨鏄瀛樻斁鍦╖SET涓鍏冪礌鐨勪釜鏁般傜敤redis鏉ュ疄鐜板彲浠ヤ緷璧栦簬redis鑷韜鐨勬寔涔呭寲鏉ュ疄鐜版寔涔呭寲錛宺edis鐨勯泦緹ゆ潵鏀鎸侀珮騫跺彂鍜岄珮鍙鐢ㄣ傚洜姝ゅ紑鍙戞垚鏈寰堝皬錛屽彲浠ュ仛鍒板緢瀹炴椂銆
浼樼偣錛
1銆丷edis zset鏀鎸侀珮鎬ц兘鐨 score 鎺掑簭銆
2銆丷edis鍙浠ュ姩鎬佹墿緙╁癸紝褰撴秷鎮寰堝氭椂鍊欙紝鎴戜滑鍙浠ョ敤闆嗙兢鏉ユ彁楂樻秷鎮澶勭悊鐨勯熷害錛屾弧瓚沖歸噺鍜屾ц兘涓婄殑鍙鎵╁睍鎬с
3銆丷edis鍏鋒湁鎸佷箙鍖栨満鍒訛紝褰撳嚭鐜版晠闅滅殑鏃跺欙紝鍙浠ラ氳繃AOF鍜孯DB鏂瑰紡鏉ュ規暟鎹榪涜屾仮澶嶏紝淇濊瘉浜嗘暟鎹鐨勫彲闈犳с
4銆佺畝鍗曞疄鐢錛屽揩閫熻惤鍦般
緙虹偣錛
1銆佷負浜嗛伩鍏嶄簡褰撲竴涓 KEY 鍦ㄥ瓨鍌ㄤ簡杈冨氱殑寤舵椂娑堟伅鍚庯紝鍏ラ槦鎿嶄綔浠ュ強鏌ヨ㈡搷浣滈熷害鍙樻參鐨勯棶棰橈紙涓や釜鎿嶄綔鐨勬椂闂村嶆潅搴﹀潎涓篛(logN)錛夛紝鏀硅繘鐨勫姙娉曟槸錛屽皢寤惰繜鐨勬秷鎮浠誨姟閫氳繃 hash 綆楁硶璺鐢辮嚦涓嶅悓鐨 Redis Key 涓婏紝鍐嶅紑鍚澶氫釜娑堣垂綰跨▼榪涜屾秷璐癸紝鎻愪緵鍚炲悙閲忋
2銆佹病鏈塧ck鏈哄埗錛屾秷鎮瀛樺湪涓㈠け鐨勫彲鑳芥с
3銆佸洜涓烘槸閫氳繃瀹氭椂杞璇㈢殑鏂瑰紡鎷夊彇redis zset涓鐨勬暟鎹錛屾墍浠ュ瓨鍦ㄤ竴瀹氱殑鏃墮棿宸錛屽彲浠ラ氳繃緙╃煭杞璇㈡椂闂存潵杈冨皯鏃墮棿宸錛屼絾鏄棰戠箒鐨勮疆璇浼氶犳垚CPU鐨勬氮璐癸紝鍙浠ラ氳繃wait/notify鐨勬柟寮忚В鍐寵ラ棶棰樸
4銆侀渶瑕佸疄鐜板彂閫佸け璐ヨ嚜鍔ㄩ噸璇曟満鍒躲
鍙傝冮摼鎺ワ細
1銆佹湁璧炲紑婧愬疄鐜幫細 https://tech.youzan.com/queuing_delay/
2銆佺編鍥懼紑婧愬疄鐜幫細 https://zhuanlan.hu.com/p/94082947

RabbitMQ 鏈韜騫朵笉鐩存帴鎻愪緵瀵瑰歡榪熼槦鍒楃殑鏀鎸侊紝鎴戜滑渚濋潬 RabbitMQ 鐨凾TL浠ュ強姝諱俊闃熷垪鍔熻兘錛屾潵瀹炵幇寤惰繜闃熷垪鐨勬晥鏋溿

姝諱俊闃熷垪瀹為檯涓婃槸涓縐 RabbitMQ 鐨勬秷鎮澶勭悊鏈哄埗錛屽綋 RabbmitMQ 鍦ㄧ敓浜у拰娑堣垂娑堟伅鐨勬椂鍊欙紝娑堟伅閬囧埌濡備笅鐨勬儏鍐碉紝灝變細鍙樻垚鈥滄諱俊鈥濓細

娑堟伅鐢熷瓨鏃墮棿 TTL

TTL錛圱ime-To-Live錛夋槸 RabbitMQ 鐨勪竴縐嶉珮綰х壒鎬э紝琛ㄧず浜嗕竴鏉℃秷鎮鐨勬渶澶х敓瀛樻椂闂達紝鍗曚綅涓烘縐掋傚傛灉涓鏉℃秷鎮鍦 TTL 璁劇疆鐨勬椂闂村唴娌℃湁琚娑堣垂錛岄偅涔堝畠灝變細鍙樻垚涓鏉℃諱俊錛岃繘鍏ユ垜浠涓婇潰鎵璇寸殑姝諱俊闃熷垪銆

鏈変袱縐嶄笉鍚岀殑鏂瑰紡鍙浠ヨ劇疆娑堟伅鐨 TTL 灞炴э紝涓縐嶆柟寮忔槸鐩存帴鍦ㄥ壋寤洪槦鍒楃殑鏃跺欒劇疆鏁翠釜闃熷垪鐨 TTL 榪囨湡鏃墮棿錛屾墍鏈夎繘鍏ラ槦鍒楃殑娑堟伅錛岄兘琚璁劇疆鎴愪簡緇熶竴鐨勮繃鏈熸椂闂達紝涓鏃︽秷鎮榪囨湡錛岄┈涓婂氨浼氳涓㈠純錛岃繘鍏ユ諱俊闃熷垪錛涘彟涓縐嶆柟寮忔槸閽堝瑰崟鏉℃秷鎮璁劇疆錛屼笉榪囬渶瑕佹敞鎰忕殑鏄錛屼嬌鐢ㄨ繖縐嶆柟寮忚劇疆鐨 TTL錛屾秷鎮鍙鑳戒笉浼氭寜鏃舵諱骸錛屽洜涓 RabbitMQ 鍙浼氭鏌ョ涓涓娑堟伅鏄鍚﹁繃鏈熴傛瘮濡傝繖縐嶆儏鍐碉紝絎涓涓娑堟伅璁劇疆浜 20s 鐨 TTL錛岀浜屼釜娑堟伅璁劇疆浜 10s 鐨 TTL錛岄偅涔 RabbitMQ 浼氱瓑鍒扮涓涓娑堟伅榪囨湡涔嬪悗錛屾墠浼氳╃浜屼釜娑堟伅榪囨湡銆傚湪RabbitMQ鐨3.5.8鐗堟湰浠ュ悗錛屾垜浠灝卞彲浠ヤ嬌鐢ㄥ畼鏂規帹鑽愮殑 rabbitmq delayed message exchange 鎻掍歡寰堟柟渚垮湴瀹炵幇寤惰繜娑堟伅鐨勫姛鑳姐
浼樼偣錛
1銆佹伅鍙闈犲彂閫併佹秷鎮鍙闈犳姇閫掋佹諱俊闃熷垪鏉ヤ繚闅滄秷鎮鑷沖皯琚娑堣垂涓嬈′互鍙婃湭琚姝g『澶勭悊鐨勬秷鎮涓嶄細琚涓㈠純銆
2銆侀氳繃 RabbitMQ 闆嗙兢鐨勭壒鎬э紝鍙浠ュ緢濂界殑瑙e喅鍗曠偣鏁呴殰闂棰橈紝涓嶄細鍥犱負鍗曚釜鑺傜偣鎸傛帀瀵艱嚧寤惰繜闃熷垪涓嶅彲鐢ㄦ垨鑰呮秷鎮涓㈠け銆
緙虹偣錛
1銆侀渶瑕佽嚜宸辨惌寤哄拰榪愮淮闆嗙兢銆

rocketmq鍦ㄥ彂閫佸歡鏃舵秷鎮鏃訛紝鏄鍏堟妸娑堟伅鎸夌収寤惰繜鏃墮棿孌靛彂閫佸埌鎸囧畾鐨勯槦鍒椾腑錛堟妸寤舵椂鏃墮棿孌電浉鍚岀殑娑堟伅鏀懼埌鍚屼竴涓闃熷垪涓錛屼繚璇佷簡娑堟伅澶勭悊鐨勯『搴忔э紝鍙浠ヨ╁悓涓涓闃熷垪涓娑堟伅寤舵椂鏃墮棿鏄鐩稿悓鐨勶紝鏁翠釜RocketMQ涓寤舵椂娑堟伅鏃舵寜鐓ч掑為『搴忔帓搴忥紝淇濊瘉淇℃伅澶勭悊鐨勫厛鍚庨『搴忔с傦級銆備箣鍚庯紝閫氳繃涓涓瀹氭椂鍣ㄦ潵杞璇㈠勭悊榪欎簺闃熷垪閲岀殑淇℃伅錛屽垽鏂鏄鍚﹀埌鏈熴傚逛簬鍒版湡鐨勬秷鎮浼氬彂閫佸埌鐩稿簲鐨勫勭悊闃熷垪涓錛岃繘琛屽勭悊銆
娉ㄦ剰 錛氱洰鍓峈ocketMQ鍙鏀鎸佺壒瀹氱殑寤舵椂鏃墮棿孌碉紝1s,5s,10s,...2h錛屼笉鑳芥敮鎸佷換鎰忔椂闂存電殑寤舵椂璁劇疆銆
浼樼偣錛
1銆佸垎甯冨紡銆侀珮鍚炲悙閲忋侀珮鎬ц兘銆侀珮鍙闈犮
緙虹偣錛
1銆侀渶瑕佽嚜宸辨惌寤哄拰榪愮淮闆嗙兢銆
2銆佸彧鏀鎸佺壒瀹氱殑寤舵椂鏃墮棿孌點

ActiveMQ鍦5.4鍙婁互涓婄増鏈寮濮嬫敮鎸佹寔涔呭寲鐨勫歡榪熸秷鎮鍔熻兘錛岀敋鑷蟲敮鎸丆ron琛ㄨ揪寮忋傞粯璁ゆ槸璇ュ姛鑳芥槸涓嶅紑鍚鐨勶紝濡傛灉寮鍚闇瑕佷慨鏀歸厤緗鏂囦歡activemq.xml錛屽湪broker鑺傜偣涓婃妸schelerSupport灞炴ц劇疆涓簍rue銆
浼樼偣錛
1銆佹敮鎸乧ron琛ㄨ揪寮忥紝鏇寸伒媧匯
緙虹偣錛
1銆侀渶瑕佽嚜宸辨惌寤哄拰榪愮淮闆嗙兢銆

鏁版嵁閲忓皯鐨勮瘽鍙浠ュ皾璇晀uartz銆乨elayQueue銆乀imeWheel (鏃墮棿杞)絳夋柟妗堬紝浣嗘槸涓轟簡淇濊瘉鏁版嵁涓嶄涪澶憋紝闇瑕佸熷姪絎涓夋柟鎸佷箙鍖栧瓨鍌ㄧ郴緇燂紝渚嬪俽ocksDB絳夈

linux環境下的進程調度演算法有哪些

第一部分: 實時調度演算法介紹

對於什麼是實時系統,POSIX 1003.b作了這樣的定義:指系統能夠在限定的響應時間內提供所需水平的服務。而一個由Donald Gillies提出的更加為大家接受的定義是:一個實時系統是指計算的正確性不僅取決於程序的邏輯正確性,也取決於結果產生的時間,如果系統的時間約束條件得不到滿足,將會發生系統出錯。

實時系統根據其對於實時性要求的不同,可以分為軟實時和硬實時兩種類型。硬實時系統指系統要有確保的最壞情況下的服務時間,即對於事件的響應時間的截止期限是無論如何都必須得到滿足。比如航天中的宇宙飛船的控制等就是現實中這樣的系統。其他的所有有實時特性的系統都可以稱之為軟實時系統。如果明確地來說,軟實時系統就是那些從統計的角度來說,一個任務(在下面的論述中,我們將對任務和進程不作區分)能夠得到有確保的處理時間,到達系統的事件也能夠在截止期限到來之前得到處理,但違反截止期限並不會帶來致命的錯誤,像實時多媒體系統就是一種軟實時系統。

一個計算機系統為了提供對於實時性的支持,它的操作系統必須對於CPU和其他資源進行有效的調度和管理。在多任務實時系統中,資源的調度和管理更加復雜。本文下面將先從分類的角度對各種實時任務調度演算法進行討論,然後研究普通的 Linux操作系統的進程調度以及各種實時Linux系統為了支持實時特性對普通Linux系統所做的改進。最後分析了將Linux操作系統應用於實時領域中時所出現的一些問題,並總結了各種實時Linux是如何解決這些問題的。

1. 實時CPU調度演算法分類

各種實時操作系統的實時調度演算法可以分為如下三種類別[Wang99][Gopalan01]:基於優先順序的調度演算法(Priority-driven scheling-PD)、基於CPU使用比例的共享式的調度演算法(Share-driven scheling-SD)、以及基於時間的進程調度演算法(Time-driven scheling-TD),下面對這三種調度演算法逐一進行介紹。

1.1. 基於優先順序的調度演算法

基於優先順序的調度演算法給每個進程分配一個優先順序,在每次進程調度時,調度器總是調度那個具有最高優先順序的任務來執行。根據不同的優先順序分配方法,基於優先順序的調度演算法可以分為如下兩種類型[Krishna01][Wang99]:

靜態優先順序調度演算法:

這種調度演算法給那些系統中得到運行的所有進程都靜態地分配一個優先順序。靜態優先順序的分配可以根據應用的屬性來進行,比如任務的周期,用戶優先順序,或者其它的預先確定的策略。RM(Rate-Monotonic)調度演算法是一種典型的靜態優先順序調度演算法,它根據任務的執行周期的長短來決定調度優先順序,那些具有小的執行周期的任務具有較高的優先順序。

動態優先順序調度演算法:

這種調度演算法根據任務的資源需求來動態地分配任務的優先順序,其目的就是在資源分配和調度時有更大的靈活性。非實時系統中就有很多這種調度演算法,比如短作業優先的調度演算法。在實時調度演算法中, EDF演算法是使用最多的一種動態優先順序調度演算法,該演算法給就緒隊列中的各個任務根據它們的截止期限(Deadline)來分配優先順序,具有最近的截止期限的任務具有最高的優先順序。

1.2. 基於比例共享調度演算法

雖然基於優先順序的調度演算法簡單而有效,但這種調度演算法提供的是一種硬實時的調度,在很多情況下並不適合使用這種調度演算法:比如象實時多媒體會議系統這樣的軟實時應用。對於這種軟實時應用,使用一種比例共享式的資源調度演算法(SD演算法)更為適合。

比例共享調度演算法指基於CPU使用比例的共享式的調度演算法,其基本思想就是按照一定的權重(比例)對一組需要調度的任務進行調度,讓它們的執行時間與它們的權重完全成正比。

我們可以通過兩種方法來實現比例共享調度演算法[Nieh01]:第一種方法是調節各個就緒進程出現在調度隊列隊首的頻率,並調度隊首的進程執行;第二種做法就是逐次調度就緒隊列中的各個進程投入運行,但根據分配的權重調節分配個每個進程的運行時間片。

比例共享調度演算法可以分為以下幾個類別:輪轉法、公平共享、公平隊列、彩票調度法(Lottery)等。

比例共享調度演算法的一個問題就是它沒有定義任何優先順序的概念;所有的任務都根據它們申請的比例共享CPU資源,當系統處於過載狀態時,所有的任務的執行都會按比例地變慢。所以為了保證系統中實時進程能夠獲得一定的CPU處理時間,一般採用一種動態調節進程權重的方法。

1.3. 基於時間的進程調度演算法

對於那些具有穩定、已知輸入的簡單系統,可以使用時間驅動(Time-driven:TD)的調度演算法,它能夠為數據處理提供很好的預測性。這種調度演算法本質上是一種設計時就確定下來的離線的靜態調度方法。在系統的設計階段,在明確系統中所有的處理情況下,對於各個任務的開始、切換、以及結束時間等就事先做出明確的安排和設計。這種調度演算法適合於那些很小的嵌入式系統、自控系統、感測器等應用環境。

這種調度演算法的優點是任務的執行有很好的可預測性,但最大的缺點是缺乏靈活性,並且會出現有任務需要被執行而CPU卻保持空閑的情況。

2. 通用Linux系統中的CPU調度

通用Linux系統支持實時和非實時兩種進程,實時進程相對於普通進程具有絕對的優先順序。對應地,實時進程採用SCHED_FIFO或者SCHED_RR調度策略,普通的進程採用SCHED_OTHER調度策略。

在調度演算法的實現上,Linux中的每個任務有四個與調度相關的參數,它們是rt_priority、policy、priority(nice)、counter。調度程序根據這四個參數進行進程調度。

在SCHED_OTHER 調度策略中,調度器總是選擇那個priority+counter值最大的進程來調度執行。從邏輯上分析,SCHED_OTHER調度策略存在著調度周期(epoch),在每一個調度周期中,一個進程的priority和counter值的大小影響了當前時刻應該調度哪一個進程來執行,其中 priority是一個固定不變的值,在進程創建時就已經確定,它代表了該進程的優先順序,也代表這該進程在每一個調度周期中能夠得到的時間片的多少; counter是一個動態變化的值,它反映了一個進程在當前的調度周期中還剩下的時間片。在每一個調度周期的開始,priority的值被賦給 counter,然後每次該進程被調度執行時,counter值都減少。當counter值為零時,該進程用完自己在本調度周期中的時間片,不再參與本調度周期的進程調度。當所有進程的時間片都用完時,一個調度周期結束,然後周而復始。另外可以看出Linux系統中的調度周期不是靜態的,它是一個動態變化的量,比如處於可運行狀態的進程的多少和它們priority值都可以影響一個epoch的長短。值得注意的一點是,在2.4以上的內核中, priority被nice所取代,但二者作用類似。

可見SCHED_OTHER調度策略本質上是一種比例共享的調度策略,它的這種設計方法能夠保證進程調度時的公平性--一個低優先順序的進程在每一個epoch中也會得到自己應得的那些CPU執行時間,另外它也提供了不同進程的優先順序區分,具有高priority值的進程能夠獲得更多的執行時間。

對於實時進程來說,它們使用的是基於實時優先順序rt_priority的優先順序調度策略,但根據不同的調度策略,同一實時優先順序的進程之間的調度方法有所不同:

SCHED_FIFO:不同的進程根據靜態優先順序進行排隊,然後在同一優先順序的隊列中,誰先准備好運行就先調度誰,並且正在運行的進程不會被終止直到以下情況發生:1.被有更高優先順序的進程所強佔CPU;2.自己因為資源請求而阻塞;3.自己主動放棄CPU(調用sched_yield);

SCHED_RR:這種調度策略跟上面的SCHED_FIFO一模一樣,除了它給每個進程分配一個時間片,時間片到了正在執行的進程就放棄執行;時間片的長度可以通過sched_rr_get_interval調用得到;

由於Linux系統本身是一個面向桌面的系統,所以將它應用於實時應用中時存在如下的一些問題:

Linux系統中的調度單位為10ms,所以它不能夠提供精確的定時;

當一個進程調用系統調用進入內核態運行時,它是不可被搶占的;

Linux內核實現中使用了大量的封中斷操作會造成中斷的丟失;

由於使用虛擬內存技術,當發生頁出錯時,需要從硬碟中讀取交換數據,但硬碟讀寫由於存儲位置的隨機性會導致隨機的讀寫時間,這在某些情況下會影響一些實時任務的截止期限;

雖然Linux進程調度也支持實時優先順序,但缺乏有效的實時任務的調度機制和調度演算法;它的網路子系統的協議處理和其它設備的中斷處理都沒有與它對應的進程的調度關聯起來,並且它們自身也沒有明確的調度機制;

3. 各種實時Linux系統

3.1. RT-Linux和RTAI

RT -Linux是新墨西哥科技大學(New Mexico Institute of Technology)的研究成果[RTLinuxWeb][Barabanov97]。它的基本思想是,為了在Linux系統中提供對於硬實時的支持,它實現了一個微內核的小的實時操作系統(我們也稱之為RT-Linux的實時子系統),而將普通Linux系統作為一個該操作系統中的一個低優先順序的任務來運行。另外普通Linux系統中的任務可以通過FIFO和實時任務進行通信。RT-Linux的框架如圖 1所示:

圖 1 RT-Linux結構

RT -Linux的關鍵技術是通過軟體來模擬硬體的中斷控制器。當Linux系統要封鎖CPU的中斷時時,RT-Linux中的實時子系統會截取到這個請求,把它記錄下來,而實際上並不真正封鎖硬體中斷,這樣就避免了由於封中斷所造成的系統在一段時間沒有響應的情況,從而提高了實時性。當有硬體中斷到來時, RT-Linux截取該中斷,並判斷是否有實時子系統中的中斷常式來處理還是傳遞給普通的Linux內核進行處理。另外,普通Linux系統中的最小定時精度由系統中的實時時鍾的頻率決定,一般Linux系統將該時鍾設置為每秒來100個時鍾中斷,所以Linux系統中一般的定時精度為 10ms,即時鍾周期是10ms,而RT-Linux通過將系統的實時時鍾設置為單次觸發狀態,可以提供十幾個微秒級的調度粒度。

RT-Linux實時子系統中的任務調度可以採用RM、EDF等優先順序驅動的演算法,也可以採用其他調度演算法。

RT -Linux對於那些在重負荷下工作的專有系統來說,確實是一個不錯的選擇,但他僅僅提供了對於CPU資源的調度;並且實時系統和普通Linux系統關系不是十分密切,這樣的話,開發人員不能充分利用Linux系統中已經實現的功能,如協議棧等。所以RT-Linux適合與工業控制等實時任務功能簡單,並且有硬實時要求的環境中,但如果要應用與多媒體處理中還需要做大量的工作。

義大利的RTAI( Real-Time Application Interface )源於RT-Linux,它在設計思想上和RT-Linux完全相同。它當初設計目的是為了解決RT-Linux難於在不同Linux版本之間難於移植的問題,為此,RTAI在 Linux 上定義了一個實時硬體抽象層,實時任務通過這個抽象層提供的介面和Linux系統進行交互,這樣在給Linux內核中增加實時支持時可以盡可能少地修改 Linux的內核源代碼。

3.2. Kurt-Linux

Kurt -Linux由Kansas大學開發,它可以提供微秒級的實時精度[KurtWeb] [Srinivasan]。不同於RT-Linux單獨實現一個實時內核的做法,Kurt -Linux是在通用Linux系統的基礎上實現的,它也是第一個可以使用普通Linux系統調用的基於Linux的實時系統。

Kurt-Linux將系統分為三種狀態:正常態、實時態和混合態,在正常態時它採用普通的Linux的調度策略,在實時態只運行實時任務,在混合態實時和非實時任務都可以執行;實時態可以用於對於實時性要求比較嚴格的情況。

為了提高Linux系統的實時特性,必須提高系統所支持的時鍾精度。但如果僅僅簡單地提高時鍾頻率,會引起調度負載的增加,從而嚴重降低系統的性能。為了解決這個矛盾, Kurt-Linux採用UTIME所使用的提高Linux系統中的時鍾精度的方法[UTIMEWeb]:它將時鍾晶元設置為單次觸發狀態(One shot mode),即每次給時鍾晶元設置一個超時時間,然後到該超時事件發生時在時鍾中斷處理程序中再次根據需要給時鍾晶元設置一個超時時間。它的基本思想是一個精確的定時意味著我們需要時鍾中斷在我們需要的一個比較精確的時間發生,但並非一定需要系統時鍾頻率達到此精度。它利用CPU的時鍾計數器TSC (Time Stamp Counter)來提供精度可達CPU主頻的時間精度。

對於實時任務的調度,Kurt-Linux採用基於時間(TD)的靜態的實時CPU調度演算法。實時任務在設計階段就需要明確地說明它們實時事件要發生的時間。這種調度演算法對於那些循環執行的任務能夠取得較好的調度效果。

Kurt -Linux相對於RT-Linux的一個優點就是可以使用Linux系統自身的系統調用,它本來被設計用於提供對硬實時的支持,但由於它在實現上只是簡單的將Linux調度器用一個簡單的時間驅動的調度器所取代,所以它的實時進程的調度很容易受到其它非實時任務的影響,從而在有的情況下會發生實時任務的截止期限不能滿足的情況,所以也被稱作嚴格實時系統(Firm Real-time)。目前基於Kurt-Linux的應用有:ARTS(ATM Reference Traffic System)、多媒體播放軟體等。另外Kurt-Linux所採用的這種方法需要頻繁地對時鍾晶元進行編程設置。

3.3. RED-Linux

RED -Linux是加州大學Irvine分校開發的實時Linux系統[REDWeb][ Wang99],它將對實時調度的支持和Linux很好地實現在同一個操作系統內核中。它同時支持三種類型的調度演算法,即:Time-Driven、 Priority-Dirven、Share-Driven。

為了提高系統的調度粒度,RED-Linux從RT-Linux那兒借鑒了軟體模擬中斷管理器的機制,並且提高了時鍾中斷頻率。當有硬體中斷到來時,RED-Linux的中斷模擬程序僅僅是簡單地將到來的中斷放到一個隊列中進行排隊,並不執行真正的中斷處理程序。

另外為了解決Linux進程在內核態不能被搶占的問題, RED-Linux在Linux內核的很多函數中插入了搶占點原語,使得進程在內核態時,也可以在一定程度上被搶占。通過這種方法提高了內核的實時特性。

RED-Linux的設計目標就是提供一個可以支持各種調度演算法的通用的調度框架,該系統給每個任務增加了如下幾項屬性,並將它們作為進程調度的依據:

Priority:作業的優先順序;

Start-Time:作業的開始時間;

Finish-Time:作業的結束時間;

Budget:作業在運行期間所要使用的資源的多少;

通過調整這些屬性的取值及調度程序按照什麼樣的優先順序來使用這些屬性值,幾乎可以實現所有的調度演算法。這樣的話,可以將三種不同的調度演算法無縫、統一地結合到了一起。

閱讀全文

與有限期任務的安排演算法的改進相關的資料

熱點內容
外包程序員好進嗎 瀏覽:380
雲伺服器服務模型架構 瀏覽:899
刪文件夾什麼指令 瀏覽:507
極速抖音已加密怎麼辦 瀏覽:601
matlab拉格朗日演算法框圖 瀏覽:428
華為公司計算機視覺演算法顧問 瀏覽:252
夏老師講的單片機 瀏覽:296
在編程中如何將圖片放大 瀏覽:161
appstore怎麼看是否付費 瀏覽:603
程序員和碩士 瀏覽:951
gcc編譯消耗內存過多 瀏覽:281
昌邑網站製作源碼 瀏覽:127
單片機的反向編譯 瀏覽:463
subsample演算法 瀏覽:899
蘋果免費看書app哪個最好 瀏覽:885
c語言加密怎麼弄 瀏覽:842
c語言編譯的錯誤提示 瀏覽:767
驗機蘋果app哪個最好 瀏覽:666
光遇國際服安卓如何購買禮包 瀏覽:55
163app怎麼下載 瀏覽:247