聊了聊宏內核和微內核,並吹了一波 Linux

看這裡!!!//mp.weixin.qq.com/s?__biz=MzI0ODk2NDIyMQ==&mid=2247494048&idx=1&sn=cacfc6a48269418422966b8456e04038&chksm=e99a1cb2deed95a4862f1a086a6b27ef58318e67888785beb9ca16ed2e77e91d836916a8fad7&token=859167462&lang=zh_CN#rd

內核是作業系統非常重要的組成部分,同時也是作業系統的核心。內核管理著系統資源,內核向上連接著應用程式,向下連接著硬體,它是應用程式和硬體的橋樑。

內核可以進一步的劃分,分為宏內核微內核

宏內核和微內核最大的區別就是,宏內核的用戶服務和內核服務都保存在相同的地址空間中,它們都由內核進行統一管理,而微內核的用戶服務和內核服務會保存在不同的地址空間中,下圖可以很好的解釋這一點。

image-20211027222024063

其實這裡的宏內核翻譯過來有點牽強,其實應該叫單內核或者單核。在這種單核的設計中,內核是一個大的整體,可以說是一個大進程,在這個大進程中,所有內核服務都運行在一個地址空間中,函數之間的調用鏈路少,直接通訊簡單高效

而微內核的功能會劃分為獨立的進程,進程之間通過 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 //github.com/crisxuan/bestJavaer ,裡面有非常多的硬核文章,絕對會對你有幫助。