專利名稱:嵌入式實時操作系統(tǒng)的進(jìn)程調(diào)度方法
技術(shù)領(lǐng)域:
本發(fā)明涉及計算機(jī)操作系統(tǒng)的進(jìn)程調(diào)度方法,尤其涉及嵌入式系統(tǒng)和實時系統(tǒng)的進(jìn)程調(diào)度方法。
背景技術(shù):
進(jìn)程調(diào)度(或稱任務(wù)調(diào)度)是嵌入式實時操作系統(tǒng)(Real-Time OperatingSystem,簡稱RTOS)中最關(guān)鍵、最核心的部分,進(jìn)程調(diào)度的效率高低,直接關(guān)系到RTOS的效率和性能。對于RTOS的進(jìn)程調(diào)度技術(shù),通常采用下述指標(biāo)進(jìn)行衡量a)系統(tǒng)支持的優(yōu)先級的個數(shù)Np優(yōu)先級的個數(shù)越多,進(jìn)行上層應(yīng)用程序設(shè)計的余地越大,對于現(xiàn)代RTOS系統(tǒng),Np數(shù)應(yīng)當(dāng)大于等于64;b)系統(tǒng)支持的進(jìn)程(任務(wù))個數(shù)Nt進(jìn)程個數(shù)Nt越大,上層應(yīng)用程序所受的限制就越小,設(shè)計也更方便,通信系統(tǒng)中采用的RTOS系統(tǒng),要求進(jìn)程個數(shù)Nt應(yīng)當(dāng)不小于256,理想的進(jìn)程個數(shù)Nt應(yīng)該無窮大,即進(jìn)程個數(shù)不受限于進(jìn)程調(diào)度,而僅受限于系統(tǒng)資源;c)進(jìn)程的切換時間Ts∶Ts越小越好,且應(yīng)當(dāng)為常數(shù)。
現(xiàn)有的μC/OS-II操作系統(tǒng)是開放源碼的、基于優(yōu)先級可搶占式多進(jìn)程系統(tǒng),每一個優(yōu)先級只容納一個進(jìn)程,其進(jìn)程狀態(tài)較為簡單,包括運(yùn)行、就緒、休眠和掛起四個狀態(tài)。μC/OS-II操作系統(tǒng)的上述三個指標(biāo)分別為Np=64,Nt=64,Ts為微秒級且是常數(shù),其主要缺點(diǎn)是優(yōu)先級與進(jìn)程的緊密結(jié)合,導(dǎo)致Np和Nt的大小嚴(yán)重受限,使得該系統(tǒng)無法在大型通信系統(tǒng)中使用。
此外,美國風(fēng)河公司(Wind River System)的商用嵌入式實時操作系統(tǒng)VxWorks也是基于優(yōu)先級可搶占式多進(jìn)程系統(tǒng),支持256個優(yōu)先級,每個優(yōu)先級可容納的進(jìn)程數(shù)不受限制,但其獲得最高優(yōu)先級就緒進(jìn)程的算法耗時較多,對于延遲進(jìn)程隊列的處理所需時間很長。
發(fā)明內(nèi)容
本發(fā)明所要解決的技術(shù)問題是提出一種嵌入式實時系統(tǒng)的進(jìn)程調(diào)度方法,滿足進(jìn)程調(diào)度的指標(biāo),達(dá)到商用實時系統(tǒng)的性能要求,解決現(xiàn)有技術(shù)中存在的處理時間長的問題。
本發(fā)明所述嵌入式實時操作系統(tǒng)的進(jìn)程調(diào)度方法,包括建立進(jìn)程所需資源的步驟和調(diào)度進(jìn)程的步驟;所述建立進(jìn)程所需資源的步驟,包括一、確定進(jìn)程的狀態(tài);二、建立就緒隊列,所述就緒隊列包括由16位無符號變量和大小為16的數(shù)組構(gòu)成的頭部以及一個大小為256的數(shù)組;三、建立并初始化映射表為unsigned char const MapTbl[] ={0×0001,0×0002,0×0004,0×0008,0×0010,0×0020,0×0040,0×0080,0×0100,0×0200,0×0400,0×0800,0×1000,0×2000,0×4000,0×8000};四、建立并初始化逆映射表為unsigned char const UnMapTbl[]={0,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0};五、建立掛起隊列,所述掛起隊列是初始化為空的鏈表;六、為每一種互斥共享的資源標(biāo)識建立一個阻塞隊列,所述阻塞隊列是初始化為空的先進(jìn)先出鏈表;
七、建立延遲隊列,所述延遲隊列是根據(jù)節(jié)點(diǎn)被延遲時間進(jìn)行排序的有序鏈表,被延遲時間短的節(jié)點(diǎn)在前;八、建立包含標(biāo)識進(jìn)程狀態(tài)的進(jìn)程控制塊結(jié)構(gòu);所述調(diào)度進(jìn)程的步驟包括一、創(chuàng)建進(jìn)程,指定進(jìn)程的優(yōu)先級;二、進(jìn)程進(jìn)入掛起隊列;三、如果進(jìn)程被激活,則進(jìn)入就緒隊列;四、根據(jù)就緒隊列的頭部查找逆映射表,獲得當(dāng)前就緒的最高優(yōu)先級的進(jìn)程;五、根據(jù)最高優(yōu)先級進(jìn)程的進(jìn)程控制塊內(nèi)容確定進(jìn)程進(jìn)入的隊列;六、如果進(jìn)程進(jìn)入就緒隊列,則依據(jù)進(jìn)程的優(yōu)先級掛入就緒隊列的相應(yīng)位置,并根據(jù)優(yōu)先級查找映射表,修改就緒隊列的頭部;七、如果進(jìn)程被阻塞,則從進(jìn)程原來所在隊列中取出對應(yīng)進(jìn)程控制塊,根據(jù)其優(yōu)先級修改就緒隊列的頭部,并將其進(jìn)程控制塊以優(yōu)先級為關(guān)鍵字放入阻塞隊列;八、如果進(jìn)程被延遲,則從進(jìn)程原來所在隊列中取出對應(yīng)進(jìn)程控制塊,根據(jù)其優(yōu)先級修改就緒隊列的頭部,并將其進(jìn)程控制塊以延遲時間為關(guān)鍵字插入延遲隊列;九、如果進(jìn)程被掛起,則進(jìn)程進(jìn)入掛起隊列。
本發(fā)明所述進(jìn)程調(diào)度方法采用了“映射表+逆映射表+鏈表”的技術(shù)措施,在進(jìn)程切換時間、支持的最大進(jìn)程數(shù)、支持的優(yōu)先級數(shù)等方面都取得了很大的進(jìn)步,達(dá)到了商用實時系統(tǒng)的性能要求;本發(fā)明采用簡潔高效的延遲進(jìn)程隊列處理方法,極大地減輕了系統(tǒng)的負(fù)荷;本發(fā)明具有高效、高可靠性、適用范圍廣的特點(diǎn),支持256個優(yōu)先級,無窮多進(jìn)程,具有更短的微秒級常數(shù)的進(jìn)程切換時間,更加高效的延遲隊列處理,解決了現(xiàn)有技術(shù)中對優(yōu)先級數(shù)Np和進(jìn)程數(shù)Nt的限制,使其能夠廣泛適用于通信、航空、工業(yè)控制、新型智能設(shè)備等領(lǐng)域。
圖1是進(jìn)程的狀態(tài)遷移示意圖;圖2是就緒隊列的結(jié)構(gòu)示意圖;圖3是進(jìn)程優(yōu)先級和就緒隊列頭部中的BitTbl數(shù)組的對應(yīng)關(guān)系;圖4是就緒隊列的頭部中BitTblSign變量和BitTbl數(shù)組的對應(yīng)關(guān)系;圖5是進(jìn)程進(jìn)出延遲隊列的示意圖。
具體實施例方式
下面結(jié)合附圖,對本發(fā)明做進(jìn)一步的詳細(xì)描述。
在進(jìn)行進(jìn)程調(diào)度之前,需要先建立進(jìn)程調(diào)度的有關(guān)資源。
首先確定進(jìn)程的狀態(tài)模型。進(jìn)程狀態(tài)分為4種基本態(tài)就緒、阻塞、延遲、阻塞且延遲,還有一種附加態(tài)——掛起。進(jìn)程無論處于哪一種基本態(tài),均可被掛起,從而形成就緒且掛起、阻塞且掛起、延遲且掛起、阻塞且延遲且掛起4種組合態(tài)。因此,進(jìn)程的實際狀態(tài)共有8種,即4種基本態(tài)加上4種組合態(tài)。
圖1介紹了進(jìn)程狀態(tài)以及相互間的遷移關(guān)系,其中進(jìn)程狀態(tài)用含有英文字母的圓圈表示,S表示掛起狀態(tài);R表示就緒狀態(tài);B表示阻塞狀態(tài);D表示延遲狀態(tài);B&D表示阻塞且延遲狀態(tài);D&S表示延遲且掛起狀態(tài);B&S表示阻塞且掛起狀態(tài);B&D&S表示阻塞且延遲且掛起狀態(tài)。當(dāng)進(jìn)程創(chuàng)建后,處于掛起狀態(tài)(S態(tài)),可以被其它進(jìn)程激活(Activate)而進(jìn)入就緒態(tài)(R態(tài)),隨后可以延遲(Delay)自身進(jìn)入延遲態(tài)(D態(tài)),此期間可能被其它進(jìn)程反延遲(Undelay)回到就緒態(tài)(R態(tài)),也可能被其它進(jìn)程掛起,從而進(jìn)入延遲且掛起狀態(tài)(D&S態(tài)),延遲且掛起狀態(tài)(D&S態(tài))和延遲狀態(tài)(D態(tài))的進(jìn)程在延遲到時后分別進(jìn)入掛起狀態(tài)(S態(tài))和就緒狀態(tài)(R態(tài))。
處于就緒狀態(tài)(R態(tài))的進(jìn)程如果以“堅持式獲取”(Spoony Take)方式申請互斥共享的資源,且資源目前不可用,則進(jìn)程進(jìn)入阻塞態(tài)(B態(tài)),B態(tài)的進(jìn)程可能被其它進(jìn)程掛起,從而進(jìn)入阻塞且掛起狀態(tài)(B&S態(tài)),B&S態(tài)和B態(tài)的進(jìn)程在資源變?yōu)榭捎弥蠓謩e進(jìn)入S態(tài)和R態(tài)。
處于就緒狀態(tài)(R態(tài))的進(jìn)程如果以“暫待式獲取”(Ticks Take)方式申請互斥共享的資源,且資源目前不可用,則進(jìn)程進(jìn)入阻塞且延遲狀態(tài)(B&D態(tài)),如果B&D態(tài)的進(jìn)程在等待期間資源變?yōu)榭捎?對應(yīng)至少一個Give操作),則返回R態(tài),否則在等待超時(TimeOut)后返回D態(tài),且返回錯誤;B&D態(tài)的進(jìn)程可能被其它進(jìn)程掛起,從而進(jìn)入阻塞且延遲且掛起狀態(tài)(B&D&S態(tài))。如果B&D&S態(tài)的進(jìn)程在等待期間資源變?yōu)榭捎?Give),則返回掛起狀態(tài)(S態(tài));如果在此期間被激活,則返回B&D態(tài),如果等待超時則返回B態(tài),且返回錯誤。
在系統(tǒng)中僅有一個就緒隊列、一個延遲隊列和一個掛起隊列,每一種互斥共享的資源標(biāo)識(比如一個信號量)有一個阻塞隊列。就緒隊列中僅存入處于就緒狀態(tài)(R態(tài))的進(jìn)程;處于延遲狀態(tài)(D態(tài))、延遲且掛起狀態(tài)(D&S態(tài))、阻塞且延遲且掛起狀態(tài)(B&D&S態(tài))的進(jìn)程存在延遲隊列中;處于組合態(tài)的進(jìn)程均存在掛起隊列中;處于阻塞狀態(tài)(B態(tài))、阻塞且掛起狀態(tài)(B&S態(tài))、阻塞且延遲且掛起狀態(tài)(B&D&S態(tài))的進(jìn)程存在對應(yīng)資源標(biāo)識的阻塞隊列中。進(jìn)程是用進(jìn)程控制塊唯一標(biāo)識的,由于采用指針掛接的方式,一個進(jìn)程可以同時存在于多個隊列中。
其次,建立就緒隊列,圖2是就緒隊列(Ready Q)的結(jié)構(gòu)示意圖。該隊列由一個頭部和一個大小為256的Prio數(shù)組組成,其中隊列頭部包含一個16位的無符號變量BitTblSign和一個大小為16的BitTbl數(shù)組,其數(shù)組元素為16位無符號變量;Prio數(shù)組的元素是指向鏈表節(jié)點(diǎn)的頭指針和尾指針,頭指針指向其下屬鏈表的第一個節(jié)點(diǎn),尾指針指向其下屬鏈表的最后一個節(jié)點(diǎn),鏈表的節(jié)點(diǎn)即是進(jìn)程。
下面定義掛起隊列、阻塞隊列和延遲隊列。掛起隊列用鏈表來實現(xiàn),其初始值為空。對于每一種互斥共享的資源標(biāo)識,都需建立一個阻塞隊列,阻塞隊列也采用鏈表實現(xiàn),其初始值為空,進(jìn)程采用先進(jìn)先出的方式進(jìn)出隊列。延遲隊列是一個有序鏈表,其排序依據(jù)是根據(jù)節(jié)點(diǎn)被延遲的時間,被延遲時間短的進(jìn)程排在前面。
由于進(jìn)程是由進(jìn)程控制塊唯一標(biāo)識的,對進(jìn)程的操作只能通過對進(jìn)程控制塊的操作來實現(xiàn),因此在對進(jìn)程進(jìn)行調(diào)度前需要對進(jìn)程控制塊的結(jié)構(gòu)進(jìn)行說明,進(jìn)程控制塊結(jié)構(gòu)中應(yīng)當(dāng)包含標(biāo)識進(jìn)程狀態(tài)的數(shù)據(jù)。
然后,建立并初始化映射表和逆映射表。映射表大小是16個,定義映射表為unsigned char const MapTbl[] ={0×0001,0×0002,0×0004,0×0008,0×0010,0×0020,0×0040,0×0080,
0×0100,0×0200,0×0400,0×0800,0×1000,0×2000,0×4000,0×8000};逆映射表的大小是256,定義為unsigned char const UnMapTbl[]={0,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0};以上介紹了在進(jìn)程調(diào)度前所需的資源準(zhǔn)備情況,建立了相應(yīng)的隊列、映射表和逆映射表,下面將詳細(xì)介紹進(jìn)程調(diào)度的方法。
進(jìn)程創(chuàng)建后,處于掛起狀態(tài),進(jìn)程的優(yōu)先級也隨之確定,進(jìn)程進(jìn)入掛起隊列中。如果進(jìn)程被激活,則進(jìn)入就緒狀態(tài),進(jìn)程依據(jù)其優(yōu)先級掛入就緒隊列的相應(yīng)位置,利用優(yōu)先級查找映射表,根據(jù)結(jié)果修改就緒隊列頭部的BitTbl數(shù)組和BitTblSign變量。如果進(jìn)程轉(zhuǎn)向其他狀態(tài),則需要把一個進(jìn)程變?yōu)榉蔷途w狀態(tài),首先從就緒隊列中刪除此進(jìn)程的進(jìn)程控制塊,其次判定是否有與此進(jìn)程同優(yōu)先級的進(jìn)程處于就緒狀態(tài),若有,則不需要改變BitTblSign變量和BitTbl數(shù)組的值;否則清除BitTblSign數(shù)組和BitTbl變量的對應(yīng)位的值。這里需要注意對進(jìn)程的操作順序,必須先刪除對應(yīng)的進(jìn)程控制塊,再判定是否有與此進(jìn)程同優(yōu)先級的進(jìn)程處于就緒狀態(tài),否則可能因待刪除進(jìn)程控制塊的存在而導(dǎo)致判定錯誤。
圖3介紹了進(jìn)程優(yōu)先級和就緒隊列頭部中BitTbl數(shù)組的對應(yīng)關(guān)系。一個進(jìn)程的優(yōu)先級對應(yīng)BitTbl數(shù)組中的一位。進(jìn)程優(yōu)先級是一個8位的無符號變量,其高4位(Y)確定其對應(yīng)點(diǎn)位于BitTbl數(shù)組的哪一個元素,低4位(X)則確定其對應(yīng)點(diǎn)位于此元素的哪一位。如果把BitTbl數(shù)組視為一個16×16的矩陣,那么進(jìn)程優(yōu)先級的高4位和低4位分別確定其對應(yīng)點(diǎn)的縱坐標(biāo)和橫坐標(biāo)。例如某進(jìn)程的優(yōu)先級為108,對應(yīng)十六進(jìn)制值為0×6C,則其Y坐標(biāo)(從上往下)為6,其X坐標(biāo)(從右往左)為0×C,即13,對應(yīng)圖2中標(biāo)記為“108”的方格。若此進(jìn)程已經(jīng)就緒,則對應(yīng)的“108”方格應(yīng)為1,即BitTbl數(shù)組的對應(yīng)位置為1。
圖4是就緒隊列頭部中BitTblSign變量和BitTbl數(shù)組的對應(yīng)關(guān)系示意圖。BitTbl數(shù)組的第K個元素對應(yīng)BitTblSign變量的第K位,如果變量BitTbl[K]不為零,則BitTblSign數(shù)組的第K位為1,否則BitTblSign數(shù)組的第K位為0。
結(jié)合圖3與圖4可以看出,256個優(yōu)先級分別對應(yīng)BitTbl數(shù)組的256個比特,這256個比特又分為16組,并使用BitTblSign變量實現(xiàn)對每一組的監(jiān)控,從而解決了快速高效獲得當(dāng)前就緒最高優(yōu)先級的問題。
獲得當(dāng)前就緒進(jìn)程的最高優(yōu)先級是調(diào)度部分最重要的任務(wù)。當(dāng)需要獲得當(dāng)前就緒的最高優(yōu)先級進(jìn)程時,使用BitTblSign數(shù)組和BitTbl變量查逆映射表,獲得當(dāng)前最高優(yōu)先級值,然后從就緒隊列中取出此優(yōu)先級對應(yīng)鏈表的第一個節(jié)點(diǎn)(即進(jìn)程控制塊)。具體過程是首先把一個16位的數(shù)分為兩個8位的部分查找逆映射表分別獲得Y坐標(biāo)和X坐標(biāo),然后通過圖3所示的X、Y坐標(biāo)與優(yōu)先級的關(guān)系計算得出所求的優(yōu)先級。
當(dāng)獲得了當(dāng)前就緒進(jìn)程的最高優(yōu)先級后,以此值為下標(biāo)在就緒隊列的Prio數(shù)組中找到對應(yīng)元素,其head指針指向的節(jié)點(diǎn)即為當(dāng)前就緒最高優(yōu)先級進(jìn)程的進(jìn)程控制塊。
按照公平分配資源的原則,同一個優(yōu)先級下的不同進(jìn)程之間采用時間片輪轉(zhuǎn)的方式,當(dāng)預(yù)定的時間片到達(dá)時,原h(huán)ead指針指向節(jié)點(diǎn)的下一節(jié)點(diǎn)提升為head指針指向的節(jié)點(diǎn),該節(jié)點(diǎn)所代表的進(jìn)程變?yōu)楫?dāng)前運(yùn)行進(jìn)程,原h(huán)ead指針指向的節(jié)點(diǎn)移動到鏈表尾部。
進(jìn)行重新調(diào)度的時機(jī)是全部嵌套的中斷處理結(jié)束或退出內(nèi)核模式或預(yù)定的時間片到時。
當(dāng)就緒的進(jìn)程轉(zhuǎn)入阻塞狀態(tài)時,從就緒隊列中取出對應(yīng)進(jìn)程控制塊,依據(jù)其優(yōu)先級修改BitTblSign變量和BitTbl數(shù)組,并將其進(jìn)程控制塊以優(yōu)先級為關(guān)鍵字放入阻塞隊列。
當(dāng)阻塞的進(jìn)程轉(zhuǎn)入就緒狀態(tài)時,從阻塞隊列中取出對應(yīng)進(jìn)程控制塊,依據(jù)其優(yōu)先級掛入就緒隊列的相應(yīng)位置。并利用優(yōu)先級查找映射表,根據(jù)結(jié)果修改BitTbl數(shù)組和BitTblSign變量。
當(dāng)就緒的進(jìn)程被延遲時,從就緒隊列中取出對應(yīng)進(jìn)程控制塊,依據(jù)其優(yōu)先級修改BitTblSign數(shù)組和BitTbl變量,并將其進(jìn)程控制塊以延遲時間為關(guān)鍵字插入延遲隊列中。
圖5介紹了延遲隊列(Delay Q)的插入操作和刪除操作。延遲隊列Delay Q是一個有序的鏈表,越靠近隊列頭的節(jié)點(diǎn)越先到時(Time Out)。
當(dāng)進(jìn)程插入時,從延遲隊列的頭部開始搜索插入位置,具體方法是依據(jù)節(jié)點(diǎn)(進(jìn)程控制塊)的延遲時間,依次減去已跨越的節(jié)點(diǎn)的延遲時間,直到剩余值小于下一個節(jié)點(diǎn)的延遲時間時,掛入節(jié)點(diǎn),再從下一個節(jié)點(diǎn)的延遲時間中減去剩余值。圖5(a)、圖5(b)、圖5(c)說明了此過程。
當(dāng)從延遲隊列中刪除進(jìn)程時,只需將待刪除節(jié)點(diǎn)的延遲時間加到其后繼節(jié)點(diǎn)的延遲時間上,然后刪除節(jié)點(diǎn)即可。圖5(d)、圖5(e)說明了此過程。
由于采用了上述方法,每一個時間單位過后,只需將延遲隊列Delay Q的第一個節(jié)點(diǎn)的延遲時間減1,如果結(jié)果為零,則表明該節(jié)點(diǎn)的延遲時間已到,然后按圖1所示的狀態(tài)轉(zhuǎn)移進(jìn)行處理。該方法不需要在每個時間單位都遍歷一次延遲隊列,極大地減輕了系統(tǒng)的負(fù)荷。
當(dāng)延遲的進(jìn)程超時后,依據(jù)其被延時前的狀態(tài)決定將其放入哪個隊列中。
權(quán)利要求
1.一種嵌入式實時操作系統(tǒng)的進(jìn)程調(diào)度方法,包括建立進(jìn)程所需資源的步驟和調(diào)度進(jìn)程的步驟;所述建立進(jìn)程所需資源的步驟,包括一、確定進(jìn)程的狀態(tài);二、建立就緒隊列,所述就緒隊列包括由16位無符號變量和大小為16的數(shù)組構(gòu)成的頭部以及一個大小為256的數(shù)組;三、建立并初始化映射表為unsigned char const MapTbl[] ={0×0001,0×0002,0×0004,0×0008,0×0010,0×0020,0×0040,0×0080,0×0100,0×0200,0×0400,0×0800,0×1000,0×2000,0×4000,0×8000};四、建立并初始化逆映射表為unsigned char const UnMapTbl[]={0,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0};五、建立掛起隊列,所述掛起隊列是初始化為空的鏈表;六、為每一種互斥共享的資源標(biāo)識建立一個阻塞隊列,所述阻塞隊列是初始化為空的先進(jìn)先出鏈表;七、建立延遲隊列,所述延遲隊列是根據(jù)節(jié)點(diǎn)被延遲時間進(jìn)行排序的有序鏈表,被延遲時間短的節(jié)點(diǎn)在前;八、建立包含標(biāo)識進(jìn)程狀態(tài)的進(jìn)程控制塊結(jié)構(gòu);所述調(diào)度進(jìn)程的步驟包括一、創(chuàng)建進(jìn)程,指定進(jìn)程的優(yōu)先級;二、進(jìn)程進(jìn)入掛起隊列;三、如果進(jìn)程被激活,則進(jìn)入就緒隊列;四、根據(jù)就緒隊列的頭部查找逆映射表,獲得當(dāng)前就緒的最高優(yōu)先級的進(jìn)程;五、根據(jù)最高優(yōu)先級進(jìn)程的進(jìn)程控制塊內(nèi)容確定進(jìn)程進(jìn)入的隊列;六、如果進(jìn)程進(jìn)入就緒隊列,則依據(jù)進(jìn)程的優(yōu)先級掛入就緒隊列的相應(yīng)位置,并根據(jù)優(yōu)先級查找映射表,修改就緒隊列的頭部;七、如果進(jìn)程被阻塞,則從進(jìn)程原來所在隊列中取出對應(yīng)進(jìn)程控制塊,根據(jù)其優(yōu)先級修改就緒隊列的頭部,并將其進(jìn)程控制塊以優(yōu)先級為關(guān)鍵字放入阻塞隊列;八、如果進(jìn)程被延遲,則從進(jìn)程原來所在隊列中取出對應(yīng)進(jìn)程控制塊,根據(jù)其優(yōu)先級修改就緒隊列的頭部,并將其進(jìn)程控制塊以延遲時間為關(guān)鍵字插入延遲隊列;九、如果進(jìn)程被掛起,則進(jìn)程進(jìn)入掛起隊列。
2.根據(jù)權(quán)利要求1所述的嵌入式實時操作系統(tǒng)的進(jìn)程調(diào)度方法,其特征在于,所述建立進(jìn)程所需資源步驟的步驟一確定進(jìn)程的狀態(tài)包括8種,分別是就緒、阻塞、延遲、阻塞且延遲、就緒且掛起、阻塞且掛起、延遲且掛起、阻塞且延遲且掛起狀態(tài)。
3.根據(jù)權(quán)利要求1所述的嵌入式實時操作系統(tǒng)的進(jìn)程調(diào)度方法,其特征在于,所述調(diào)度進(jìn)程步驟的步驟四進(jìn)一步包括首先使用BitTblSign數(shù)組和BitTbl變量查逆映射表,獲得當(dāng)前最高優(yōu)先級值,然后從就緒隊列中取出此優(yōu)先級對應(yīng)鏈表的第一個節(jié)點(diǎn);具體過程是首先把一個16位的數(shù)分為兩個8位的部分查找逆映射表獲得Y坐標(biāo)和X坐標(biāo),然后通過X、Y坐標(biāo)與優(yōu)先級的關(guān)系計算出所求的優(yōu)先級。
4.根據(jù)權(quán)利要求3所述的嵌入式實時操作系統(tǒng)的進(jìn)程調(diào)度方法,其特征在于,所述X、Y坐標(biāo)與優(yōu)先級的關(guān)系是進(jìn)程的優(yōu)先級對應(yīng)BitTbl數(shù)組中的一位;進(jìn)程優(yōu)先級是一個8位的無符號變量,其高4位和低4位分別確定其對應(yīng)點(diǎn)的Y坐標(biāo)和X坐標(biāo)。
5.根據(jù)權(quán)利要求1所述的嵌入式實時操作系統(tǒng)的進(jìn)程調(diào)度方法,其特征在于,所述調(diào)度進(jìn)程步驟的步驟六后還包括如果進(jìn)程轉(zhuǎn)向其他狀態(tài),則將該進(jìn)程變?yōu)榉蔷途w狀態(tài)的步驟,具體是首先從就緒隊列中刪除此進(jìn)程的進(jìn)程控制塊,其次判定是否有與此進(jìn)程同優(yōu)先級的進(jìn)程處于就緒狀態(tài),若有,則不需要改變BitTblSign變量和BitTbl數(shù)組的值;否則清除BitTblSign數(shù)組和BitTbl變量的對應(yīng)位的值。
6.根據(jù)權(quán)利要求1所述的嵌入式實時操作系統(tǒng)的進(jìn)程調(diào)度方法,其特征在于,所述調(diào)度進(jìn)程步驟的步驟八進(jìn)一步包括當(dāng)進(jìn)程插入時,從延遲隊列的頭部開始依據(jù)節(jié)點(diǎn)的延遲時間,依次減去已跨越的節(jié)點(diǎn)的延遲時間,直到剩余值小于下一個節(jié)點(diǎn)的延遲時間時,掛入節(jié)點(diǎn),再從下一個節(jié)點(diǎn)的延遲時間中減去剩余值;當(dāng)從延遲隊列中刪除進(jìn)程時,將待刪除節(jié)點(diǎn)的延遲時間加到其后繼節(jié)點(diǎn)的延遲時間上,然后刪除該節(jié)點(diǎn)。
全文摘要
本發(fā)明提出一種嵌入式實時操作系統(tǒng)的進(jìn)程調(diào)度方法,包括建立進(jìn)程所需資源的步驟和調(diào)度進(jìn)程的步驟;建立進(jìn)程所需資源主要是定義進(jìn)程的模型、隊列以及映射表、逆映射表的內(nèi)容;調(diào)度進(jìn)程則針對進(jìn)程在就緒隊列、阻塞隊列、延遲隊列和掛起隊列的進(jìn)出過程進(jìn)行了描述。本發(fā)明所述進(jìn)程調(diào)度方法采用了“映射表+逆映射表+鏈表”的技術(shù)措施,在進(jìn)程切換時間、支持的最大進(jìn)程數(shù)、支持的優(yōu)先級數(shù)等方面都取得了很大的進(jìn)步,達(dá)到了商用實時系統(tǒng)的性能要求;本發(fā)明采用簡潔高效的延遲進(jìn)程隊列處理方法,極大地減輕了系統(tǒng)的負(fù)荷;本發(fā)明具有高效、高可靠性、適用范圍廣的特點(diǎn),支持256個優(yōu)先級,無窮多進(jìn)程,具有更短的微秒級常數(shù)的進(jìn)程切換時間。
文檔編號G06F13/26GK1519735SQ03115210
公開日2004年8月11日 申請日期2003年1月24日 優(yōu)先權(quán)日2003年1月24日
發(fā)明者危才華, 蘆東昕, 繆敬, 楊新 申請人:深圳市中興通訊股份有限公司