系統(tǒng)簡(jiǎn)介
QNX
是一個(gè)分布式、可擴(kuò)展晚吞、遵從POSIX
規(guī)范的類Unix
硬實(shí)時(shí)操作系統(tǒng)延旧。
QNX
為微內(nèi)核的架構(gòu)谋国,微內(nèi)核只提供進(jìn)程調(diào)度、進(jìn)程間通信迁沫、底層網(wǎng)絡(luò)通信和中斷處理四種服務(wù)芦瘾。驅(qū)動(dòng)程序、協(xié)議棧集畅、文件系統(tǒng)近弟、應(yīng)用程序等都在微內(nèi)核之外內(nèi)存受保護(hù)的安全的用戶空間內(nèi)運(yùn)行,組件之間能避免相互影響挺智,在遇到故障時(shí)也能重啟祷愉。
QNX Neutrino通過(guò)兩個(gè)基本的原則,達(dá)到了獨(dú)一無(wú)二的有效性赦颇、模塊化和簡(jiǎn)潔性:
- 微內(nèi)核架構(gòu)
- 基于消息的進(jìn)程間通信
微內(nèi)核架構(gòu)
在微內(nèi)核OS中二鳄,內(nèi)核精簡(jiǎn),只實(shí)現(xiàn)OS最基本的核心部分并提供相應(yīng)的服務(wù)媒怯,基于這些服務(wù)可以擴(kuò)展完整的OS功能订讼。設(shè)計(jì)一個(gè)微內(nèi)核OS的目標(biāo)是模塊化,而并非最小化扇苞。
微內(nèi)核提供的IPC服務(wù)用于將操作系統(tǒng)本身“粘合”在一起欺殿,這些服務(wù)的性能和靈活性決定了系統(tǒng)最終的性能”罘螅可以使用IPC服務(wù)和其他附加的服務(wù)來(lái)擴(kuò)展內(nèi)核的功能脖苏。 用戶編寫(xiě)的進(jìn)程既可以作為應(yīng)用程序,也可以作為底層OS功能來(lái)支持行業(yè)特定的應(yīng)用程序定踱。 操作系統(tǒng)本身變得“開(kāi)放”并且易于擴(kuò)展帆阳。 此外,用戶編寫(xiě)的OS擴(kuò)展也不會(huì)影響核心OS的基本可靠性屋吨。
QNX內(nèi)存保護(hù)
對(duì)許多依照POSIX1.003.1標(biāo)準(zhǔn)實(shí)現(xiàn)的實(shí)時(shí)執(zhí)行程序來(lái)說(shuō)蜒谤,它們的運(yùn)行時(shí)環(huán)境通常是單進(jìn)程、多線程的模型至扰,線程之間沒(méi)法做到內(nèi)存保護(hù)鳍徽,而這樣的環(huán)境只是POSIX假設(shè)的多進(jìn)程模型的一個(gè)子集,它不支持fork()
函數(shù)敢课。相比之下阶祭,QNX Neutrino利用MMU绷杜,在受保護(hù)的環(huán)境中實(shí)現(xiàn)了POSIX的線程模型。
一個(gè)真正的微內(nèi)核會(huì)提供完整的內(nèi)存保護(hù)濒募,這個(gè)不僅適用于用戶程序鞭盟,也適用于OS組件,比如驅(qū)動(dòng)程序瑰剃、文件系統(tǒng)等齿诉。
針對(duì)內(nèi)存保護(hù),有以下幾種情況:
-
不提供內(nèi)存保護(hù):所有程序位于同一個(gè)地址空間晌姚,應(yīng)用程序可以訪問(wèn)所有空間粤剧,效率較高,但是程序指針錯(cuò)誤可能造成內(nèi)核崩潰挥唠,典型的比如Nuttx平板模式抵恋。
-
單內(nèi)核OS提供部分內(nèi)存保護(hù):用戶層和系統(tǒng)層進(jìn)行了隔離,內(nèi)核和各種驅(qū)動(dòng)宝磨、協(xié)議棧在同一個(gè)地址空間弧关,應(yīng)用程序在單獨(dú)空間。內(nèi)核模塊處于一個(gè)保護(hù)空間唤锉,效率較高世囊,應(yīng)用程序無(wú)法訪問(wèn),系統(tǒng)的穩(wěn)定性也得到提高腌紧。由于內(nèi)核模塊處于保護(hù)空間茸习,調(diào)試會(huì)比較困難。比如Linux系統(tǒng)壁肋。
-
微內(nèi)核OS提供完整的內(nèi)存保護(hù):內(nèi)核處于一個(gè)被保護(hù)的地址空間号胚,驅(qū)動(dòng)程序、網(wǎng)絡(luò)協(xié)議及應(yīng)用程序等處于程序空間中浸遗。
QNX Neutrino微內(nèi)核
內(nèi)核是操作系統(tǒng)的核心猫胁,在有些操作系統(tǒng)中,內(nèi)核包含了很多功能跛锌,導(dǎo)致內(nèi)核像是個(gè)完整的操作系統(tǒng)弃秆。而QNX的微內(nèi)核是一個(gè)真正的內(nèi)核,它非常小髓帽,并且只提供基本的服務(wù):
- 通過(guò)POSIX線程創(chuàng)建原語(yǔ)提供的線程服務(wù)菠赚;
- 通過(guò)POSIX信號(hào)原語(yǔ)提供的信號(hào)服務(wù);
- 消息傳遞服務(wù)郑藏,微內(nèi)核處理整個(gè)系統(tǒng)中所有線程之間的消息路由衡查;
- 通過(guò)POSIX線程同步原語(yǔ)提供的同步服務(wù);
- 調(diào)度服務(wù)必盖,微內(nèi)核使用各種POSIX實(shí)時(shí)調(diào)度策略來(lái)調(diào)度線程執(zhí)行拌牲;
- 定時(shí)器服務(wù)俱饿,微內(nèi)核提供了豐富的POSIX定時(shí)器服務(wù)集;
- 進(jìn)程管理服務(wù)塌忽,微內(nèi)核與進(jìn)程管理器一起組成一個(gè)叫
procnto
的單元拍埠,進(jìn)程管理器部分負(fù)責(zé)管理進(jìn)程、內(nèi)存土居,還有路徑名空間枣购。
與線程不同,微內(nèi)核本身不會(huì)被調(diào)度執(zhí)行装盯。處理器只在微內(nèi)核中執(zhí)行系統(tǒng)調(diào)用坷虑、異常甲馋、硬件中斷響應(yīng)等埂奈。
QNX Neutrino操作系統(tǒng)的微內(nèi)核,管理一組協(xié)作的進(jìn)程定躏,如下圖所示账磺,這種結(jié)構(gòu)不是一種層級(jí)的組織,更像是一個(gè)團(tuán)隊(duì)痊远,因?yàn)椴煌倪M(jìn)程可以通過(guò)內(nèi)核來(lái)協(xié)調(diào)交互垮抗。QNX Neutrino充當(dāng)一個(gè)“軟件總線”的角色,可以在需要的時(shí)候動(dòng)態(tài)的插入和移除系統(tǒng)模塊碧聪。
進(jìn)程及進(jìn)程間通信
除了procnto
單元提供的服務(wù)外冒版,所有的系統(tǒng)服務(wù)都是通過(guò)標(biāo)準(zhǔn)的進(jìn)程來(lái)處理的。一個(gè)配置豐富的QNX系統(tǒng)應(yīng)該包括以下功能:
- 文件系統(tǒng)管理器
- 字符設(shè)備管理器
- 圖形用戶界面
- 本地網(wǎng)絡(luò)管理器
- TCP/IP
系統(tǒng)進(jìn)程 vs 用戶進(jìn)程
系統(tǒng)進(jìn)程與任何用戶編寫(xiě)的進(jìn)程本質(zhì)上是不可區(qū)分的逞姿,它們使用相同的公共API和內(nèi)核服務(wù)辞嗡。正是這種架構(gòu)也讓QNX具備了無(wú)與倫比的可擴(kuò)展性。由于大多數(shù)的操作系統(tǒng)服務(wù)由標(biāo)準(zhǔn)的系統(tǒng)進(jìn)程提供滞造,因此增強(qiáng)操作系統(tǒng)本身變得非常簡(jiǎn)單:只需編寫(xiě)新的程序來(lái)提供新的操作系統(tǒng)服務(wù)续室。實(shí)際上,操作系統(tǒng)和應(yīng)用程序之間的界限可能會(huì)變得非常模糊谒养,系統(tǒng)服務(wù)和應(yīng)用程序之間唯一真正的區(qū)別是操作系統(tǒng)服務(wù)為客戶管理資源挺狰。
假如你需要寫(xiě)一個(gè)數(shù)據(jù)庫(kù)的服務(wù)器,這樣一個(gè)進(jìn)程怎么分類买窟?
正如文件系統(tǒng)接受請(qǐng)求(通過(guò)消息)來(lái)打開(kāi)文件和讀寫(xiě)數(shù)據(jù)一樣丰泊,數(shù)據(jù)庫(kù)服務(wù)器也需要接受請(qǐng)求,盡管數(shù)據(jù)庫(kù)服務(wù)器的請(qǐng)求可能更復(fù)雜始绍,但是兩者非常相似瞳购,需要提供API(由消息實(shí)現(xiàn))給客戶端進(jìn)行資源訪問(wèn)。此外疆虚,它們都是獨(dú)立的進(jìn)程苛败,可以由終端用戶來(lái)編寫(xiě)满葛,并且根據(jù)需要來(lái)進(jìn)行啟動(dòng)和停止。
數(shù)據(jù)庫(kù)服務(wù)器可能在某個(gè)任務(wù)中充當(dāng)系統(tǒng)進(jìn)程罢屈,而在另外的任務(wù)中充當(dāng)應(yīng)用戶進(jìn)程嘀韧,但是這都不重要,重要的是QNX操作系統(tǒng)可以在不修改操作系統(tǒng)本身的標(biāo)準(zhǔn)組件的情況下缠捌,允許用戶實(shí)現(xiàn)這樣的進(jìn)程锄贷,對(duì)于嵌入式開(kāi)發(fā)人員來(lái)說(shuō),提供了很大的靈活性曼月。
設(shè)備驅(qū)動(dòng)程序允許操作系統(tǒng)和應(yīng)用程序以通用的方式去訪問(wèn)低層的硬件(例如磁盤(pán)設(shè)備驅(qū)動(dòng)器谊却、網(wǎng)絡(luò)接口)。雖然大多數(shù)的OS要求設(shè)備驅(qū)動(dòng)程序與OS本身緊密綁定哑芹,但是QNX Neutrino的驅(qū)動(dòng)程序能被當(dāng)成一個(gè)標(biāo)準(zhǔn)的進(jìn)程被啟動(dòng)和停止炎辨。因此,添加設(shè)備驅(qū)動(dòng)程序不會(huì)影響OS的其他部分聪姿,可以像應(yīng)用程序一樣開(kāi)發(fā)和調(diào)試驅(qū)動(dòng)碴萧。
進(jìn)程間通信
IPC(Interprocess Communication)進(jìn)程間通信,是將應(yīng)用程序設(shè)計(jì)成一組進(jìn)程的關(guān)鍵末购,確保每個(gè)進(jìn)程處理整體中的某一部分破喻。QNX是第一個(gè)將消息傳遞作為IPC基本手段的商業(yè)操作系統(tǒng),操作系統(tǒng)的強(qiáng)大盟榴、簡(jiǎn)單和優(yōu)雅曹质,在很大程度上歸功于消息傳遞在整個(gè)系統(tǒng)中的完整集成。
在QNX Neutrino中擎场,消息是從一個(gè)進(jìn)程傳遞給另一個(gè)進(jìn)程的字節(jié)包羽德,消息的內(nèi)容只對(duì)發(fā)送者和接收者有意義。
消息傳遞不僅允許進(jìn)程相互傳遞數(shù)據(jù)顶籽,而且還提供了一種同步多個(gè)進(jìn)程執(zhí)行的方法玩般。當(dāng)進(jìn)程發(fā)送、接收礼饱、回復(fù)消息時(shí)坏为,它們會(huì)經(jīng)歷各種“狀態(tài)變化”,這些“狀態(tài)變化”镊绪,會(huì)影響它們的執(zhí)行時(shí)間和時(shí)間長(zhǎng)度匀伏。了解它們的優(yōu)先級(jí)和狀態(tài),微內(nèi)核可以盡可能有效的調(diào)度所有進(jìn)程蝴韭,最大限度來(lái)利用CPU資源够颠。消息傳遞在整個(gè)系統(tǒng)中不斷的起作用。
實(shí)時(shí)或關(guān)鍵任務(wù)榄鉴,通常需要一套可靠的IPC機(jī)制履磨,因?yàn)榻M成這些任務(wù)的進(jìn)程之間關(guān)聯(lián)很緊密蛉抓。QNX Neutrino的消息傳遞設(shè)計(jì)所強(qiáng)加的規(guī)則,給應(yīng)用程序帶來(lái)了秩序和可靠性剃诅。