微內核和單內核

全部的Unix內核都同宗同源,而且提供相同的API,現代的Unix內核存在許多設計上的類似之處。Unix內核幾乎毫無例外的都是一個不可分割的靜態可執行塊(文件)。也就是說,它們必須以完整、單獨的可執行塊的形式在一個單獨的地址空間中運行。 單內核與微內核設計之比較 操做系統內核能夠分爲兩大設計陣營:單內核和微內核(第三陣營外內核,主要用在科研系統中,但也逐漸在現實世界中壯大起來)。 單內核是兩大陣營中一種較爲簡單的設計,在1980年以前,全部的內核都設計成單內核。所謂單內核就是把它從總體上做爲一個單獨的大過程來實現,並同時運 行在一個單獨的地址空間。所以,這樣的內核一般以單個靜態二進制文件的形式存放於磁盤。全部內核服務都在這樣的一個大內核空間中運行。內核之間的通訊是微 不足道的,由於你們都運行在內核態,並身處同一地址空間:內核能夠直接調用函數,這與用戶空間沒有什麼區別。這種模式的支持者認爲單模塊具備簡單和高性能 的特色。大多數Unix系統都設計爲單模塊。 另外一方面,微內核並不做爲一個單獨的大過程來實現。相反,微內核的功能被劃分爲獨立的過程,每一個過程叫作一個服務器。理想狀況下,只有強烈請求特權服務的 服務器才運行在特權模式下,其餘服務器都運行在用戶空間。不過,全部的服務器都保持獨立並運行在各自的地址空間。所以,就不可能像單模塊內核那樣直接調用 函數,而是經過消息傳遞處理微內核通訊:系統採用了進程間通訊(IPC)機制,所以,各類服務器之間經過IPC機制互通消息,互換「服務」。服務器的各自 獨立有效地避免了一個服務器的失效禍及另外一個。 一樣,模塊化的系統容許一個服務器爲了另外一個服務器而換出。由於IPC機制的開銷比函數調用多,又由於會涉及內核空間到用戶空間的上下文切換,所以,消息 傳遞須要必定的週期,而單內核中簡單的函數調用沒有這些開銷。基於此,付之於實際的微內核系統讓大部分或所有服務器位於內核,這樣,就能夠直接調用函數, 消除頻繁的上下文切換。Windows NT內核和Mach(Mac OS X的組成部分)是微內核的典型實例。不論是Windows NT仍是Mac OS X,都在其新近版本中不讓任何微內核服務器運行在用戶空間,這違背了微內核設計的初衷。 Linux是一個單內核,也就是說,Linux內核運行在單獨的內核地址空間。不過,Linux汲取了微內核的精華:其引覺得豪的是模塊化設計、搶佔式內 核、支持內核線程以及動態裝載內核模塊的能力。不只如此,Linux還避其微內核設計上性能損失的缺陷,讓全部事情都運行在內核態,直接調用函數,無需消 息傳遞。至今,Linux是模塊化的、多線程的以及內核自己可調度的操做系統。實用主義再次佔了上風。 當Linus和其餘內核開發者設計Linux內核時,他們並無徹底完全地與Unix訣別。他們充分地認識到,不能忽視Unix的底蘊(特別是Unix的 API)。而因爲Linux並無基於某種特定的Unix,Linus和他的夥伴們對每一個特定的問題均可以選擇已知最理想的解決方案—在有些時候,固然也 能夠創造一些新的方案。如下是對Linux內核與Unix各類變體的內核特色所做的分析比較: ·Linux支持動態加載內核模塊。儘管Linux內核也是單內核,但是容許在須要的時候動態地卸除和加載部份內核代碼。 ·Linux支持對稱多處理(SMP)機制,儘管許多Unix的變體也支持SMP,但傳統的Unix並不支持這種機制。 ·Linux內核能夠搶佔(preemptive)。與傳統的Unix不一樣,Linux內核具備容許在內核運行的任務優先執行的能力。在其餘各類Unix產品中,只有Solaris和IRIX支持搶佔,可是大多數傳統的Unix內核不支持搶佔。 ·Linux對線程支持的實現比較有意思:內核並不區分線程和其餘的通常進程。對於內核來講,全部的進程都同樣—只不過其中的一些共享資源而已。 ·Linux提供具備設備類的面向對象的設備模型、熱插拔事件,以及用戶空間的設備文件系統(sysfs)。 ·Linux忽略了一些被認爲是設計得很拙劣的Unix特性,像STREAMS,它還忽略了那些實際上已經根本不會使用的過期標準。 ·Linux體現了自由這個詞的精髓。現有的Linux特性集就是Linux公開開發模型自由發展的結果。若是一個特性沒有任何價值或者創意不好,沒有任 何人會被迫去實現它。相反的,在Linux的發展過程當中已經造成了一種值得稱讚的務實態度:任何改變都要針對現實中確實存在的問題,通過完善的設計並有正 確簡潔的實現。因而,許多其餘現代Unix系統包含的特性,如內核換頁機制,都被絕不遲疑的引入進來。服務器

相關文章
相關標籤/搜索