Linux大部分都是單內(nèi)核的
操作系統(tǒng)內(nèi)核可能是微內(nèi)核,,也可能是單內(nèi)核(后者有時(shí)稱之為宏內(nèi)核Macrokernel),。按照類似封裝的形式,這些術(shù)語定義如下:
l 微內(nèi)核(Microkernel kernel)――在微內(nèi)核中,,大部分內(nèi)核都作為單獨(dú)的進(jìn)程在特權(quán)狀態(tài)下運(yùn)行,,他們通過消息傳遞進(jìn)行通訊。在典型情況下,,每個(gè)概念模塊都有一個(gè)進(jìn)程,。因此,假如在設(shè)計(jì)中有一個(gè)系統(tǒng)調(diào)用模塊,,那么就必然有一個(gè)相應(yīng)的進(jìn)程來接收系統(tǒng)調(diào)用,,并和能夠執(zhí)行系統(tǒng)調(diào)用的其他進(jìn)程(或模塊)通訊以完成所需任務(wù)。
在這些設(shè)計(jì)中,,微內(nèi)核部分經(jīng)常只但是是個(gè)消息轉(zhuǎn)發(fā)站:當(dāng)系統(tǒng)調(diào)用模塊要給文檔系統(tǒng)模塊發(fā)送消息時(shí),,消息直接通過內(nèi)核轉(zhuǎn)發(fā)。這種方式有助于實(shí)現(xiàn)模塊間的隔離,。(某些時(shí)候,,模塊也能夠直接給其他模塊傳遞消息。)在一些微內(nèi)核的設(shè)計(jì)中,,更多的功能,,如I/O等,也都被封裝在內(nèi)核中了,。但是最根本的思想還是要保持微內(nèi)核盡量小,,這樣只需要把微內(nèi)核本身進(jìn)行移植就能夠完成將整個(gè)內(nèi)核移植到新的平臺(tái)上。其他模塊都只依賴于微內(nèi)核或其他模塊,,并不直接直接依賴硬件,。
微內(nèi)核設(shè)計(jì)的一個(gè)長處是在不影響系統(tǒng)其他部分的情況下,用更高效的實(shí)現(xiàn)代替現(xiàn)有文檔系統(tǒng)模塊的工作將會(huì)更加容易,。我們甚至能夠在系統(tǒng)運(yùn)行時(shí)將研發(fā)出的新系統(tǒng)模塊或需要替換現(xiàn)有模塊的模塊直接而且迅速的加入系統(tǒng),。另外一個(gè)長處是無需的模塊將不會(huì)被加載到內(nèi)存中,因此微內(nèi)核就能夠更有效的利用內(nèi)存。
l 單內(nèi)核(Monolithic kernel)――單內(nèi)核是個(gè)很大的進(jìn)程,。他的內(nèi)部又能夠被分為若干模塊(或是層次或其他),。但是在運(yùn)行的時(shí)候,他是個(gè)單獨(dú)的二進(jìn)制大映象,。其模塊間的通訊是通過直接調(diào)用其他模塊中的函數(shù)實(shí)現(xiàn)的,,而不是消息傳遞。
單內(nèi)核的支持者聲稱微內(nèi)核的消息傳遞開銷引起了效率的損失,。微內(nèi)核的支持者則認(rèn)為因此而增加的內(nèi)核設(shè)計(jì)的靈活性和可維護(hù)性能夠彌補(bǔ)任何損失。
我并不想討論這些問題,,但必須說明很有趣的一點(diǎn)是,,這種爭論經(jīng)常會(huì)令人想到前幾年CPU領(lǐng)域中RISC和CISC的斗爭。現(xiàn)代的成功CPU設(shè)計(jì)中包含了任何這兩種技術(shù),,就像Linux內(nèi)核是微內(nèi)核和單一內(nèi)核的混合產(chǎn)物相同,。Linux內(nèi)核基本上是單一的,但是他并不是個(gè)純粹的集成內(nèi)核,。前面一章所介紹的內(nèi)核模塊系統(tǒng)將微內(nèi)核的許多長處引入到Linux的單內(nèi)核設(shè)計(jì)中,。(順便提一下,我考慮過一種有趣的情況,,就是Linux的內(nèi)核模塊系統(tǒng)能夠?qū)⑾到y(tǒng)內(nèi)核轉(zhuǎn)化成為簡單的不傳遞消息的微內(nèi)核設(shè)計(jì),。雖然我并不贊成,但是他仍然是個(gè)有趣的想法,。)
為什么Linux必然是單內(nèi)核的呢,?一個(gè)方面是歷史的原因:在Linus的觀點(diǎn)看來,通過把內(nèi)核以單一的方式進(jìn)行組織并在最初始的空間中運(yùn)行是相當(dāng)容易的事情,。這種決策避免了有關(guān)消息傳遞體系結(jié)構(gòu),,計(jì)算模塊裝載方式等方面的相關(guān)工作。(內(nèi)核模塊系統(tǒng)在隨后的幾年中又進(jìn)行了不斷地改進(jìn),。)
另外一個(gè)原因是充足的研發(fā)時(shí)間的結(jié)果,。Linux既沒有研發(fā)時(shí)間的限制,也沒有深受市場壓力的發(fā)行進(jìn)度,。任何的限制只有并但是分的對(duì)內(nèi)核的修改和擴(kuò)充,。內(nèi)核的單一設(shè)計(jì)在內(nèi)部實(shí)現(xiàn)了充分的模塊化,在這種條件下的修改或增加都并不怎么困難,。而且問題還在于沒有必要為了追求尚未證實(shí)的可維護(hù)性的微小增長而重寫Linux的內(nèi)核,。(Linus曾多次特別強(qiáng)調(diào)了如下的觀點(diǎn):為了這點(diǎn)利益而損耗速度是不值得的。)后面章節(jié)中的部分內(nèi)容將周詳?shù)闹匦驴紤]充足研發(fā)時(shí)間的效果,。
假如Linux是純微內(nèi)核設(shè)計(jì),,那么向其他體系結(jié)構(gòu)上的移植將會(huì)比較容易。實(shí)際上,有一些微內(nèi)核,,如Mach微內(nèi)核,,就已成功的證實(shí)了這種可移植性的長處。實(shí)際的情況是,,Linux內(nèi)核的移植雖然不是很簡單,,但也絕不是不可能的:大約的數(shù)字是,向一個(gè)全新的體系結(jié)構(gòu)上的典型的移植工作需要30,000到 60,000行代碼,,再加上不到20,000行的驅(qū)動(dòng)程式代碼,。(并不是任何的移植都需要新的驅(qū)動(dòng)程式代碼。)粗略的計(jì)算一下,,我估計(jì)一個(gè)典型的移植平均需要50,000行代碼,。這對(duì)于一個(gè)程式員或最多一個(gè)程式小組來說是力所能及的,能夠在一年之內(nèi)完成,。雖然這比微內(nèi)核的移植需要更多的代碼,,但是 Linux的支持者將會(huì)提出,這樣的Linux內(nèi)核移植版本比微內(nèi)核更能夠有效的利用底層硬件,,因而移植過程中的額外工作是能夠從系統(tǒng)性能的提高上得到補(bǔ)償?shù)摹?
這種特別設(shè)計(jì)的權(quán)衡也不是很輕松就能夠達(dá)到的,,單內(nèi)核的實(shí)現(xiàn)策略公然違背了傳統(tǒng)的看法,后者認(rèn)為微內(nèi)核是未來發(fā)展的趨勢,。但是由于單一模式(大部分情況下)在Linux中運(yùn)行狀態(tài)良好,,而且內(nèi)核移植相對(duì)來說比較困難,但沒有明顯地阻礙程式員團(tuán)體的工作,,他們已熱情高漲地把內(nèi)核成功的移植到了現(xiàn)存的大部分實(shí)際系統(tǒng)中,,更不用說類似掌上型電腦的一些看起來很不實(shí)際的目標(biāo)了。只要Linux的眾多特點(diǎn)仍然值得移植,,新的移植版本就會(huì)不斷涌現(xiàn),。
另一篇文字
Linux內(nèi)核和傳統(tǒng)Unix內(nèi)核的比較
所有的Unix內(nèi)核都同宗同源,并且提供相同的API,,現(xiàn)代的Unix內(nèi)核存在許多設(shè)計(jì)上的相似之處,。
Unix內(nèi)核幾乎毫無例外的都是一個(gè)不可分割的靜態(tài)可執(zhí)行塊(文件)。也就是說,,它們必須以完整,、單
獨(dú)的可執(zhí)行塊的形式在一個(gè)單獨(dú)的地址空間中運(yùn)行。
Unix內(nèi)核幾乎都需要硬件系統(tǒng)提供頁機(jī)制以管理內(nèi)存,。這種頁機(jī)制可以加強(qiáng)內(nèi)存空間的保護(hù),,并保證每
個(gè)進(jìn)程都可以運(yùn)行于不同的虛地址空間上。
單內(nèi)核與微內(nèi)核設(shè)計(jì)之比較
操作系統(tǒng)內(nèi)核可以分為兩大設(shè)計(jì)陣營:單內(nèi)核和微內(nèi)核(第三陣營外內(nèi)核,,主要用在科研系統(tǒng)中,,
但也逐漸在現(xiàn)實(shí)世界中壯大起來),。
單內(nèi)核是兩大陣營中一種較為簡單的設(shè)計(jì),在1980年之前,,所有的內(nèi)核都設(shè)計(jì)成單內(nèi)核,。所謂單內(nèi)
核就是把它從整體上作為一個(gè)單獨(dú)的大過程來實(shí)現(xiàn),并同時(shí)運(yùn)行在一個(gè)單獨(dú)的地址空間,。因此,,這樣的
內(nèi)核通常以單個(gè)靜態(tài)二進(jìn)制文件的形式存放于磁盤。所有內(nèi)核服務(wù)都在這樣的一個(gè)大內(nèi)核空間中運(yùn)行,。
內(nèi)核之間的通信是微不足道的,,因?yàn)榇蠹叶歼\(yùn)行在內(nèi)核態(tài),并身處同一地址空間:內(nèi)核可以直接調(diào)用函
數(shù),,這與用戶空間沒有什么區(qū)別,。這種模式的支持者認(rèn)為單模塊具有簡單和高性能的特點(diǎn)。大多數(shù)Unix
系統(tǒng)都設(shè)計(jì)為單模塊,。
另一方面,微內(nèi)核并不作為一個(gè)單獨(dú)的大過程來實(shí)現(xiàn),。相反,,微內(nèi)核的功能被劃分為獨(dú)立的過程,
每個(gè)過程叫做一個(gè)服務(wù)器,。理想情況下,,只有強(qiáng)烈請(qǐng)求特權(quán)服務(wù)的服務(wù)器才運(yùn)行在特權(quán)模式下,其他服
務(wù)器都運(yùn)行在用戶空間,。不過,,所有的服務(wù)器都保持獨(dú)立并運(yùn)行在各自的地址空間。因此,,就不可能像
單模塊內(nèi)核那樣直接調(diào)用函數(shù),,而是通過消息傳遞處理微內(nèi)核通信:系統(tǒng)采用了進(jìn)程間通信(IPC)機(jī)制,
因此,,各種服務(wù)器之間通過IPC機(jī)制互通消息,,互換“服務(wù)”。服務(wù)器的各自獨(dú)立有效地避免了一個(gè)服務(wù)
器的失效禍及另一個(gè),。
同樣,,模塊化的系統(tǒng)允許一個(gè)服務(wù)器為了另一個(gè)服務(wù)器而換出。因?yàn)镮PC機(jī)制的開銷比函數(shù)調(diào)用多,,
又因?yàn)闀?huì)涉及內(nèi)核空間到用戶空間的上下文切換,,因此,消息傳遞需要一定的周期,,而單內(nèi)核中簡單的
函數(shù)調(diào)用沒有這些開銷,?;诖耍吨趯?shí)際的微內(nèi)核系統(tǒng)讓大部分或全部服務(wù)器位于內(nèi)核,,這樣,,就
可以直接調(diào)用函數(shù),消除頻繁的上下文切換,。Windows NT內(nèi)核和Mach(Mac OS X的組成部分)是微內(nèi)核
的典型實(shí)例,。不管是Windows NT還是Mac OS X,都在其新近版本中不讓任何微內(nèi)核服務(wù)器運(yùn)行在用戶空
間,,這違背了微內(nèi)核設(shè)計(jì)的初衷,。
Linux是一個(gè)單內(nèi)核,也就是說,,Linux內(nèi)核運(yùn)行在單獨(dú)的內(nèi)核地址空間,。不過,Linux汲取了微內(nèi)核
的精華:其引以為豪的是模塊化設(shè)計(jì),、搶占式內(nèi)核,、支持內(nèi)核線程以及動(dòng)態(tài)裝載內(nèi)核模塊的能力。不僅
如此,,Linux還避其微內(nèi)核設(shè)計(jì)上性能損失的缺陷,,讓所有事情都運(yùn)行在內(nèi)核態(tài),直接調(diào)用函數(shù),,無需消
息傳遞,。至今,Linux是模塊化的,、多線程的以及內(nèi)核本身可調(diào)度的操作系統(tǒng),。實(shí)用主義再次占了上風(fēng)。
當(dāng)Linus和其他內(nèi)核開發(fā)者設(shè)計(jì)Linux內(nèi)核時(shí),,他們并沒有完全徹底地與Unix訣別,。他們充分地認(rèn)識(shí)
到,不能忽視Unix的底蘊(yùn)(特別是Unix的 API),。而由于Linux并沒有基于某種特定的Unix,,Linus和他
的伙伴們對(duì)每個(gè)特定的問題都可以選擇已知最理想的解決方案—在有些時(shí)候,當(dāng)然也可以創(chuàng)造一些新的
方案,。以下是對(duì)Linux內(nèi)核與Unix各種變體的內(nèi)核特點(diǎn)所作的分析比較:
·Linux支持動(dòng)態(tài)加載內(nèi)核模塊,。盡管Linux內(nèi)核也是單內(nèi)核,可是允許在需要的時(shí)候動(dòng)態(tài)地卸除和
加載部分內(nèi)核代碼,。
·Linux支持對(duì)稱多處理(SMP)機(jī)制,,盡管許多Unix的變體也支持SMP,但傳統(tǒng)的Unix并不支持這種
機(jī)制,。
·Linux內(nèi)核可以搶占(preemptive),。與傳統(tǒng)的Unix不同,,Linux內(nèi)核具有允許在內(nèi)核運(yùn)行的任務(wù)
優(yōu)先執(zhí)行的能力。在其他各種Unix產(chǎn)品中,,只有Solaris和IRIX支持搶占,,但是大多數(shù)傳統(tǒng)的Unix內(nèi)核不
支持搶占。
·Linux對(duì)線程支持的實(shí)現(xiàn)比較有意思:內(nèi)核并不區(qū)分線程和其他的一般進(jìn)程,。對(duì)于內(nèi)核來說,,所有
的進(jìn)程都一樣—只不過其中的一些共享資源而已。
·Linux提供具有設(shè)備類的面向?qū)ο蟮脑O(shè)備模型,、熱插拔事件,,以及用戶空間的設(shè)備文件系統(tǒng)
(sysfs)。
·Linux忽略了一些被認(rèn)為是設(shè)計(jì)得很拙劣的Unix特性,,像STREAMS,,它還忽略了那些實(shí)際上已經(jīng)根
本不會(huì)使用的過時(shí)標(biāo)準(zhǔn)。
·Linux體現(xiàn)了自由這個(gè)詞的精髓?,F(xiàn)有的Linux特性集就是Linux公開開發(fā)模型自由發(fā)展的結(jié)果,。如
果一個(gè)特性沒有任何價(jià)值或者創(chuàng)意很差,沒有任何人會(huì)被迫去實(shí)現(xiàn)它,。相反的,,在Linux的發(fā)展過程中已
經(jīng)形成了一種值得稱贊的務(wù)實(shí)態(tài)度:任何改變都要針對(duì)現(xiàn)實(shí)中確實(shí)存在的問題,經(jīng)過完善的設(shè)計(jì)并有正
確簡潔的實(shí)現(xiàn),。于是,許多其他現(xiàn)代Unix系統(tǒng)包含的特性,,如內(nèi)核換頁機(jī)制,,都被毫不遲疑的引入進(jìn)來
。
不管Linux和Unix有多大的不同,,它身上都深深地打上了Unix烙印