一、linux的內(nèi)核管理:對(duì)內(nèi)核的基本認(rèn)識(shí)
我們所談到的操作系統(tǒng)主要指內(nèi)核
以上功能據(jù)沒有涉及實(shí)現(xiàn)文本編輯、實(shí)現(xiàn)字處理,也沒有服務(wù)等等。
故,操作系統(tǒng)是一種通用軟件,是平臺(tái)類軟件,自己并不做任何工作,只是給其他程序提供了運(yùn)行環(huán)境。除操作系統(tǒng)之外,還有應(yīng)用程序,為實(shí)現(xiàn)某一目的,專門設(shè)計(jì)的程序。
那么,既然內(nèi)核有這么多功能,模塊化設(shè)計(jì)?各功能獨(dú)立成子系統(tǒng)?
顯然將功能整合在一起,內(nèi)核將變得非常復(fù)雜。
二、內(nèi)核的設(shè)計(jì)流派
說說內(nèi)核設(shè)計(jì)的兩大流派:
從根本上講,將一個(gè)事情拆成各個(gè)小問題,然后每個(gè)小問題只復(fù)雜一個(gè)任務(wù)是linux的設(shè)計(jì)哲學(xué)之一。
按道理,linux是微內(nèi)核,但恰恰不是。
三、linux內(nèi)核設(shè)計(jì)
原因:早期設(shè)計(jì)的時(shí)沒有使用微內(nèi)核的思想,linux是一步步擴(kuò)展而來后來,有呼聲,要將linux改為微內(nèi)核,但linus拒絕,能工作能穩(wěn)定的工作,就OK,更重要的是,雖然微內(nèi)核是一種優(yōu)良的設(shè)計(jì)思想,但時(shí)下,他跑起來一點(diǎn)不比單內(nèi)核高效更高級(jí),但微內(nèi)核有更優(yōu)良的線程,linux則表現(xiàn)一般。
但linux在一步步的發(fā)展中吸取了微內(nèi)核的設(shè)計(jì)經(jīng)驗(yàn),雖然是單內(nèi)核,但是兼具微內(nèi)核的特性。
linux通過使用模塊化內(nèi)核設(shè)計(jì)來兼具微內(nèi)核特性,但這樣的模塊化設(shè)化設(shè)計(jì)并不是像微內(nèi)核一樣是各個(gè)子系統(tǒng),而是由核心加外圍的功能性模塊組成內(nèi)核。而微內(nèi)核子系統(tǒng)都是各自獨(dú)立運(yùn)行的,不需要依賴其他部分就能工作。而linux各模塊必許依賴核心,只是能在使用時(shí)進(jìn)行裝載,不用時(shí)被動(dòng)態(tài)卸載。linux下的模塊外在表現(xiàn)為類型程序的庫文件,只是程序庫文件為.so,而內(nèi)核模塊為.ko(kernel object),被內(nèi)核調(diào)用。
假設(shè),如果驅(qū)動(dòng)是內(nèi)核提供的,想象下,編譯好一個(gè)內(nèi)核,裝在主機(jī)上,萬一后來發(fā)現(xiàn)他無法驅(qū)動(dòng)我們后來新添加的新硬件設(shè)備。各種硬件都是由內(nèi)核驅(qū)動(dòng)的,內(nèi)核沒有提供這個(gè)程序。假設(shè)我們有了驅(qū)動(dòng)程序,怎樣才能讓他驅(qū)動(dòng)起來,是不是從新編譯內(nèi)核,這是對(duì)用戶和廠商的不幸。
模塊化設(shè)計(jì)得以避免這種情況,故各贏家廠商的以模塊化的形式開發(fā)自己的驅(qū)動(dòng),只需針對(duì)某一特定設(shè)備開發(fā)自己驅(qū)動(dòng)程序的即可,而后我們編譯這些模塊即可。由于linux支持動(dòng)態(tài)裝卸載模塊,因此當(dāng)我需要和不需要某一功能時(shí),可自行拆卸,并不影響核心的運(yùn)行,這就是好處和優(yōu)勢(shì)表現(xiàn)之一。
四、內(nèi)核的基本概念
跟各種應(yīng)用程序一樣,內(nèi)核也是一種應(yīng)用程序,只不過,這種應(yīng)用程序是直接操作硬件的。
內(nèi)核直接面對(duì)的是硬件,調(diào)用的是硬件接口,是通過個(gè)硬件廠商和CPU廠商提供的指令集進(jìn)行開發(fā)。
開發(fā)應(yīng)用程序面對(duì)的是內(nèi)核,系統(tǒng)調(diào)用,或庫調(diào)用進(jìn)行的,故簡(jiǎn)單得多。
為編寫內(nèi)核級(jí)的應(yīng)用程序,又為了避免過于底層,固有很多庫文件,可以讓內(nèi)核編譯時(shí)使用。
內(nèi)核是直接面向硬件的,故可用資源權(quán)限很大,但內(nèi)核是工作在有限地址空間內(nèi)的,在linux而言,32位系統(tǒng)上,線性地址空間中,內(nèi)核只認(rèn)為自己有1G的,雖然可以掌握4G,但是自己的運(yùn)行只能使用1G,剩下的3G給其他應(yīng)用程序。win是各2G。故我們開發(fā)內(nèi)核時(shí)可用的內(nèi)存空間很有限,尤其是開發(fā)驅(qū)動(dòng),要明白自己的可用空間很有限,故需高效。
五、從動(dòng)態(tài)的角度看linux主機(jī)的運(yùn)行狀況
應(yīng)用程序運(yùn)行在內(nèi)核上,只是邏輯上的情況。但實(shí)際是直接工作在硬件上的,任意應(yīng)用程序數(shù)據(jù)都在內(nèi)存中,數(shù)據(jù)處理都是CPU,只是他們不能隨意使用而已,要接受內(nèi)核的管理。
但CPU只有一顆,應(yīng)用程序工作的時(shí)候,內(nèi)核就暫停了,應(yīng)用程序也在內(nèi)存空間中,一旦應(yīng)用程序想要訪問其他硬件資源時(shí),即要執(zhí)行I/O指令時(shí),不能執(zhí)行。
因?yàn)閼?yīng)用程序看不見硬件,應(yīng)用程序是基于系統(tǒng)調(diào)用的程序,當(dāng)應(yīng)用程序需要訪問硬件資源時(shí)時(shí),就向CPU發(fā)起特權(quán)請(qǐng)求,一旦CPU收到特權(quán)請(qǐng)求,CPU就會(huì)喚醒內(nèi)核,從而執(zhí)行內(nèi)核中的某段代碼(非完整的內(nèi)核程序),然后將結(jié)果返回給應(yīng)用程序,而后內(nèi)核代碼退出,內(nèi)核程序暫停。在這期間CPU就從用戶模式轉(zhuǎn)換成了內(nèi)核模式,內(nèi)核模式 就好似能夠執(zhí)行特權(quán)的模式。
所有的應(yīng)用程序時(shí)在硬件上直接執(zhí)行的,只是在必要時(shí)接受內(nèi)核的管理和監(jiān)控。
故內(nèi)核也是監(jiān)控器,監(jiān)控程序,是資源和進(jìn)程的監(jiān)控程序。
六、CPU的時(shí)間與內(nèi)核的空間
因?yàn)閮?nèi)存中每一個(gè)進(jìn)程都以為直接是獨(dú)占CPU的,故內(nèi)核即是將CPU虛擬化,提供給進(jìn)程,CPU在內(nèi)核級(jí)別就已經(jīng)虛擬化了,通過將CPU切成時(shí)間片,隨著時(shí)間流逝而完成在個(gè)進(jìn)程之間分派計(jì)算能力的,CPU是以時(shí)間提供其計(jì)算能力的。
而內(nèi)存是站在空間角度進(jìn)行數(shù)據(jù)容納的。
這就是所謂的時(shí)空轉(zhuǎn)換。
在單位時(shí)間內(nèi)要能夠提供的計(jì)算能力越大,必須速度越快,否則只能延長(zhǎng)時(shí)間。這也就是我們需要更快的CPU,以節(jié)約時(shí)間。
對(duì)于內(nèi)存而言考慮的是空間問題。
六、CPU的運(yùn)算特性
I/O是最慢的設(shè)備,我們CPU有大量時(shí)間都拿來等待I/O完成,為避免空余的沒有任何意義的等待,需要等待時(shí),就讓CPU運(yùn)行別的進(jìn)程或線程
我們應(yīng)該最大能力榨取CPU的計(jì)算能力,因?yàn)镃PU的計(jì)算能力是隨著時(shí)間時(shí)鐘頻率的振蕩器在震蕩,你用或者不用他都在跑
如果你讓CPU空閑著,他依然耗電,而且隨時(shí)間流逝,計(jì)算能力白白消逝了,因此能夠讓CPU工作在80-90%的利用率下,這就意味著他的生產(chǎn)能力得到了充分的發(fā)揮。CPU是用不壞的,沒有什么磨損很消耗,是電器設(shè)備,除了功率大是發(fā)熱量大,散熱足夠就好了,對(duì)于電器設(shè)備而言不用反而會(huì)壞
七、從硬件看系統(tǒng)啟動(dòng)
內(nèi)核沒有生產(chǎn)力,生產(chǎn)力是由個(gè)被調(diào)用的應(yīng)用程序產(chǎn)生,故我們應(yīng)該盡量讓系統(tǒng)運(yùn)行在應(yīng)用程序模式中,故內(nèi)核占據(jù)的時(shí)間越少越好。而內(nèi)核主要在進(jìn)程切換、中斷處理等相關(guān)功能上,占據(jù)時(shí)間,模式切換到目的也是為了生產(chǎn)完成,但進(jìn)程切換與生產(chǎn)就沒有任何意義了,中斷處理可以認(rèn)為與生產(chǎn)本身相關(guān),因?yàn)閼?yīng)用要執(zhí)行I/O
內(nèi)核的主要目的是完成硬件管理,而linux中
有一個(gè)思想,各進(jìn)程都是由其父進(jìn)程衍生的,由父進(jìn)程fork()而來的,那么由誰來fork()以及管理這些進(jìn)程,于是有了大管家程序init,統(tǒng)籌管理用戶空間的所有進(jìn)程。用戶空間的管理工作都不會(huì)由內(nèi)核執(zhí)行,故我們啟動(dòng)完內(nèi)核之后,要想啟動(dòng)用戶空間首先需要啟動(dòng)init,故init的PID號(hào)永遠(yuǎn)為1。init也是由其父進(jìn)程fork()而來,是內(nèi)核空間中的用來專門引導(dǎo)用戶空間進(jìn)程的機(jī)制。init是一個(gè)應(yīng)用程序,在/sbin/init下,是一個(gè)可執(zhí)行文件。
審核編輯:黃飛
?
評(píng)論