阿里面試官:說說操做系統微內核和Dubbo微內核?

微信搜 「yes的練級攻略」乾貨滿滿,否則來掐我,回覆【123】一份20W字的算法刷題筆記等你來領。 我的文章彙總:[https://github.com/yessimida/yes](https://github.com/yessimida/yes) 歡迎 star !java

你好,我是 yes。git

在以前的文章已經提到了 RPC 的核心,想必一個 RPC 通訊大體的流程和基本原理已經清晰了。github

這篇文章藉着 Dubbo 來講說微內核這種設計思想,不會扯到 Dubbo 某個具體細節實現上,和 Dubbo 強相關的內容會在以後的文章寫到。算法

因此今天的重點在微內核,而這個概念我最先是從操做系統那裏得知,不過操做系統的微內核和 Dubbo 相關的微內核又不太同樣。chrome

Dubbo 的微內核廣義上的微內核,而操做系統只是針對內核實現。安全

這麼說你確定不清楚,別急,聽我慢慢道來。微信

咱們先看看操做系統的微內核。網絡

操做系統中的微內核

在維基百科上搜索微內核出現的就是:架構

在計算機科學中,微內核(英語:Microkernel,μ-kernel),是一種內核的設計架構,由儘量精簡的程序所組成,以實現一個操做系統所須要的最基本功能,包括了底層的尋址空間管理、線程管理、與進程間通訊。負載均衡

這個詞條歸類在操做系統技術下,因此這裏的微內核指的就是操做系統的內核設計,與之對應的是宏內核架構。

Linux 就是宏內核架構。

操做系統咱們都知道它是一箇中間層,爲咱們管理底層的硬件資源,爲上層服務提供接口。

提供進程管理、內存管理、文件系統、進程通訊等功能。

像 Linux 這樣的宏內核設計是把這些功能都做爲內核來實現,而微內核則僅保留最基礎的功能。

好比就留下進程的管理、內存管理等,把文件管理等功能剝離出去,變成用戶空間的獨立進程來提供服務。

來看下這個維基百科上的這個圖應該就很清晰了。

宏內核中的一些功能在微內核架構上都被獨立到用戶態中,這樣內核代碼量就少了。

代碼少了潛在的 bug 就少,出了問題也更容易排查。

系統也就更加穩定,不易奔潰,由於那些服務從內核中移除,在用戶空間運行着,若是出了故障,內核重啓這個服務就行了,不會像以前那樣整個內核 GG。

拿顯卡驅動來講,出問題就藍屏,這要是微內核設計就能夠重啓顯卡驅動。

聽起來好像微內核很好啊?並非,接下來就說說微內核的缺點。

首先是性能問題。

由於不少功能做爲獨立進程放到用戶空間運行了,因此宏內核時的函數調用就變成了進程間調用,涉及進程間的通訊,還會伴隨着內核態和用戶態的來回切換,咱們知道這種上下文切換時比較耗時的。

這性能的問題就有點大了。

而後微內核設計沒那麼簡單,想要靈巧、減小耦合、提升可移植性就須要好好的設計,按照林納斯的話來講:「若是 GNU 內核(微內核架構)早在去年春天完成了,我壓根不會開始個人項目(Lniux)。」

GNU Hurd 採用微內核架構,設計過於精巧,研發速度緩慢,性能長期沒法提高。

當年林納斯還和 Minix 的做者安德魯,對操做系統的宏內核和微內核的好壞進行了一波網絡口水戰。

咱們來回顧一下那段歷史,挺有意思的。

由於 AT&T 把 Unix 商業化了,大學不能無償使用 Unix,身爲大學教授的安德魯爲了教學本身搞了個操做系統,即 Minix。

安德魯

當時的學術風潮是微內核架構,把核心功能模塊化,劃分爲幾個獨立的進程,運行在不一樣的地址空間提升了代碼的可移植和系統的安全性。

因此 Minix 就是按微內核架構編寫的,固然還有上述提到的 GNU Hurd。

而林納斯那時候讀大學,他祖父送了他一臺 Intel 80386,林納斯也看到了安德魯的教科書,根據書上的內容寫出了 Linux。

林納斯

不過沒有按照微內核的設計,而是跟 Unix 同樣採用了宏內核架構。

安德魯教授看到了 Linux ,而後在 comp.os.Minix 上批評道:宏內核的設計是有害的。

Linux 內核耦合度過高,徹底是爲了 Intel 80386 而設計的,處理器架構進化很快的,操做系統應該都具有可移植性。

安德魯還提到:都1991年了還用宏內核來設計操做系統,這是一種巨大的退步。

林納斯在一天以後進行了反擊,他說 Minix 設計上有缺陷,從哲學和美學角度來看微內核確實好,可是你看 GUN Hurd 到如今還沒開發出來。

而後操做系統原本就依靠硬件的特性,因此內核自己不須要過分具有可移植性,應用程序的可移植性才重要,Linux 比 Minix 好移植多了。

並且 Linux 原本就是爲我本身作的,因此契合 80386,若是要移植到別的平臺,代碼都是開源的(Minix 源碼當時得買),想要的人本身作咯。

安德魯也作了一波迴應:Minix 有侷限性是由於我是教授,由於大部分學生都只能在低配的機器上使用,因此係統的硬件需求得足夠低,雖然你 Linux 是免費的,可是須要的硬件貴呀。

其實能夠看到,二者並無對宏內核和微內核的技術細節的進行深刻探討,而是抓住對方的:你這 Minix 代碼還要收費,你這 Linux 須要的硬件這麼貴來進行「攻擊」,因此稱之爲口水戰。

反正口水戰以後雙方都沒有改變各自的設計,不過林納斯有引進微內核的思想來改進代碼,也改善了可移植性。

微內核市面上設計成功的有 QNX,黑莓手機就是用這個操做系統,車用市場也幾乎都用 QNX 系統。

黑莓手機

這手機不少年前我用過,當時以爲有點東西的。

宏內核的話就提個 Linux ,足夠了。

兩個架構都有成功的產品,因此仍是取捨的問題,也沒有誰徹底壓着誰。

再具體的就不深刻了,今天的主角實際上是廣義上的微內核。

Dubbo 中的微內核

Dubbo 的微內核是廣義上的,它的思想是:核心系統+插件。

這個微內核說白了就是把不變的功能抽象出來稱爲核心,把變更的功能做爲插件來擴展,符合開閉原則,更容易擴展、維護。

小霸王遊戲機你們都應該玩過,就長這樣的,它的設計就能夠認爲是個微內核設計。

機體自己做爲核心系統,遊戲片就是插件。

咱們想玩哪一個遊戲就插哪一個遊戲片,簡單便捷,不影響機體自己。

假設不把遊戲片抽象成插件式,那是否是就難搞了?換個遊戲就成爲難題了。

因此微內核架構的本質就是將變化的部分抽象成插件,使得能夠快速簡便地知足各類需求又不影響總體的穩定性。

這就是微內核架構的精髓。

這裏再扣個細節,較個真(就是我我的的一點想法)。

Mark Richards 在 《Software Architecture Patterns》的微內核章節裏面提到

The core system of the microkernel architecture pattern traditionally contains only the minimal functionality required to make the system operational.

從字面意義來看,Mark 認爲核心系統指的是能夠獨立運行且提供基本功能的最小模塊。

例如 vscode、idea、chrome 等設計就符合 Mark 認爲的核心設計,核心系統提供基礎必備的功能,能夠獨立運行。

像 vscode 核心就是編輯器,沒有插件也能夠獨立運行,而後又有豐富的插件,來知足一些特殊需求,擴展核心系統的功能。

這裏可能會讓人產生誤導,認爲核心必須是能讓系統運行的最小功能模塊。

我認爲核心不必定須要獨立運行且提供基礎功能,能讓系統運行的最小組織模塊也是核心。

兩個說法的差異在於:只有核心的話系統可否正常的運行。

vscode 沒有插件照樣能運行,能提供基本功能,而小霸王遊戲機沒有遊戲片那運行個寂寞,玩個球。

可是小霸王這種難道就不算微內核了嘛?

就我我的而言,把變與不變區分出來,把變化封裝成插件就稱爲微內核設計。

像 Dubbo 能支持不少協議、各類負載均衡的擴展、集羣的擴展等等,它自身的一些功能也是經過擴展點實現的,沒有插件也跑不了。

這樣的內核就像膠水,把各個插件結合起來最終提供服務,沒有插件這個系統就沒什麼意義。

因此我認爲核心系統不必定須要能獨立運行,能讓系統運行的最小組織模塊也是核心。。

所以我以爲 Mark 說的不太準確,容易產生誤導。

固然這是文字上面的摳細節,核心概念都是一致的:抽象出核心,剝離變化爲插件。

微內核設計的好處

這裏的微內核指的是廣義的微內核。

做爲一個框架或者軟件,擴展性很是的重要。

由於一個框架、一個軟件的使用者千千萬,不一樣的人有不一樣的需求。

身爲框架的維護者、軟件的開發者你有精力和能力知足全部用戶的需求?

作夢,不存在的。

有些 idea 你想都想不到。

好比我以前看到的 vscode 裏面有個「坤坤鼓勵師」插件,默認你代碼寫一小時以後蔡徐坤來給你跳雞你太美,讓你休息休息......

來感覺一下?

因此作一個框架或者軟件,想要讓更多人使用,不只自身提供的功能要全、性能要好、使用要簡單,讓用戶 DIY,作各類定製化也很是的關鍵!

Dubbo 的成功其實就離不開它的微內核設計,定製化開發在不少場景都要用到,畢竟都得稍加改造一番來知足本身公司的一些特殊需求。

固然也不是什麼都要微內核

微內核看起來是很方便,可是設計起來就不方便了。

須要精心的設計,抽象出各類擴展點。

除了自己的功能還須要管理插件的生命週期、插件如何鏈接、如何通訊等。

有些還須要作沙箱隔離,防止插件污染整個系統等等,原本的內部函數調用變成了插件間的通訊,反正設計起來是複雜了。

通常微內核適合用在框架的設計上,或者一些規則引擎的設計,只有複雜的會有不少變化的需求場景才須要用到微內核。

像通常簡單的項目,原本就一條直道走到底的那種就算了,不要瞎操做,等下秀折了腿。

最後

微內核其實就是一種架構思想,能夠是框架層面的,也能夠細化到某個模塊的設計。

歸根結底就是把變化封裝成插件,可插拔,擁抱變化。

固然今天也提到了操做系統的微內核,這個和廣義上的微內核仍是不太同樣的。

至於 Dubbo 的微內核就離不開它的 SPI,以後文章會深刻寫一波,等我哈。

歡迎關注個人公衆號【yes的練級攻略】,更多硬核文章等你來讀。

  更多文章可看個人文章彙總:https://github.com/yessimida/yes 歡迎 star !


我是 yes,從一點點到億點點,歡迎在看、轉發、留言,咱們下篇見。

巨人的肩膀

https://en.wikipedia.org/wiki/Microkernel

https://en.wikipedia.org/wiki/Tanenbaum%E2%80%93Torvalds_debate

《Software Architecture Patterns》

推薦閱讀

RPC 核心,萬變不離其宗

今年我讀了四個開源項目的源碼,來分享下心得

本文分享自微信公衆號 - yes的練級攻略(yes_java)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索