RTOS的調(diào)度原理是什么,針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。
10年積累的網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶(hù)對(duì)網(wǎng)站的新想法和需求。提供各種問(wèn)題對(duì)應(yīng)的解決方案。讓選擇我們的客戶(hù)得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站設(shè)計(jì)后付款的網(wǎng)站建設(shè)流程,更有璧山免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
我們這一系列的微信推送,僅僅是為了可以幫助大家快速地對(duì)操作系統(tǒng)有一個(gè)感性層面上的認(rèn)識(shí)。當(dāng)然,讓人更好地記住一樣復(fù)雜的東西,就是尋找另一樣簡(jiǎn)單的東西來(lái)解釋它。但是,這種方式的解釋?zhuān)峭耆环辖逃龖?yīng)該有的嚴(yán)謹(jǐn)邏輯的。因此,讓我們來(lái)收回這種非科學(xué)的論證,轉(zhuǎn)而用科學(xué)的方法論來(lái)表述我們需要闡述的東西。
(一) 自己寫(xiě)一個(gè)調(diào)度算法
在很久很久以前,我大抵記得那是我大二學(xué)生時(shí)期,我就開(kāi)始自己動(dòng)手寫(xiě)過(guò)一個(gè)調(diào)度算法。其實(shí)現(xiàn)的功能非常簡(jiǎn)單,就是使兩個(gè)“任務(wù)”分時(shí)地去交替執(zhí)行,并且,利用定時(shí)器去決定這兩個(gè)任務(wù)運(yùn)行的時(shí)間。當(dāng)時(shí)滿(mǎn)心歡喜地想告訴全世界,自己完成了一個(gè)“內(nèi)核”的框架。
現(xiàn)在想來(lái),上述的這個(gè)行為真的是非常可笑的無(wú)知滿(mǎn)足。因?yàn)檫@個(gè)算法的實(shí)現(xiàn)非常簡(jiǎn)單。簡(jiǎn)單闡述一下其原理,就是建立兩個(gè)指向函數(shù)的指針變量,然后建立兩個(gè)函數(shù),并且用上述兩個(gè)變量指向它們。定時(shí)器開(kāi)始定時(shí),假設(shè)周期為10ms,那么每隔10ms只要去切換著兩個(gè)變量就可以了。這樣子,如果宏觀性上面,你就能看到兩個(gè)任務(wù)是在同時(shí)運(yùn)行了。
再來(lái)分析一下上述的東西,聽(tīng)著特別簡(jiǎn)單,但是經(jīng)不住仔細(xì)推敲,它們肯定是不符合操作系統(tǒng)的任何特征的。首先,如果你的每個(gè)任務(wù)執(zhí)行的時(shí)間小于10ms還好,萬(wàn)一超過(guò)了其分時(shí)分配的運(yùn)行時(shí)間(10ms)而強(qiáng)行使用定時(shí)器去切換,那當(dāng)前沒(méi)運(yùn)行完的數(shù)據(jù)完全就丟失了,沒(méi)有任何拯救的余地。其次,它的任務(wù)沒(méi)法被動(dòng)態(tài)地建立,回收。還有很多很多的缺點(diǎn)。這是我大三恍然大悟的東西。因此,到現(xiàn)在我也不喜歡使用在主函數(shù)里面利用定時(shí)器產(chǎn)生計(jì)數(shù)值,根據(jù)計(jì)數(shù)值去切換運(yùn)行函數(shù)的方式。為什么?因?yàn)槟懵銠C(jī)編程的時(shí)候,特別是在某個(gè)函數(shù)里面有大量的通訊等待操作時(shí),你無(wú)法保證每個(gè)函數(shù)的運(yùn)行時(shí)間正好小于等于你設(shè)定的時(shí)間。因此總會(huì)出現(xiàn),有些任務(wù)根本執(zhí)行不到這一現(xiàn)象。
但是不幸的是,后來(lái)工作之后,發(fā)現(xiàn)很多電子工程師都是這樣去處理他的程序流向的。
(二) 操作系統(tǒng)調(diào)度算法的原理
我開(kāi)始研究操作系統(tǒng),也是那時(shí)候在自信滿(mǎn)滿(mǎn)地用了我自己的“內(nèi)核”做了幾個(gè)項(xiàng)目之后,直到有一次做一個(gè)長(zhǎng)距離Modbus高速通信,由于這個(gè)函數(shù)里面有一個(gè)做CRC檢驗(yàn)失敗等待重傳的函數(shù)。而由于選用了高速的數(shù)據(jù)流,加上距離比較長(zhǎng),因此高頻信號(hào)的畸變比較嚴(yán)重,導(dǎo)致了誤碼率很高。因此這個(gè)函數(shù)頻繁被調(diào)用,但是后來(lái)發(fā)現(xiàn),這個(gè)函數(shù)幾乎不能被完整運(yùn)行下來(lái)。分析了好久的原因,最后發(fā)現(xiàn),原來(lái)這個(gè)函數(shù)執(zhí)行的時(shí)間遠(yuǎn)遠(yuǎn)超過(guò)了我分配給它的運(yùn)行時(shí)間了,因此,沒(méi)等它執(zhí)行完成,我的調(diào)度算法強(qiáng)制將其中斷了。并且由于沒(méi)有數(shù)據(jù)的保存機(jī)制,導(dǎo)致了整個(gè)函數(shù)只能執(zhí)行一半就被銷(xiāo)毀了。后來(lái)工作之后,也遇到過(guò)別的工程師這么做,勸其修改,還是不聽(tīng),最后導(dǎo)致了嚴(yán)重的錯(cuò)誤。從那以后,我寧愿while(1)到底,也不愿使用這樣的方式了。
而一個(gè)成熟的操作系統(tǒng)內(nèi)核,它的調(diào)度算法是會(huì)在中斷當(dāng)前任務(wù)之后,將數(shù)據(jù)保存下來(lái)的。
我們稱(chēng)當(dāng)前運(yùn)行的任務(wù)為“運(yùn)行態(tài)”,而沒(méi)有被運(yùn)行的任務(wù),我們稱(chēng)為“非運(yùn)行狀態(tài)”。但是關(guān)于“非運(yùn)行狀態(tài)”,這只是一個(gè)籠統(tǒng)的名稱(chēng)而已,這里面包含了眾多的子狀態(tài)。我們以后來(lái)詳細(xì)說(shuō)明一下“非運(yùn)行狀態(tài)”的具體細(xì)分。在這里注明一下,我們課程的邏輯當(dāng)中,為了簡(jiǎn)化操作系統(tǒng)模型,因此把所有具體的非運(yùn)行狀態(tài)進(jìn)行集合化,在一些高級(jí)的操作系統(tǒng)當(dāng)中,這個(gè)問(wèn)題有待討論。
以最基本的分時(shí)操作系統(tǒng)來(lái)說(shuō),這里假設(shè)所有任務(wù)的優(yōu)先級(jí)都是統(tǒng)一的,時(shí)間一到就會(huì)自動(dòng)輪詢(xún)。當(dāng)時(shí)間到來(lái)時(shí),運(yùn)行態(tài)任務(wù)沒(méi)有被執(zhí)行完的數(shù)據(jù),操作系統(tǒng)都會(huì)有一個(gè)機(jī)制,將這些數(shù)據(jù)進(jìn)行保存,可以是壓入堆棧。具體操作的過(guò)程,就是將寄存器里面的數(shù)據(jù)進(jìn)行保存,有點(diǎn)類(lèi)似于中斷函數(shù)的調(diào)用。接著把可以回收的內(nèi)存進(jìn)行回收。然后,為下一個(gè)需要執(zhí)行的任務(wù)分配內(nèi)存,最后再去執(zhí)行下一個(gè)需要執(zhí)行的任務(wù)。而當(dāng)時(shí)間又輪到了第一次沒(méi)有執(zhí)行完的任務(wù)之后,又會(huì)重新為其分配內(nèi)存,然后把之前的數(shù)據(jù)取出來(lái),繼續(xù)執(zhí)行。整個(gè)籠統(tǒng)的過(guò)程就是這樣。
關(guān)于RTOS的調(diào)度原理是什么問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。