天天看點

第1章Linux核心簡介之Linux核心和Unix核心的比較

1.4 Linux核心和傳統Unix核心的比較

        由于所有的Unix核心都同宗同源,并且提供相同的API,現代的Unix核心存在許多設計上的相似之處。Unix核心幾乎毫無例外的都是一個不可分割的靜态可執行庫。也就是說,Unix必須以巨大的、單獨的可執行塊的形式在一個單獨的位址空間中運作。Unix核心通常需要硬體系統提供頁機制MMU以管理記憶體。這種頁機制可以加強對記憶體空間的保護,并保證每個程序都可以運作在不同的虛拟位址空間。早期的Linux系統也需要MMU支援,但有一些特殊版本并不依賴于此。這是一個簡潔的設計,因為它可以使Linux系統運作在沒有MMU的小型嵌入式系統上。現實之中,很簡單的嵌入式系統都開始具備記憶體管理單元這種進階功能了。

單核心與微核心設計之比較

        作業系統核心分為兩大陣營:單核心和微核心。

        單核心是簡單的設計,在1980年之前,所有的核心都設計成單核心。所謂單核心就是把它從整體上作為一個單獨的大過程來實作,同時也運作在一個單獨的位址空間上。這樣的核心通常以單個靜态二進制檔案的形式存放在磁盤中。所有核心服務都在這樣一個大核心位址空間上運作。核心之間的通信是微不足道的,因為大家都運作在核心态,并處在同一位址空間:核心可以直接調用函數,這與使用者空間應用程式沒有什麼差別。這種模式的支援者認為單子產品具有簡單和性能高的特點。大多數Unix系統都設計為單子產品。

        微核心并不作為一個單獨的大過程來實作。相反,微核心的功能被劃分為多個獨立的過程,每個過程叫做一個伺服器。理想情況下,隻有請求特權服務的伺服器才運作在特權模式下,其它伺服器都運作在使用者空間。所有的伺服器都保持獨立并運作在各自的位址空間上。是以,就不可能像單子產品核心那樣直接調用函數,而是通過消息傳遞處理微核心通信:系統采用程序間通信機制IPC,是以,各個伺服器之間通過IPC機制互通消息,互換服務。伺服器的各自獨立避免了一個伺服器的失效禍及到另一個。子產品化的系統允許一個伺服器為了另一個伺服器而換出。

        因為IPC機制的開銷多于函數調用,又因為會涉及到核心空間與使用者空間的上下文切換,消息傳遞需要一定的周期,而單核心中簡單的函數調用沒有這些開銷。結果,基于微核心的系統都讓大部分或全部伺服器位于核心,這樣就可以直接調用函數,消除頻繁的上下文切換。

        Linux是一個單核心,Linux核心運作在單獨的核心位址空間上。Linux吸取微核心的精華:引以為豪的是子產品化設計、搶占式核心、支援核心線程以及動态裝載核心子產品的能力。Linux還避其微核心設計上性能損失的缺陷,讓所有事情都運作在核心态,直接調用函數,無須消息傳遞。Linux是子產品化的、多線程的以及核心本身可調動的作業系統。

        Linus和其他核心開發者設計Linux核心時,并沒有完全徹底地與Unix訣别。認識到,不能忽視Unix的底蘊(特别是Unix的API)。由于Linux并沒有基于某種特定的Unix,Linus和其他開發者對每個特定的問題都可以選擇已知最理想的解決方案,在有時,也可以創造一些新的方案。Linux核心與傳統的Unix系統之間存在一些差異:

        Linux支援動态加載核心子產品。盡管Linux核心也是單核心,可是允許在需要時動态地解除安裝和加載部分核心代碼。

        Linux支援對稱多處理器機制,盡管許多Unix的變體也支援SMP,單傳統的Unix并不支援SMP機制。

        Linux核心可以搶占。與傳統的Unix變體不同,Linux核心具有允許在核心運作的任務優先執行的能力。在其他各種Unix産品中,隻有Solaris和IRIX支援搶占,但是大多數Unix核心不支援搶占。

        Linux核心并不區分線程和其他的一般程序。對核心來說,所有的程序都一樣-隻不過是其中的一些共享資源而已。

        Linux提供具有裝置類的面向對象的裝置模型、熱插拔事件,以及使用者空間的裝置檔案系統sysfs。

        Linux展現自由。現有的Linux特性集就是Linux公開開發模型自由發展的結果。如果一個特性沒有任何價值或者創意很差,沒有任何人會被迫去實作它。Linux已經形成了一種值得稱贊的态度:任何改變都必須要能通過簡潔的設計以及正确可靠的實作來解決現實中确實存在的問題。于是,許多出現在某些Unix變種系統中,如核心換頁機制等都被摒棄了。

        總之,不過Linux和Unix有多大的不同,Linux都打上了Unix的烙印。

繼續閱讀