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