九九精品国产/国产午夜爽爽窝窝在线观看/俺去操/韩国理伦片最新2023观看

 

 

 

主要產(chǎn)品系列 
Microcontrollers

任務(wù)調(diào)度與上下文切換

1. 任務(wù)調(diào)度概述:

任務(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)是:

  • A. 由于不需要在中斷返回進(jìn)行任務(wù)切換,所以中斷響應(yīng)快。
  • B. 在任務(wù)級(jí)中可以調(diào)用不可重入函數(shù)而不必?fù)?dān)心造成數(shù)據(jù)破壞。
  • C. 幾乎不需要信號(hào)量來保護(hù)共享數(shù)據(jù),也就是說,在任務(wù)運(yùn)行過程中,數(shù)據(jù)是獨(dú)享的。

但它的最大缺點(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)。

2. 任務(wù)調(diào)度:

在多任務(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)程切換。此種情況主要包括以下幾種:

  • A. 當(dāng)前進(jìn)程用完了它的CPU時(shí)間片,有scheduler_tick()函數(shù)完成 schedule()的延遲調(diào)用。
  • B.當(dāng)一個(gè)被喚醒進(jìn)程的優(yōu)先級(jí)比當(dāng)前進(jìn)程優(yōu)先級(jí)高時(shí),由try_to_wake_up()函數(shù)完成schedule()的延遲調(diào)用。
  • C.當(dāng)發(fā)出系統(tǒng)調(diào)用sched_setscheduler()時(shí)。

在這些情況中,主要由于系統(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ù)切換。

3. 調(diào)度算法:

在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ù)。

4. 上下文切換:

上下文切換是多任務(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ì)上有下面兩步:

  • A. 如果有虛擬內(nèi)存,則切換頁全局目錄以安裝一個(gè)新的地址空間。
  • B. 切換內(nèi)核堆棧和硬件上下文,因?yàn)橛布舷挛奶峁┝藘?nèi)核執(zhí)行新進(jìn)程所需要的所有信息,包括CPU信息。

在搶占式內(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()切換具體硬件上下文。

總結(jié):

這里主要介紹了多任務(wù)系統(tǒng)中的任務(wù)調(diào)度及其算法,比較了Linux系統(tǒng)和UCOS系統(tǒng)中的上下文切換,具體實(shí)現(xiàn)可以參考Linux內(nèi)核源代碼和UCOS源代碼。

參考:

  • 1. Linux kernel Primer
  • 2. Understanding the Linux kernel
  • 3. 嵌入式實(shí)時(shí)操作系統(tǒng)uC/OS-II
  • 4. 嵌入式計(jì)算機(jī)系統(tǒng)設(shè)計(jì)原理

相關(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