徹底理解操作系統(tǒng)與內(nèi)核的區(qū)別!
通用底盤技術(shù)
Canoo公司有一項(xiàng)核心技術(shù)專利,這就是它們的通用電動底盤技術(shù),長得是這個(gè)樣子,非常像一個(gè)滑板:

這個(gè)帶輪子、有電池、能動的滑板已經(jīng)包含了一輛車最核心的組件,差的就是一個(gè)外殼。這個(gè)看起來像滑板的東西就是所謂的電池系統(tǒng)和底盤一體化技術(shù),Canoo公司在它們的通用底盤上加裝不同的外殼就能制造出不同的車型。

什么是內(nèi)核?
在上面這個(gè)示例中,包含輪子以及電池系統(tǒng)的底盤就好比內(nèi)核,而套上外殼加上椅子以及內(nèi)飾后的整體成品就好比操作系統(tǒng)。內(nèi)核僅僅是操作系統(tǒng)的一部分,是真正與硬件交互的那部分軟件,與硬件交互包括讀寫硬盤、讀寫網(wǎng)盤、讀寫內(nèi)存以及任何連接到系統(tǒng)中的硬件。除了與硬件交互外,內(nèi)核還負(fù)責(zé)分配資源,分配什么資源呢?所謂資源就是硬件,比如CPU時(shí)間、內(nèi)存、IO等等,這些都是資源。

現(xiàn)在我們知道了內(nèi)核負(fù)責(zé)分配資源,那么問題來了,要怎么分配這些資源呢?答案就是以進(jìn)程的形式來分配資源。怎么分配呢?一句話:虛擬大法好。每個(gè)進(jìn)程都認(rèn)為自己在獨(dú)占CPU,這通過CPU時(shí)間片來實(shí)現(xiàn),內(nèi)核讓CPU在各個(gè)進(jìn)程之間快速切換,這樣程序員寫好程序員后直接運(yùn)行即可,即使在單核系統(tǒng)中運(yùn)行成百上千個(gè)進(jìn)程都沒有問題。每個(gè)進(jìn)程都認(rèn)為自己在獨(dú)占內(nèi)存,這通過虛擬內(nèi)存來實(shí)現(xiàn)。有的同學(xué)可能會問,為什么都要虛擬化呢?答案顯而易見,因?yàn)橛?jì)算機(jī)系統(tǒng)內(nèi)的資源是有限的,我們只有幾個(gè)CPU核心、幾個(gè)G的內(nèi)存,但卻要同時(shí)運(yùn)行幾百幾千個(gè)進(jìn)程,除此之外我們別無它法。如果你還知道有其它更高效的方法那么趕緊放下手機(jī),馬上將你的思想寫成論文發(fā)表出來,下一屆的圖靈獎(jiǎng)非你莫屬。

因此,內(nèi)核的職責(zé)就是以進(jìn)程的形式來分配CPU時(shí)間,以虛擬內(nèi)存的形式來分配物理內(nèi)存,以文件的形式來管理IO設(shè)備。
什么是操作系統(tǒng)?
然而只有一個(gè)內(nèi)核實(shí)際上是做不了什么真正有用的事情,就像上面示例中那個(gè)通用底盤一樣,這個(gè)底盤確實(shí)能跑起來,但你沒辦法開著這樣一個(gè)底盤出去浪,因?yàn)檫@個(gè)底盤很難用。因此,你不得不加裝上方向盤、座椅以及車身外殼等,同樣的道理,內(nèi)核是給人用的,為了與內(nèi)核交互,發(fā)明了命令行以及圖形界面GUI。

除了給普通用戶提供使用的接口之外,操作系統(tǒng)還需要給程序員提供編寫程序的接口,當(dāng)我們寫的程序依賴內(nèi)核提供的服務(wù)時(shí)是該怎么辦呢?有的同學(xué)說我們需要依賴內(nèi)核提供的服務(wù)嗎?想一想,進(jìn)行網(wǎng)絡(luò)編程時(shí)你有沒有自己編寫過處理TCP/IP協(xié)議棧數(shù)據(jù)的代碼?你有沒有自己寫代碼從網(wǎng)卡上收發(fā)數(shù)據(jù)?都沒有,實(shí)際上你需要做的僅僅是簡單的調(diào)用一些socket接口就可以了。網(wǎng)絡(luò)編程僅僅是其中的一項(xiàng),其它還包括文件IO、創(chuàng)建進(jìn)程、創(chuàng)建線程等等等等,這些是內(nèi)核提供的,那么我們該怎么使用呢?答案就是通過所謂的系統(tǒng)調(diào)用,system call。通過系統(tǒng)調(diào)用,我們可以像使用普通函數(shù)那樣向操作系統(tǒng)請求服務(wù),當(dāng)然,直接使用系統(tǒng)調(diào)用是非常繁瑣的,因此通常會在這之上提供一層封裝。

在Windows平臺就是給程序員提供編程接口的是Windows API,這層API包羅萬象,不但包括上文提到對系統(tǒng)調(diào)用的封裝,還包括其它功能,像創(chuàng)建帶有圖形界面的應(yīng)用程序等等。但在Linux世界你找不到一種類似Windows API的東西,畢竟Windows是微軟自家產(chǎn)品,什么都可以打包起來,Linux只是一個(gè)開源的內(nèi)核,如果一定要找一個(gè)類似的東西話那就是libc,也就是C標(biāo)準(zhǔn)庫,這里同樣包括了對系統(tǒng)調(diào)用的封裝以及一些庫函數(shù),但libc不包含創(chuàng)建帶有圖形界面應(yīng)用程序的功能。現(xiàn)在我們知道了,操作系統(tǒng)需要提供兩種接口:
給用戶提供操作接口。
給程序員提供編程接口。
這些就是好比汽車的外殼,我們(用戶和程序員)看得見摸得著,外殼加上底盤——也就是內(nèi)核,才是功能完善的操作系統(tǒng)。

【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【749907784】整理了一些個(gè)人覺得比較好的學(xué)習(xí)書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦?。。。ê曨l教程、電子書、實(shí)戰(zhàn)項(xiàng)目及代碼)? ?


零聲白金VIP體驗(yàn)卡(含基礎(chǔ)架構(gòu)/高性能存儲/golang/QT/音視頻/Linux內(nèi)核)課程:

各種各樣的操作系統(tǒng)
實(shí)際上我們熟悉的Linux只是內(nèi)核而不能稱得上是操作系統(tǒng),Ubuntu則可以認(rèn)為是操作系統(tǒng),其內(nèi)核是Linux;RedHat也是操作系統(tǒng),其內(nèi)核同樣是Linux;我們可以看到,盡管Ubuntu和RedHat是不同的操作系統(tǒng),但其內(nèi)核可以是相同的。這就好比它們可以基于同樣的底盤打造出不同的車型。而我們熟悉的Windows也是操作系統(tǒng),其內(nèi)核是Windows NT內(nèi)核。
總結(jié)
內(nèi)核就像本文開頭提到的電動底盤,包含了一個(gè)汽車的最核心元素;但這樣一個(gè)底盤并沒有什么實(shí)際用處,當(dāng)搭配上外殼以及座椅后才是一輛真正有用的車,這就好比操作系統(tǒng)。值得注意的是,不同的操作系統(tǒng)可以有相同的內(nèi)核。當(dāng)我們在使用方便的智能手機(jī)以及個(gè)人PC時(shí)不應(yīng)忘記,正是操作系統(tǒng)在背后的默默工作讓一堆硬件電路變得這么好用。希望這篇文章對大家理解操作系統(tǒng)以及內(nèi)核有所幫助
原文作者:碼農(nóng)的荒島求生
