【軟件】微內核與宏內核

歡迎關注我的專欄( つ•̀ω•́)つ【人工智能通識】


核心模式與用戶模式(Kernel Mode & User Mode)

我們都知道一臺計算機或者手機都要有個操作系統(Operating System簡稱OS),最常用的操作系統就是手機上的安卓(Android)和電腦上的Windows,其次還有蘋果手機上的iOS和蘋果筆記本上的macOS,也許你還聽說過另外的操作系統比如Unix、Linux、Ubuntu等等。總之,這些都是操作系統。

買一個硬件設備(電腦、筆記本或者手機),首先上面一般都已經安裝了操作系統,然後我們可以在操作系統的基礎上再安裝各種各樣的軟件程序或APP。硬件\to操作系統\to軟件程序,這就像磚頭一層一層累加起來。

操作系統本身也是代碼編寫出來的,所以也是軟件。從這裏我們就可以看出來,同樣都是軟件,操作系統可以直接控制硬件,而應用程序不能直接控制硬件,必須要通過操作系統來間接使用硬件資源。

內核(kernel)就是操作系統的最主要代碼,我們也可以簡單的認爲Kernel(內核)就是指操作系統。

所有的軟件代碼,無論操作系統還是應用程序,本質是都是由中央處理器芯片(CPU)來運行的,但如果你安裝的APP代碼裏面有病毒怎麼辦?CPU運行這些有問題的代碼就會遇到困難,甚至會死機。

幾乎每個程序員都能開發應用程序APP,全世界的APP數不勝數,也就沒辦法嚴格控制以確保APP代碼不會導致死機。

但是操作系統就少很多,而且都是比較大型公司編寫的,也經過了很多的嚴格測試,相對而言就比較可控。

所以,計算機的CPU規定,“我只信賴操作系統的代碼,不信賴應用程序的代碼。如果應用程序代碼雲小時候遇到問題,操作系統你可以停止它。”

於是,遵照CPU的規則,Kernel核心代碼就運行在最高權限的核心模式下(Kernel mode),而應用程序代碼就只能運行在權限比較低的用戶模式下(User mode)。

Kernel mode是具有最高權限的模式,也叫做管理員模式(Supervisor mode)。

內核的作用

內核有什麼作用?或者我們說操作系統提供什麼功能,起什麼作用?

首先,要直接控制CPU和內存,我們暫且稱爲關鍵功能。

我們都知道計算機可以同時運行很多軟件做很多事,這叫做多進程(Multi-process)或者多任務(Multi-tasking),那麼操作系統就要能夠實現多個任務的管理和安排,還要負責多個任務之間的協作通信。一般的,主要包含:

  • Virtual memory,將內存虛擬化以供應用程序使用。
  • Task Schedules,任務排程。
  • IPC,Inter-process communication,進程間通信。

其次,要實現基本的功能服務,我們暫且稱爲服務功能。

應用程序可以調用這些服務來實現各種功能,比較基礎的操作系統服務有:

  • File System,文件系統,保存和讀取文件。
  • Network,網絡服務,讓應用程序可以聯網。
  • Graphic,圖形服務,提供屏幕上顯示圖形的能力。
  • GUI,界面服務,提供界面工具按鈕顯示。

當然還有很多其他的,這裏就不一一列舉了。

另外,要能夠支援更多硬件設備,我們暫且稱爲設備驅動。

比如增加了一個攝像頭,一個光線傳感器,操作系統要確保這些設備能夠被應用程序使用起來才行。其實就是要對各種硬件的驅動進行管理,就是Device driver設備啓動服務。

微內核與宏內核 Microkernel & Monolithic Kernel

宏內核也叫大內核。宏內核與微內核的區別其實就是大內核與小內核的區別。

怎麼劃分?

Microkernel微內核只包含關鍵功能Virtual memory、Task Schedules和IPC,遵循“能多小就要多小”的設計原則。

Monolithic kernel則包含上面介紹的操作系統需要的全部功能。

其實,無論微內核系統或者宏內核系統,它們差不多都要提供那麼多的功能,誰也少不了太多。所以兩者看似是大小的區別或者是kernel代碼的區別,但本質上卻是把哪些功能放在了kernel mode,把哪些功能放在user mode的區別。

從維基百科給出的這張圖上明顯可以看出兩者的區別。

優劣對比

如果從歷史發展和現狀來對比,幾十年操作系統的發展結果早已清晰表明:宏內核獲得了絕對性的勝利。

因爲當前我們使用的主流操作系統,包括Windows、Android、iOS、macOS、Linux等等,都是宏內核操作系統或者說都是基於宏內核架構創建起來的。

但是我們也應該注意到以下幾點:

  • 微內核也起源非常之早,可以追溯到1970年前後,一直以來是和宏內核同步發展的。
  • 目前的主流操作系統早已經不是當年純粹的宏內核架構了,而是廣泛吸取微內核架構的優點而後揉合而成的混合內核Hybrid kernel。
  • 當今宏內核架構遇到了越來越多的困難和挑戰,而微內核的優勢似乎越來越明顯,尤其是谷歌下一代操作系統Fuchsia['fjuʃə] 還是華爲未來的鴻蒙OS,都瞄準了微內核架構。

微內核爲什麼半個世紀沒有獲得成功?
這裏有很多原因,這裏只是其中可能的幾條:

  • 性能問題。Kernel mode和User mode之間的切換更加耗時,比起把各種功能都打包在一起的宏內核,微內核需要太多的切換,這直接導致性能底下。當然現在無論是算法改進還是CPU支持都有了很大的進步,基本上可以說現在已經不是大問題了。
  • 極致原則。微內核一直努力遵循“內核應該極小化”的原則(minimality),這讓很多微內核研究者和開發者收到了束縛,在時代允許的硬件環境下難以對性能進行有效優化。
  • 缺乏大企業支持。當然這也和微內核當初性能不佳有關。

那麼微內核的優勢在哪裏?

  • 易於維護和升級。把衆多的服務功能和設備驅動從內核代碼中分離出來,如果只需要對某些功能進行改進,這樣無論是改代碼還是增加新功能,都不用去變動原來的核心代碼,當然效率高。
  • 系統更加穩定。只要微內核的關鍵功能代碼不出問題,系統就不會崩潰。比如說如果文件服務代碼運行時候出了問題,宏內核因爲文件服務代碼是放在kernel mode的,直接就係統崩潰藍屏了。而微內核的文件服務代碼是放在user mode的,只要運行在kernel mode的代碼直接把文件服務功能強行停止然後重啓就可以繼續使用了,系統不會藍屏。
  • 系統更加安全。微內核除了把額外的功能劃出kernel mode之外,還改變了任務之間的權限管理模式,它並不能像宏內核那樣直接給用戶安裝的APP授權訪問關鍵功能和各種服務、驅動,而是依賴於不斷的傳遞帶有授權信息的handle對象來實現授權,這雖然很繁瑣,但安全性無疑要比宏內核高很多。
  • 系統更加可定製。宏內核把所有驅動和服務都打包在內核裏難以拆分,如果需要開發一個不需要網絡功能服務的操作系統就比較麻煩了。而微內核中各種服務都是單獨的,直接去掉很容易。這對當前越來越多樣化的小型智能硬件操作系統的開發非常有用。
  • 分佈式計算。因爲微內核把各種服務和驅動都單獨開來,這就允許讓各種系統服務運行在不同的芯片、不同電腦上面,讓很多臺計算機一起來運行同一個操作系統,這對分佈式計算和雲計算提供了更多可能。

在windows2000之前,比如windows98或者windowsMe,文件服務、網絡服務等等這些功能都是打包放在kernel mode中運行的,只要其中一個服務出問題就直接藍屏。後來Window把很多服務功能都從核心中移出來,所以Windows7之後藍屏就明顯少了很多。

更多內容

蘋果的操作系統是不是微內核?

不是。Mac OS X是基於NeXT公司1985年至1999年開發的NeXTSTEP系統開發的,NeXTSTEP是基於Mach的,雖然Mach一般認爲是微內核架構,但NeXTSTEP的核心是基於自研XNU的Darwin系統,這是一種Hybrid kernel混合內核架構,它揉合了Mach和自研的設備驅動、輸入輸出等模塊,即使只說這個Mach,也是卡內基梅隆大學基於BSD研發的包含了文件系統的宏內核版本。
所以說,當今蘋果的iOS、macOS等操作系統都是起源於混合內核架構,不是微內核,也不是純粹的宏內核。

Exokernel外核

外核更小,比微內核還要小。外核的目標是讓應用程序獲得最多的控制硬件的自由,就是讓開發者對硬件控制更深,以便於開發出性能更好的應用程序。

在外內核的基礎之上,應用程序Program和庫文件Lib一起直接實現應用程序+操作系統的功能,稱之爲庫LibOS,它直接以最高權限運行,不存在kernel mode和user mode的區別,也去除了所有的冗餘,體積小,性能強。

如果我們把應用程序program和庫lib再深一步聯合打包成操作系統,那麼它甚至可以脫離外核而直接運行在物理硬件設備上,或者通過hypervisor超級管理員程序來激活運行,那麼這樣的系統我們叫做Unikernel。

可載入核心模塊Loadable kernel module

爲了減輕kernel內容,很多宏內核操作系統(windows、安卓等)直接把某些功能服務移到核心外面,只在需要使用的時候再加載進來,這些模塊就稱作可載入核心模塊。
當前大部分類Unix操作系統(Unix-like)和微軟操作系統都支持可載入核心模塊。

保護環Protection ring

這裏是指計算機CPU芯片在運行代碼時候的權限控制機制。kernel核心代碼運行在最高權限,Applications應用程序代碼運行在最低權限。

BSD操作系統 Berkeley Software Distribution

由伯克利大學研發和管理的一個基於Unix的系統,開始於大約1970年代。蘋果操作系統都起源於BSD系統,微軟也借用了BSD部分代碼。

Unix操作系統

1970年代,AT&T公司的貝爾實驗室Bell lib研發的一款多任務、多用戶操作系統。可以說是鼻祖級別的操作系統,數十年派生出了數十種操作系統,包含Linux、Android等。
雖然蘋果操作系統也是派生自Unix,但是也源於喬布斯1985年離開蘋果創辦的NeXT公司的操作系統,而NeXT操作系統Darwin的最核心部分是基於BSD改進的XNU,有趣的是XNU的意思是X is Not Unix。

Hypervisor超級管理員

這是運行在CPU上權限最高程序,相對於操作系統上最高權限的管理員Supervisor來說,Hypervisor更加厲害,它比操作系統級別還高,甚至用來啓動操作系統。

比較雜亂,有待整理


歡迎關注我的專欄( つ•̀ω•́)つ【人工智能通識】


每個人的智能新時代

如果您發現文章錯誤,請不吝留言指正;
如果您覺得有用,請點喜歡;
如果您覺得很有用,歡迎轉載~


END

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章