聊了聊單核心和微核心,並吹了一波 Linux

程式設計師cxuan發表於2021-11-02

看這裡!!!https://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 https://github.com/crisxuan/bestJavaer ,裡面有非常多的硬核文章,絕對會對你有幫助。

相關文章