嵌入式Linux下的實(shí)時(shí)性增強(qiáng)方案
由于Linux內(nèi)核底層的臨界資源是不可搶占的,使用mutex替換spinlock的過(guò)程中,這部分可以保留,仍由不可搶占的 spinlock保護(hù),如:保護(hù)硬件寄存器的鎖、調(diào)度器的運(yùn)行隊(duì)列鎖等。不可搶占的spinlock被重新命名為raw_spinlock_t。 spin_lock被宏定義為:
#define spin_lock(lock) PICK_OP(raw_spinlock_t,spin,_lock,lock)
函數(shù)PICK_OP支持兩種鎖共存機(jī)制,PICK_OP在編譯階段將鎖操作轉(zhuǎn)化為mutex或者spinlock:
#define PICK_OP(type, optype, op, lock)
do {
if (TYPE_EQUAL((lock), type))
_raw_##optype##op((type *)(lock));
else if (TYPE_EQUAL(lock, spinlock_t))
//調(diào)用gcc的內(nèi)嵌函數(shù)__builtin_types_compatible_p()
_spin##op((spinlock_t *)(lock));
else __bad_spinlock_type();
} while (0)
#define TYPE_EQUAL(lock, type)
__builtin_types_compatible_p(typeof(lock), type *)
gcc的內(nèi)嵌函數(shù)__builtin_types_compatible_p用于判斷一個(gè)變量的類型是否為某指定的類型,如果類型為 spinlock_t,將運(yùn)行函數(shù)_spin_lock;類型為raw_spinlock_t,將運(yùn)行函數(shù)_raw_spin_lock。
實(shí)時(shí)rt_mutex在具體應(yīng)用中,一個(gè)高優(yōu)先級(jí)任務(wù)搶占該鎖的同時(shí),把先前的鎖擁有者添加到互斥鎖等待隊(duì)列中,并在當(dāng)前擁有該鎖的任務(wù) task_struct中標(biāo)記等待該鎖的所有任務(wù);反之,不能得到該鎖就把當(dāng)前任務(wù)添加到鎖的優(yōu)先級(jí)等待隊(duì)列中,直到喚醒執(zhí)行。為了防止優(yōu)先級(jí)逆轉(zhuǎn),可以改變鎖的當(dāng)前擁有者的優(yōu)先級(jí)為鎖的等待隊(duì)列中任務(wù)的最高優(yōu)先級(jí)。
rt_mutex可以使高優(yōu)先級(jí)任務(wù)利用搶占鎖進(jìn)入臨界區(qū),這樣內(nèi)核不可搶占區(qū)的數(shù)量和范圍大大縮小,內(nèi)核可搶占性有了很大的提高,且降低了實(shí)時(shí)高優(yōu)先級(jí)任務(wù)的搶占延遲,改善了系統(tǒng)的實(shí)時(shí)性能。
2.3 可搶占大內(nèi)核鎖設(shè)計(jì)
大內(nèi)核鎖BKL(Big Kernel Lock)實(shí)質(zhì)上也是spinlock,它用于保護(hù)整個(gè)內(nèi)核,該鎖保持時(shí)間較長(zhǎng),對(duì)系統(tǒng)的實(shí)時(shí)性能影響很大[6]。采用Ingo Molnar的實(shí)時(shí)化方法,BKL使用semaphore實(shí)現(xiàn),結(jié)構(gòu)定義如下代碼:
struct semaphore {
atomic_t count;
struct rt_mutex lock; //實(shí)時(shí)互斥鎖的使用
};
由結(jié)構(gòu)體發(fā)現(xiàn),在BKL實(shí)現(xiàn)中利用了實(shí)時(shí)互斥鎖rt_mutex,在改進(jìn)后的spinlock結(jié)構(gòu)體spinlock_t中也利用了實(shí)時(shí)互斥鎖 rt_mutex,因此可搶占大內(nèi)核鎖和新的spinlock共用了低層的處理代碼。使用semaphore之后,大內(nèi)核鎖就可搶占了。
3 內(nèi)核實(shí)時(shí)性測(cè)試
針對(duì)Linux2.6內(nèi)核,本文并沒(méi)有作出對(duì)內(nèi)核調(diào)度算法的修正,只是探討了中斷運(yùn)行機(jī)制、自旋鎖及大內(nèi)核鎖技術(shù)在系統(tǒng)實(shí)時(shí)性能上的局限性,所以實(shí)驗(yàn)測(cè)試主要測(cè)試中斷延遲時(shí)間和任務(wù)響應(yīng)時(shí)間。實(shí)驗(yàn)環(huán)境: Intel 2 GHz CPU,256 DDR內(nèi)存,Kernel 2.6.22版本。測(cè)試結(jié)果如表1所示。
由表可知,在中斷服務(wù)程序中寫入標(biāo)記,測(cè)試中斷觸發(fā)至中斷服務(wù)程序執(zhí)行平均響應(yīng)時(shí)間,標(biāo)準(zhǔn)Linux2.6內(nèi)核平均中斷響應(yīng)時(shí)間為182 μs,改進(jìn)后Linux2.6內(nèi)核為14 μs。采用開(kāi)源軟件LMbench3.0 測(cè)試系統(tǒng)任務(wù)調(diào)度延遲時(shí)間,標(biāo)準(zhǔn)Linux2.6內(nèi)核平均任務(wù)響應(yīng)時(shí)間為1 260 μs,改進(jìn)后Linux2.6內(nèi)核為162μs。由此可見(jiàn),改進(jìn)策略在一定程度上大大減小了中斷延遲和任務(wù)調(diào)度時(shí)間,有利于改善移動(dòng)機(jī)器人任務(wù)處理的實(shí)時(shí)性能。
本文基于Linux2.6內(nèi)核的關(guān)中斷、中斷優(yōu)先級(jí)、內(nèi)核的不可搶占性以及大內(nèi)核鎖保持時(shí)間過(guò)長(zhǎng)等問(wèn)題進(jìn)行了實(shí)時(shí)性分析,提出了相應(yīng)的改進(jìn)方法。利用中斷線程化、互斥鎖的應(yīng)用及大內(nèi)核鎖的改進(jìn)等技術(shù)提高了系統(tǒng)的實(shí)時(shí)性能,降低了內(nèi)核中斷延遲和調(diào)度延遲。改進(jìn)后的內(nèi)核在移動(dòng)機(jī)器人控制器平臺(tái)中有很好的應(yīng)用價(jià)值,提高了機(jī)器人控制的實(shí)時(shí)性能。本文引用地址:http://m.butianyuan.cn/article/151096.htm linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)
評(píng)論