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