保證資源的可用性對許多系統(tǒng)而言都至關(guān)重要。如果某個關(guān)鍵子系統(tǒng)(如 CPU 周期)丟失,用戶就無法獲取該子系統(tǒng)提供的服務(wù)。例如,在拒絕服務(wù) (DoS) 攻擊中,惡意用戶會利用需要優(yōu)先級高的進(jìn)程處理的請求攻擊系統(tǒng)。該進(jìn)程會使 CPU 過載并導(dǎo)致其他進(jìn)程的 CPU 周期匱乏,從而使用戶無法使用系統(tǒng)。
安全漏洞并非是導(dǎo)致進(jìn)程匱乏的唯一原因。在許多情況下,增加系統(tǒng)的軟件功能都會導(dǎo)致系統(tǒng)“瀕臨危險(xiǎn)邊緣”,導(dǎo)致現(xiàn)有應(yīng)用程序的 CPU 時間匱乏。及時運(yùn)行的應(yīng)用程序或服務(wù)不再按預(yù)期或要求的那樣迅速響應(yīng)。從歷史角度,解決這一問題的唯一途徑是更新硬件或?qū)浖M(jìn)行重新編碼(或重新設(shè)計(jì))——這兩種方法都無法讓人滿意。
為解決這些問題,系統(tǒng)設(shè)計(jì)人員需要一種可通過硬件或軟件執(zhí)行 CPU 預(yù)算的分區(qū)計(jì)劃,以阻止進(jìn)程或線程獨(dú)占其他進(jìn)程或線程所需的 CPU 周期。實(shí)時操作系統(tǒng)正是執(zhí)行 CPU 分區(qū)預(yù)算的最佳選擇,因?yàn)閷?shí)時操作系統(tǒng)已經(jīng)提供了對 CPU、內(nèi)存和其他計(jì)算資源的集中訪問。
某些實(shí)時操作系統(tǒng)提供了固定分區(qū)調(diào)度算法。系統(tǒng)設(shè)計(jì)人員能利用這種調(diào)度算法對任務(wù)進(jìn)行分組或分區(qū),然后為每個分區(qū)分配一定比例的 CPU 時間。利用這種方法,任何既定分區(qū)內(nèi)的任務(wù)消耗的 CPU 時間都不會超過該分區(qū)靜態(tài)確定的比例。例如,我們假設(shè)為分區(qū)分配了 30% 的 CPU。如果該分區(qū)內(nèi)的進(jìn)程隨后成為拒絕服務(wù)攻擊的目標(biāo),它會消耗不超過 30% 的 CPU 時間。這種分配限制確保了其他進(jìn)程保持各自的可用性;例如,它能保證可訪問的用戶界面(如遠(yuǎn)程終端)。因此,操作人員能訪問系統(tǒng)并解決問題——無需按動復(fù)位開關(guān)。 5
但是,這種方法也存在問題。由于調(diào)度算法是固定的,因此一個分區(qū)無法使用分配到另一個分區(qū)的 CPU 周期,即使這些分區(qū)未使用其分配的周期。這種方法會浪費(fèi) CPU 周期并阻止系統(tǒng)處理高峰需求。因此,系統(tǒng)設(shè)計(jì)人員必須使用更昂貴的處理器應(yīng)對運(yùn)行緩慢的系統(tǒng),或限制系統(tǒng)能支持的功能數(shù)量。
自適應(yīng)分區(qū)
另一種被稱作自適應(yīng)分區(qū)的方法提供了更靈活的動態(tài)調(diào)度算法,從而有效克服了這些缺陷。與靜態(tài)分區(qū)一樣,自適應(yīng)分區(qū)允許系統(tǒng)設(shè)計(jì)人員為單獨(dú)進(jìn)程或一組進(jìn)程預(yù)留 CPU 周期。因此,系統(tǒng)設(shè)計(jì)人員能保證一個子系統(tǒng)或分區(qū)上的負(fù)載不會影響其他子系統(tǒng)的可用性。而且,與靜態(tài)分區(qū)不同的是,自適應(yīng)分區(qū)還能將空閑分區(qū)中的 CPU 周期以動態(tài)方式重新分配到可受益于額外處理時間的分區(qū)——只有當(dāng) CPU 滿載時,分區(qū)預(yù)算才會執(zhí)行。因此,系統(tǒng)就能處理高峰需求并使利用率達(dá)到 100%,同時又能繼續(xù)享受資源保證帶來的收益。
同樣重要的是,自適應(yīng)分區(qū)還能直接應(yīng)用于先有系統(tǒng),而無需重新設(shè)計(jì)代碼或修改代碼。例如,在 QNX Neutrino 中,系統(tǒng)設(shè)計(jì)人員只需啟動分區(qū)內(nèi)已有的基于 POSIX 應(yīng)用程序,實(shí)時操作系統(tǒng)的調(diào)度程序就會確保每個分區(qū)都會收到分配的預(yù)算。在每個分區(qū)內(nèi),會繼續(xù)根據(jù)基于優(yōu)先級的搶占式調(diào)度算法對每項(xiàng)任務(wù)進(jìn)行調(diào)度——應(yīng)用程序不必更改其調(diào)度運(yùn)行。此外,系統(tǒng)設(shè)計(jì)人員還能以動態(tài)方式重新配置分區(qū),以精確調(diào)節(jié)系統(tǒng)實(shí)現(xiàn)最佳性能。
圖 3——自適應(yīng)分區(qū)可阻止優(yōu)先級高的任務(wù)消耗超過其分配的規(guī)定比例的 CPU,除非系統(tǒng)包含未使用的 CPU 周期。例如,任務(wù) A 和任務(wù) D 可在分配至分區(qū) 3 的時間內(nèi)運(yùn)行,因?yàn)槿蝿?wù) E 和任務(wù) F 不需要剩余的 CPU 周期預(yù)算。 6
“組合”內(nèi)核
通用操作系統(tǒng)(包括 Linux、Windows 和各種類型的 Unix 系統(tǒng))通常都缺少我們目前介紹的實(shí)時機(jī)制。但供應(yīng)商已開發(fā)出許多實(shí)時擴(kuò)展組件和補(bǔ)丁,試圖填補(bǔ)這一空白。例如,有一種雙內(nèi)核方法,其中的通用操作系統(tǒng)能以任務(wù)的形式在專用實(shí)時內(nèi)核上運(yùn)行(參見圖 4)。任何需要確定性調(diào)度的任務(wù)都會在該內(nèi)核中運(yùn)行,但其優(yōu)先級要高于通用操作系統(tǒng)的優(yōu)先級。因此,只要這些任務(wù)需要運(yùn)行,它們就能搶占 Linux,而且只有在其工作完成后,才會向 Linux 釋放 CPU。
遺憾的是,實(shí)時內(nèi)核中運(yùn)行的任務(wù)只能有限地利用通用操作系統(tǒng)中現(xiàn)有的系統(tǒng)服務(wù),如文件系統(tǒng)、網(wǎng)絡(luò)服務(wù)等。
實(shí)際上,如果實(shí)時任務(wù)向通用操作系統(tǒng)請求任何服務(wù),它都會面臨同樣的搶占問題,這會阻止通用操作系統(tǒng)以確定方式運(yùn)行。因此,必須針對實(shí)時內(nèi)核創(chuàng)建新的驅(qū)動程序和系統(tǒng)服務(wù),即使通用操作系統(tǒng)中已存在相同的服務(wù)。但是,多數(shù)通用操作系統(tǒng)為正常的非實(shí)時進(jìn)程提供的受內(nèi)存管理單元 (MMU) 保護(hù)的可靠環(huán)境卻無法惠及在實(shí)時內(nèi)核中運(yùn)行的任務(wù)。相反,它們會在無保護(hù)的內(nèi)核空間運(yùn)行。因此,任何含有公共編碼錯誤(如損壞的 C 指針)的實(shí)時任務(wù)都會輕易導(dǎo)致內(nèi)核出現(xiàn)嚴(yán)重故障。這的確是一個問題,因?yàn)樾枰獙?shí)時功能的大部分系統(tǒng)同樣需要極高的可靠性。
雙內(nèi)核方法的不同實(shí)現(xiàn)使用不同的應(yīng)用程序接口 (API) 使問題進(jìn)一步復(fù)雜。在多數(shù)情況下,為通用操作系統(tǒng)編寫的服務(wù)無法輕易移植到實(shí)時內(nèi)核中,而且針對一個供應(yīng)商的實(shí)時擴(kuò)展組件編寫的任務(wù)未必能在另一個供應(yīng)商的實(shí)時擴(kuò)展組件上運(yùn)行。
圖 4——在常見的雙內(nèi)核實(shí)現(xiàn)中,通用操作系統(tǒng)會作為優(yōu)先級最低的任務(wù)在單獨(dú)的實(shí)時內(nèi)核中運(yùn)行。
這種解決方案指出了使通用操作系統(tǒng)支持實(shí)時運(yùn)行的實(shí)際困難和復(fù)雜性。但這并非是關(guān)于實(shí)時操作系統(tǒng)和通用操作系統(tǒng)孰優(yōu)孰劣的問題。通用操作系統(tǒng)(如 Linux、Windows 和各種 Unix 系統(tǒng))都能以臺式機(jī)或服務(wù)器操作系統(tǒng)的形式正常運(yùn)行。但是,當(dāng)進(jìn)入不符合其設(shè)計(jì)用途的確定運(yùn)行環(huán)境中(如車載遠(yuǎn)程信息處理裝置、醫(yī)療器械、實(shí)時控制系統(tǒng)和連續(xù)媒體應(yīng)用)時,它們就會凸顯不足。 7
令調(diào)試和定制更輕松的源代碼
使用通用操作系統(tǒng)仍有一些好處,例如在 Linux 的開源模式下支持廣泛使用的應(yīng)用程序接口 (API)。利用開源模式,軟件開發(fā)人員能針對應(yīng)用程序的具體需求定制操作系統(tǒng)組件,從而能節(jié)約大量用于故障排解的時間。為保持這些優(yōu)勢,實(shí)時操作系統(tǒng)的供應(yīng)商應(yīng)根據(jù)友好的商業(yè)授權(quán)許可條款,確保其源代碼易于訪問。例如,QNX 不僅在社區(qū)網(wǎng)站 (www.foundry27.com) 中公布其源代碼,還采用了透明開發(fā)模式,確保源代碼在開發(fā)過程中就能公布。因此,軟件開發(fā)人員就能在開發(fā)過程中及早修復(fù)漏洞,并獲取最新技術(shù)。
實(shí)時操作系統(tǒng)的架構(gòu)也發(fā)揮了重要作用。例如,基于微內(nèi)核設(shè)計(jì)的實(shí)時操作系統(tǒng)能從根本上簡化操作系統(tǒng)的定制過程。在微內(nèi)核實(shí)時操作系統(tǒng)中,只有少數(shù)核心基本對象(如信號、計(jì)時器、調(diào)度程序)才會存在于內(nèi)核中。所有其他組件(驅(qū)動程序、文件系統(tǒng)、協(xié)議棧、應(yīng)用程序)都會以單獨(dú)的受內(nèi)存保護(hù)的進(jìn)程在內(nèi)核外部運(yùn)行;參見圖 5。因此,開發(fā)定制的驅(qū)動程序和其他與應(yīng)用程序有關(guān)的操作系統(tǒng)擴(kuò)展組件無需專門的內(nèi)核調(diào)試程序或內(nèi)核專家。實(shí)際上,作為用戶空間程序,開發(fā)這種操作系統(tǒng)擴(kuò)展組件和開發(fā)標(biāo)準(zhǔn)應(yīng)用程序一樣容易,因?yàn)殚_發(fā)人員都能使用標(biāo)準(zhǔn)、源代碼級工具對它們進(jìn)行調(diào)試。
圖 5——在微內(nèi)核實(shí)時操作系統(tǒng)中,系統(tǒng)服務(wù)作為標(biāo)準(zhǔn)的用戶空間進(jìn)程運(yùn)行,因而簡化了操作系統(tǒng)的定制任務(wù)。
例如,如果設(shè)備驅(qū)動程序試圖訪問其進(jìn)程空間之外的內(nèi)存,操作系統(tǒng)就能識別相關(guān)進(jìn)程,指出故障位置并創(chuàng)建可使用源代碼級調(diào)試工具查看的進(jìn)程轉(zhuǎn)儲文件。轉(zhuǎn)儲文件可包括調(diào)試程序確定導(dǎo)致故障的源代碼行所需的所有信息以及診斷信息(如數(shù)據(jù)項(xiàng)的內(nèi)容和函數(shù)調(diào)用的歷史)。 8
這種架構(gòu)還提供了絕佳的故障隔離和恢復(fù)功能:如果驅(qū)動程序、協(xié)議?;蚱渌到y(tǒng)服務(wù)出現(xiàn)故障,它可在不影響其他服務(wù)或損壞操作系統(tǒng)內(nèi)核的情況下完成這種操作。實(shí)際上,“軟件監(jiān)視程序”會持續(xù)監(jiān)測此類事件,并能以動態(tài)方式重啟出現(xiàn)故障的服務(wù),無需重啟整個系統(tǒng)或以任何方式干擾用戶。同樣,驅(qū)動程序和其他服務(wù)都能以動態(tài)方式停止、啟動或升級,無需關(guān)閉系統(tǒng)。
絕不可小看這些優(yōu)勢——因?yàn)槠茐膶?shí)時性能的最大威脅就是不定期的系統(tǒng)重啟!甚至軟件更新中包含的以可控制的方式進(jìn)行的預(yù)定重啟都會干擾系統(tǒng)運(yùn)行。為保證一直滿足最后期限的要求,軟件開發(fā)人員必須使用即使在出現(xiàn)軟件故障或進(jìn)行服務(wù)升級時,也能保持連續(xù)可用的操作系統(tǒng)。
評論