內核是操作系統非常重要的組成部分,同時也是操作系統的核心。內核管理着系統資源,內核向上連接着應用程序,向下連接着硬件,它是應用程序和硬件的橋梁。
內核可以進一步的划分,分為宏內核和微內核。
宏內核和微內核最大的區別就是,宏內核的用戶服務和內核服務都保存在相同的地址空間中,它們都由內核進行統一管理,而微內核的用戶服務和內核服務會保存在不同的地址空間中,下圖可以很好的解釋這一點。
其實這里的宏內核翻譯過來有點牽強,其實應該叫單內核或者單核。在這種單核的設計中,內核是一個大的整體,可以說是一個大進程,在這個大進程中,所有內核服務都運行在一個地址空間中,函數之間的調用鏈路少,直接通信簡單高效。
而微內核的功能會划分為獨立的進程,進程之間通過 IPC 進行通信,高度模塊化,一個服務的故障不會影響另一個服務。不過由於模塊化的影響,函數之間調用鏈路偏長,進程之間不會直接通信,而是通過內核服務相互通信。
從內核大小上面來講,微內核的尺寸更小,只包含用戶進程相關的服務,而單核的尺寸要比微內核大的多,這點比較好理解,因為宏內核融入了太多服務和驅動。
從執行效率上來說,微內核的執行效率相對較慢,因為涉及到跨模塊調用,而宏內核執行效率高,因為函數之間會直接調用。
在微內核模塊化之后,它很容易擴展,因為內核空間與用戶空間相互隔離,在用戶態下(運行在用戶空間中的應用程序)應用程序崩潰后一般不會影響到內核中的數據。宏內核的可拓展性較差。
經過上面這些描述之后,我們很容易把宏內核和微內核的特征想象成軟件開發中的單體架構和微服務架構。
單體架構最大的特點就是函數調用方便,幾乎不存在調用鏈路,一個項目解決所有問題,項目中包含數據庫驅動、各種攔截器、控制器、權限控制,可拓展性非常差。
而微服務的架構之間的調用鏈路會比較長,模塊之間的職責分離並且相互依賴,比如權限控制模塊、路由模塊、總線通信模塊。可拓展性比較強。
這兩種不同的內核結構有不同的支持者,就和有些人認為單體架構好,有些人認為微服務架構模式好。
這就像對編程語言的爭論一樣,你說 Python 、Go、Java 以及其他語言哪個好?管他哪個好,最終都會戲謔的稱 PHP 是這個世界上最好的語言。所以,這些爭論本沒有意義,但是很有趣的是,這種爭論常常讓人想起前幾年在 CPU 領域中 RISC 和 CISC 之間的斗爭。
現代成功的 CPU 設計包括這兩種技術中的任何一種,就像 Linux 內核是微內核和宏內核的混合產品一樣。可能有些人認為 Linux 它不就是個宏內核結構么,但實際上 Linux 不單單只是一個純碎的集成內核。
為什么 Linux 會使用單內核(此處叫單內核有點應景)結構呢?我猜有下面幾個因素。
從 Linus 的角度來看,單內核的開發和選型更容易,因為避免了與消息傳遞架構、計算模塊加載方法等相關的工作。而且 Linux 的誕生原因在於 Linus 對 MINIX(一種類 UNIX 操作系統)只允許在教育上使用很不滿,再加上 Linus 本來對操作系統很感興趣,於是他開始編寫 Linux 操作系統,所以我認為當時的 Linus 開發 Linux 起源於興趣,並未經過詳細周到的設計,也並未考慮它的可拓展性。當然這只是鄙人粗淺的猜測。
這就和我們上大學的畢業設計一樣,你畢業設計做的系統,你會考慮可拓展性嗎?除非你想當產品來做,但是何必呢?
另一個原因是充足的開發時間。Linux 沒有研發時間限制,也沒有發布時間表。任何限制都只能單獨修改和擴展內核。核心的單一設計內部完全模塊化,在這種情況下修改或添加不是很困難。問題是沒有必要為了追求未經證實的可維護性的小幅增加而重寫 Linux 內核。Linus 一再強調以下觀點:為了這個好處而損失速度是不值得的。
Linux 是一個借鑒了微內核精髓的宏內核結構,Linux 支持模塊化的設計、搶占式內核、對內核線程的支持以及動態加載內核模塊的能力。不僅如此,Linux 還避免了其微內核設計的性能損失,允許一切運行在內核模式下,直接調用函數,無需消息傳遞。
所以綜合一點來講,Linux 是一個模塊化、多線程和內核可調度的操作系統。
模塊化的設計:Linux 支持內核模塊的動態加載,盡管 Linux 內核也是單核,但它允許在需要時動態刪除和加載一些內核代碼。
可搶占性:Linux 內核支持可搶占,與傳統的 UNIX 不同,Linux 內核具有允許內核中運行的任務優先執行的能力。在各種 UNIX 產品中,只有 Solaris 和 IRIX 支持搶占,但大多數傳統 UNIX 內核不支持搶占。
在 Linux 身上,完美體現了務實性。如果一項功能沒有價值或創意不佳,則不會開始實施。相反,在 Linux 的發展過程中,形成了一種值得稱道的務實態度:任何改變都必須針對現實中實際存在的問題,需要經過完整的設計和正確簡潔的實現。
如果 Linux 是純微內核設計,那么移植到其他架構會更容易。實際情況是,Linux 內核移植雖然不是很簡單,但也絕非不可能完成的事情。
最后,給大家推薦一下我自己的Github,里面有非常多的硬核文章,絕對會對你有幫助。