主要產(chǎn)品系列 |
解決方案 |
PDA開發(fā) |
開發(fā)工具 |
新產(chǎn)品 |
數(shù)據(jù)通訊接口 |
電源管理 |
IMP 半導(dǎo)體 |
Automotive |
RFID |
Logic |
Microcontrollers |
任務(wù)調(diào)度(schedulers)是內(nèi)核的主要職責(zé),實(shí)際上它就是一個(gè)法官,決定當(dāng)前由哪個(gè)任務(wù)占用CPU,多數(shù)實(shí)時(shí)內(nèi)核都是基于優(yōu)先級(jí)調(diào)度算法的,每個(gè)任務(wù)根據(jù)其重要程度的不同被賦予一定的優(yōu)先級(jí)。基于此算法,CPU總是讓處于就緒而且優(yōu)先級(jí)最高的任務(wù)優(yōu)先運(yùn)行,然而何時(shí)高優(yōu)先級(jí)任務(wù)能夠得到CPU使用權(quán),由內(nèi)核的類型而定。基于優(yōu)先級(jí)的內(nèi)核有兩種:
不可搶占型和搶占型。
1) 不可搶占型內(nèi)核:
不可搶占型內(nèi)核要求每個(gè)任務(wù)主動(dòng)放棄CPU的使用權(quán),其間不能被高優(yōu)先級(jí)任務(wù)搶占。它的特點(diǎn)是:
但它的最大缺點(diǎn)是:響應(yīng)時(shí)間不確定,當(dāng)有更高優(yōu)先級(jí)任務(wù)就緒后,不知道什么時(shí)候才能得到執(zhí)行,這在實(shí)時(shí)系統(tǒng)中是致命的缺陷。所以不可搶占型內(nèi)核主要用于前后臺(tái)系統(tǒng)中。
2) 搶占型內(nèi)核:
在嵌入式系統(tǒng)中,進(jìn)程(任務(wù))都是搶占型的,通過給每個(gè)進(jìn)程(任務(wù))設(shè)置一個(gè)優(yōu)先級(jí),當(dāng)系統(tǒng)中有優(yōu)先級(jí)比當(dāng)前運(yùn)行的進(jìn)程(任務(wù))的優(yōu)先級(jí)更高的進(jìn)程(任務(wù))時(shí),當(dāng)前的進(jìn)程(任務(wù))執(zhí)行被中斷,并調(diào)用調(diào)度程序選擇優(yōu)先級(jí)高的進(jìn)程(任務(wù))運(yùn)行。利用搶占式內(nèi)核,可以保證高優(yōu)先級(jí)的進(jìn)程(任務(wù))被優(yōu)先執(zhí)行,從而保證系統(tǒng)的實(shí)時(shí)響應(yīng)。
在多任務(wù)系統(tǒng)中,都會(huì)提供一個(gè)系統(tǒng)函數(shù)來進(jìn)行進(jìn)程(任務(wù))間切換,綜合來說,他們有兩種進(jìn)程(任務(wù))切換方式:
1) 由進(jìn)程(任務(wù))本身直接調(diào)用任務(wù)切換函數(shù)進(jìn)行進(jìn)程(任務(wù))切換:
在當(dāng)前進(jìn)程(任務(wù))因?yàn)椴荒塬@得必須的資源而立即被堵塞時(shí),就由進(jìn)程(任務(wù))本身直接調(diào)用進(jìn)程(任務(wù))切換函數(shù)進(jìn)行進(jìn)程(任務(wù))間調(diào)度。 在Linux中可以直接調(diào)用schedule()函數(shù)來實(shí)現(xiàn)。 在UCos中,通過調(diào)用OSSched()來完成。
2) 延遲調(diào)用任務(wù)切換函數(shù)進(jìn)行進(jìn)程(任務(wù))切換:
此方式是把當(dāng)前進(jìn)程(任務(wù))設(shè)置一調(diào)度標(biāo)志而以延遲方式調(diào)用任務(wù)切換函數(shù)進(jìn)行進(jìn)程(任務(wù))切換。 在Linux系統(tǒng)中,總是在恢復(fù)用戶態(tài)進(jìn)程執(zhí)行之前,檢查這一調(diào)度標(biāo)志,在這里標(biāo)志是:TIF_NEED_RESCHED,如果有這一標(biāo)志,就調(diào)用調(diào)度函數(shù)進(jìn)行進(jìn)程切換。此種情況主要包括以下幾種:
在這些情況中,主要由于系統(tǒng)調(diào)用或中斷而進(jìn)入內(nèi)核態(tài),或者當(dāng)前進(jìn)程本來在內(nèi)核態(tài)時(shí),返回用戶態(tài)時(shí)發(fā)生的。 在UCOS中,所有的任務(wù)有不同的優(yōu)先級(jí),不會(huì)出現(xiàn)同一優(yōu)先級(jí)上有多個(gè)任務(wù)的情況,而且也沒有系統(tǒng)調(diào)用的概念,所以任務(wù)調(diào)度的延遲調(diào)用只能出現(xiàn)在中斷處理完成返回時(shí),在OSIntExt()函數(shù)中,檢查是否有高優(yōu)先級(jí)的任務(wù)就緒,如果有高優(yōu)先級(jí)的任務(wù)就緒,進(jìn)行任務(wù)切換。
在Linux系統(tǒng)中,選用了比較復(fù)雜的調(diào)度算法,按照調(diào)度類型可以分為以下幾種:
SCHED_FIFO:此算法主要應(yīng)用于實(shí)時(shí)進(jìn)程,當(dāng)調(diào)度程序把CPU分配給當(dāng)前進(jìn)程后,如果沒有更高優(yōu)先級(jí)的進(jìn)程可以運(yùn)行時(shí),此進(jìn)程會(huì)一直占用CPU直到此進(jìn)程退出或者自愿放棄CPU,即使此時(shí)有其他相同優(yōu)先級(jí)的進(jìn)程存在。
SCHED_RR:時(shí)間片輪詢的實(shí)時(shí)進(jìn)程,對(duì)于不同優(yōu)先級(jí)的進(jìn)程會(huì)調(diào)度優(yōu)先級(jí)高的進(jìn)程運(yùn)行,對(duì)具有相同優(yōu)先級(jí)的進(jìn)程,會(huì)根據(jù)時(shí)間片來調(diào)度,當(dāng)當(dāng)前進(jìn)程的時(shí)間片用完后,會(huì)調(diào)度相同優(yōu)先級(jí)的其他進(jìn)程運(yùn)行,從而保證相同優(yōu)先級(jí)進(jìn)程的CPU調(diào)度公平性。
SCHED_NORMAL:此算法主要用于普通進(jìn)程,利用分時(shí)進(jìn)行調(diào)度。
在UCOS系統(tǒng)中,所有的任務(wù)都是實(shí)時(shí)任務(wù),所以沒有普通任務(wù)調(diào)度機(jī)制,而且為了簡(jiǎn)化調(diào)度算法,不同的任務(wù)有不同的優(yōu)先級(jí),不可能出現(xiàn)同一優(yōu)先級(jí)有多個(gè)任務(wù)的情況,實(shí)際上它的調(diào)度算法就只有Linux中SCHED_FIFO這一種,即優(yōu)先級(jí)高的任務(wù)搶占優(yōu)先級(jí)低任務(wù)。
上下文切換是多任務(wù)調(diào)度的核心內(nèi)容,也是我們感覺在一個(gè)CPU上并行運(yùn)行多個(gè)程序的基礎(chǔ)。
任務(wù)上下文(Task Context): 任務(wù)上下文是指任務(wù)運(yùn)行的環(huán)境。例如,針對(duì)x86的CPU,任務(wù)上下文可包括程序計(jì)數(shù)器、堆棧指針、通用寄存器的內(nèi)容。 上下文切換(Context Switching):在多任務(wù)系統(tǒng)中,上下文切換是指CPU的控制權(quán)由運(yùn)行任務(wù)轉(zhuǎn)移到另外一個(gè)就緒任務(wù)時(shí)所發(fā)生的事件,當(dāng)前運(yùn)行任務(wù)轉(zhuǎn)為就緒(或者掛起、刪除)狀態(tài),另一個(gè)被選定的就緒任務(wù)成為當(dāng)前任務(wù)。上下文切換包括保存當(dāng)前任務(wù)的運(yùn)行環(huán)境,恢復(fù)將要運(yùn)行任務(wù)的運(yùn)行環(huán)境。上下文的內(nèi)容依賴于具體的CPU。
對(duì)于不同的硬件體系結(jié)構(gòu),上下文切換的內(nèi)容不一樣,本質(zhì)上有下面兩步:
在搶占式內(nèi)核中,利用中斷來實(shí)現(xiàn)上下文切換是一個(gè)非常理想的機(jī)制。中斷發(fā)生時(shí),中斷會(huì)強(qiáng)制CPU把控制權(quán)交給操作系統(tǒng),也就相當(dāng)于一次上下文切換。這樣不僅可以減少程序出錯(cuò)的后果,而且提高切換的效率。UCOS就是利用中斷機(jī)制進(jìn)行上下文切換的典型例子。 在UCOS中,如果調(diào)度程序決定任務(wù)需要切換,就會(huì)調(diào)用上下文切換OS_TASK_SW()進(jìn)行實(shí)際的上下文切換。OS_TASK_SW()是宏調(diào)用,含有微處理器的軟中斷指令,利用此中斷來實(shí)現(xiàn)任務(wù)之間的上下文切換。所以O(shè)S_TASK_SW()是一個(gè)體系結(jié)構(gòu)相關(guān)的宏,對(duì)于不同的硬件體系機(jī)構(gòu),有不同的實(shí)現(xiàn)方式,這也是UCOS在不同硬件體系結(jié)構(gòu)中移植的一個(gè)要點(diǎn)。
由于UCOS不支持虛擬內(nèi)存,所以不需要進(jìn)行頁目錄切換,其他許多實(shí)時(shí)多任務(wù)嵌入式系統(tǒng)的一個(gè)特征,也是區(qū)別Linux系統(tǒng)的一個(gè)重要方面。
在2.6 Linux kernel中,引入了一個(gè)全新的調(diào)度機(jī)制O(1)調(diào)度器,它能在固定的時(shí)間內(nèi)完成進(jìn)程切換。如果調(diào)度程序決定任務(wù)需要切換,就會(huì)調(diào)用上下文切換函數(shù)context_switch()函數(shù)進(jìn)行上下文切換,此函數(shù)會(huì)調(diào)用switch_mm()切換頁全局目錄以安裝一個(gè)新的地址空間,然后調(diào)用switch_to()切換具體硬件上下文。
這里主要介紹了多任務(wù)系統(tǒng)中的任務(wù)調(diào)度及其算法,比較了Linux系統(tǒng)和UCOS系統(tǒng)中的上下文切換,具體實(shí)現(xiàn)可以參考Linux內(nèi)核源代碼和UCOS源代碼。
相關(guān)閱讀:uc/os操作系統(tǒng)簡(jiǎn)介
聲明:本站部分內(nèi)容根據(jù)互聯(lián)網(wǎng)資料整理而成,若侵犯您的權(quán)益,請(qǐng)聯(lián)系我們,我們會(huì)盡快處理。
© 2006
WeBoch.Com.cn 版權(quán)所有:深圳市偉博創(chuàng)科技有限公司 地址:深圳市福田區(qū)振華路蘇發(fā)大廈305棟405 電話:0755-83240703 傳真:0755-83240724 |