多處理器下的硬實(shí)時(shí)操作系統研究
實(shí)現遷移
當非RT0任務(wù)調用了函數artis_request_for_migration()時(shí),它不能直接把自己插入到其他處理器的運行隊列當中,因為這樣就會(huì )造成多處理器在同一時(shí)間運行同一任務(wù)的情況,所以在A(yíng)RTiS系統中,是通過(guò)與當前處理器上的下一個(gè)任務(wù)來(lái)插入遷移任務(wù)的,總的來(lái)說(shuō)可以分為三步:首先,遷移進(jìn)程會(huì )調用artis_request_for_migration(),設置遷移標志,并將自身的親和CPU設置為本地CPU,然后使自身再次進(jìn)入可搶占狀態(tài),調用調度函數。然后,新調度的任務(wù)將執行函數artis_complete_megration(),該函數將調用函數 finish_task_swith()完成調度,選擇一個(gè)非實(shí)時(shí)處理器把遷移任務(wù)插入到其上的RT-FIFO隊列,并通過(guò)產(chǎn)生一個(gè)進(jìn)程間的中斷信號來(lái)強制目標處理器產(chǎn)生一輪新的調度。最后,目標處理器上的調度程序將通過(guò)調用函數artis_fetch_migration()從RT-FIFOs隊列中取出遷移任務(wù)。
2.2 負載平衡機制
在A(yíng)RTiS系統中,當涉及對稱(chēng)處理器之間的負載平衡時(shí),直接沿用原有的負載平衡機制。而對于不對稱(chēng)處理器上的負載平衡,則通過(guò)修改原linux的負載平衡機制來(lái)實(shí)現。由于非實(shí)時(shí)任務(wù)從實(shí)時(shí)處理器到非實(shí)時(shí)處理器的遷移是強制的。所以不存在負載平衡的問(wèn)題,所以這里只考慮如何將非實(shí)時(shí)處理器上的非實(shí)時(shí)任務(wù)遷移至實(shí)時(shí)處理器??梢詮膬蓚€(gè)方面進(jìn)行分析:一個(gè)是確定遷移的目標處理器,一個(gè)是確定要遷移的任務(wù)。
確定遷移的目標處理器
CPU的負載指的就是該CPU運行隊列的長(cháng)度(在該CPU上等待運行的程序個(gè)數),Pairing policy首先計算各個(gè)CPU運行隊列的長(cháng)度,然后把負載最重的CPU上的任務(wù)分配到負載較輕的CPU上。當各個(gè)CPU處理的都是非實(shí)時(shí)的任務(wù)時(shí),該策略則運作的很好,因為非實(shí)時(shí)的任務(wù)將平分CPU的時(shí)間,但是在有實(shí)時(shí)任務(wù)的情況下,由于實(shí)時(shí)任務(wù)具有絕對的優(yōu)先級,它將獨占CPU,所以不能再簡(jiǎn)單的只用運行隊列的長(cháng)度來(lái)衡量負載的大小。
在A(yíng)RTiS系統中,在原有的策略上,添加了一個(gè)由實(shí)時(shí)任務(wù)的運行時(shí)間構成的負載參數,這時(shí)將通過(guò)公式L× 1/1?RT (L表示某個(gè)CPU上非實(shí)時(shí)任務(wù)的個(gè)數,RT表示實(shí)時(shí)任務(wù)需要占用CPU的時(shí)間)計算各個(gè)處理器上的負載。例如:假設在雙CPU的情況下有6個(gè)任務(wù)(包括實(shí)時(shí)任務(wù)),實(shí)時(shí)任務(wù)需占用CPU時(shí)間的3/4的,對于通常的分派策略,一個(gè)處理器分三個(gè)任務(wù),那么在一個(gè)處理器上,每個(gè)非實(shí)時(shí)任務(wù)將占用1/3的CPU 時(shí)間,而在另一個(gè)處理器上,非實(shí)時(shí)任務(wù)占用的時(shí)間只有1/8,顯然分配很不均等。在A(yíng)RTiS中,它首先會(huì )統計每個(gè)處理器上的非實(shí)時(shí)任務(wù)的個(gè)數,并利用公式L× 1/1?RT計算出每個(gè)處理器的負載,然后選擇負載較輕的處理器作為目標處理器,這時(shí)每個(gè)非實(shí)時(shí)任務(wù)將都會(huì )占有1/4的處理器時(shí)間,達到了負載均衡的目的。參照下圖:
圖一:ARTiS負載平衡算法 |
確定遷移的任務(wù)
當確定了遷移的處理器之后,接下來(lái)要確定的就是要遷移的任務(wù)。選擇的標準就是盡量選擇那些可以在實(shí)時(shí)處理器上可以較長(cháng)保持可搶占狀態(tài)的非RT0任務(wù),如果一個(gè)非RT0任務(wù)遷移的頻率過(guò)高,那么就會(huì )造成非RT0任務(wù)在實(shí)時(shí)處理器與非實(shí)時(shí)處理器之間推來(lái)推去,即所謂的乒乓效應。這樣不僅沒(méi)有達到負載平衡的目標,反而降低了改任務(wù)執行的效率。
為了避免乒乓效應,ARTiS采用統計的方式來(lái)預估一個(gè)任務(wù)可能的遷移頻率(在任務(wù)屬性中添加兩個(gè)變量,分別用來(lái)保存遷移請求的時(shí)間間隔平均值和上一次遷移發(fā)生的時(shí)間),并通過(guò)該預估的頻率與當前遷移任務(wù)發(fā)生的時(shí)機相比較,由此來(lái)決定當前的任務(wù)是否可以遷移。對于一個(gè)請求遷移的任務(wù),由于它的請求點(diǎn)有可能發(fā)生在預估請求之前,也有可能發(fā)生在預估請求之后,所以分兩種情況:當請求點(diǎn)發(fā)生在預估點(diǎn)之前時(shí)(如圖2中的第五個(gè)遷移點(diǎn)所示),如果它離預估的遷移點(diǎn)很近,那么說(shuō)明它馬上又要遷移了,所以應當被阻止,而如果離預估點(diǎn)較遠的話(huà)(如圖2中的第4個(gè)遷移點(diǎn))。同樣對于請求點(diǎn)發(fā)生在預估點(diǎn)之后的遷移請求,如果離預估點(diǎn)很近的話(huà)(如圖2中的第一個(gè)遷移點(diǎn)),那么認為它剛剛發(fā)生過(guò)遷移,所以不允許短時(shí)間內再次遷移,所以也會(huì )被阻止,而與之較遠的(3)、(4)遷移點(diǎn)則可進(jìn)行遷移。由此可見(jiàn),在設計的同時(shí)設定的偏差范圍將直接影響ARTiS的性能,所以應當通過(guò)多次的試驗來(lái)選取一個(gè)合適的偏差。
linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)
評論