圖1-3繪出了UNIX系統的高層次的體系結構。圖中心的硬件部分向操作系統提供基本服務。操作系統直接與硬件交互,向程序提供公共服務,並使它們同硬件特性隔離。當我們把整個系統看成層的集合時,通常將操作系統稱為系統內核,或簡稱內核,此時強調的是它同用戶程序的隔離。因為程序是不依賴於其下面的硬件的,所以,如果程序對硬件沒做什麼假定的話,就容易把它們在不同硬件上運行的UNIX系統之間遷移。比如,那些假定了機器字長的程序就比沒假定機器字長的程序更難以搬到其他機器上。外層的程序,諸如shell及編輯程序(vi),是通過引用一組明確定義的系統調用而與內核交互的。這些系統調用通知內核為調用程序做各種操作,並在內核與調用程序之間交換數據。圖1-3中出現的一些程序屬於標准的系統配置,就是大家所知道的命令。但是由名為a.out的程序所指示的用戶自有程序也可以存在於這一層。此處的a.out是被C編譯程序產生的可執行文件的標准名字。其他應用程序能在較低的程序層次之上構築而成,因此它們存在於圖1-3的最外層。比如,標准的C編譯程序cc就處在圖1-3的最外層;它引用C預處理程序、兩次編譯程序、匯編程序及裝入程序(稱為連接-編譯程序),這些都是彼此分開的底層程序。雖然圖1-3對應用程序只描繪了兩個級別的層次,但用戶能夠對層次進行擴充,直到級別的數目適合於自己的需要。確實,為UNIX系統所偏愛的程序設計風格鼓勵把現存程序組合起來去完成一個任務。
一大批提供了對系統的高層次看法的應用子程序及應用程序,諸如shell、編輯程序、SCCS(Source Code Control System)及文檔准備程序包等,都逐漸變成了"UNIX系統"這一名稱的同義語。然而,它們最終都使用由內核提供的底層服務,並通過系統調用(System Call)的集合利用這些服務。系統調用的集合及其實現系統調用的內部算法形成了內核的主體。簡言之,內核提供了UNIX/Linux系統全部應用程序所依賴的服務,並且內核定義了這些服務。下面我們將進一步介紹內核,對內核的體系結構提出一個總的看法,勾畫出它的基本概念和結構,這將幫助讀者更好地學習以後的內容。
圖1-4給出了內核的框圖,顯示出了各種模塊及它們之間的相互關系,它特別指出了內核的兩個主要成分:左邊的文件子系統和右邊的進程控制子系統。雖然實際上,由於某些模塊同其他模塊的內部操作進行交互而使內核偏離該模型,但該圖仍可以作為觀察內核的一個有用的邏輯觀點。在圖1-4中我們看到了三個層次:用戶、內核及硬件。系統調用與庫接口體現了圖1-4中描繪的用戶程序與內核間的邊界。系統調用看起來像C程序中普通的函數調用,而庫把這些函數調用映射成進入操作系統所需要的源語。然而,匯編語言程序可以不經過系統調用庫而直接引用系統調用。程序常常使用像標准I/O庫這樣一些其他的庫程序以提供對系統調用的更高級的使用。由於在編譯期間把這些庫連接到程序上,因此,以這裡的觀點來說,這些庫是用戶程序的一部分。
圖1-3 UNIX系統的高層次的體系結構
圖1-4 UNIX系統內核結構
圖1-4把系統調用的集合分成與文件子系統交互作用的部分及與進程控制子系統交互作用的部分。文件子系統管理文件,其中包括分配文件空間、管理空閒空間、控制對文件的存取,以及為用戶檢索數據。進程通過一個特定的系統調用集合,比如通過系統調用open,close,read,write,stat,chown及chmod等與文件子系統交互。文件子系統使用一個緩沖機制存取文件數據,緩沖機制調節在核心與二級存儲設備之間的數據流。緩沖機制同塊I/O設備驅動程序交互作用,以便啟動往核心去的數據傳送及從核心來的數據傳送。設備驅動程序是用來控制外圍設備操作的核心模塊。塊I/O設備是隨機存取存儲設備,或者說,它們的設備驅動程序使得它們對於系統的其他部分來說好像是隨機存取存儲設備。
例如,一個磁帶驅動程序可以允許核心把一個磁帶裝置作為一個隨機存取存儲設備看待。文件子系統可以在沒有緩沖機制干預的情況下直接與"原始"I/O設備驅動程序交互作用。原始設備,有時也被稱為字符設備,包括所有非塊設備。進程控制子系統負責進程同步、進程間通信,存儲管理及進程調度。當要執行一個文件而把該文件裝入存儲器中時,文件子系統與進程控制子系統交互:進程子系統在執行可執行文件之前,把它們讀到內存中。輸入/輸出存儲管理模塊控制存儲分配。
在任何時刻,只要系統沒有足夠的物理存儲供所有進程使用,核心就在內存與二級存儲之間對進程進行交換,以便所有的進程都得到公平的執行機會。調度程序模塊把CPU分配給進程。該模塊調度各進程依次運行,直到它們因等待資源而自願放棄CPU,或者知道它們最近一次的運行時間超出一個時間量,從而核心搶占它們。於是調度程序選擇最高優先權的合格進程投入運行;當原來的進程成為最高優先權的合格進程時,還會再次投入運行。進程間通信有幾種形式,從時間的異步軟中斷信號到進程間消息的同步傳輸等