作業系統(二)
第2章 作業系統概述
學習內容:
- 作業系統的主要功能
- 早期批處理系統到現代複雜的系統:作業系統的演化
- 2.3節的作業系統研究的每一項主要成果,給出簡要的說明
- 有助於現代作業系統開發的主要設計領域
- 定義並討論虛擬機器的虛擬化
- 多處理器和多核計算機帶來的作業系統設計問題
- windows7的基本結構
- 傳統UNIX系統的基本要求
- 現代UNIX系統的新特性
- 掌握Linux及其與UNIX的關聯
2.1 作業系統的目標和功能
作業系統是控制應用程式執行的程式,並充當應用程式和計算機硬體之間的介面。有三個目標:
- 方便:作業系統使計算機更易於使用。
- 有效:作業系統允許以更有效的方式使用計算機系統資源。
- 擴充套件能力:在構造作業系統時,應該允許在不妨礙服務的前提下有效地開發、測試和引進新的系統功能。
2.1.1 作為使用者/計算機介面的作業系統
為使用者提供應用的硬體和軟體可以看做是一種層次結構,如圖2.1 所示。應用程式的使用者並不關心計算機的硬體細節。因此,終端使用者把計算機系統看做是一組應用程式。如果需要用一組完全負責控制計算機硬體的機器指令開發應用程式,將會是一件非常複雜的任務。為簡化這個任務,需要提供一些系統程式,其中一部分稱做實用工具,它們實現了在建立程式、管理檔案和控制I/O 裝置中經常使用的功能。程式設計師在開發應用程式時將使用這些功能提供的介面;在應用程式執行時,將呼叫這些實用工具以實現特定的功能。最重要的系統程式是作業系統,作業系統為程式設計師遮蔽了硬體細節,併為程式設計師使用系統提供方便的介面。它可以作為中介,使程式設計師和應用程式更容易地訪問和使用這些功能和服務。
作業系統通常提供了以下幾個方面的服務:
- 程式開發:作業系統提供各種各樣的工具和服務,如編輯器和偵錯程式,用於幫助程式設計師開發程式。通常,這些服務以實用工具程式的形式出現,嚴格來說並不屬於作業系統核心的一部分;它們由作業系統提供,稱做應用程式開發工具。
- 程式執行:執行一個程式需要很多步驟,包括必須把指令和資料載入到記憶體、初始化I/O裝置和檔案、準備其他一些資源。作業系統為使用者處理這些排程問題。
- I/O 裝置訪問:每個I/O 裝置的操作都需要特有的指令集或控制訊號,作業系統隱藏這些細節並提供了統一的介面,因此程式設計師可以使用簡單的讀和寫操作訪問這些裝置
- 檔案訪問控制:對作業系統而言,關於檔案的控制不僅必須詳細瞭解I/O 裝置(磁碟驅動器、磁帶驅動器)的特性,而且必須詳細瞭解儲存介質中檔案資料的結構。此外,對有多個使用者的系統,作業系統還可以提供保護機制來控制對檔案的訪問。
- 系統訪問:對於共享或公共系統,作業系統控制對整個系統的訪問以及對某個特殊系統資源的訪問。訪問功能模組必須提供對資源和資料的保護,以避免未授權使用者的訪問,還必須解決資源競爭時的衝突問題。;
- 錯誤檢測和響應:計算機系統執行時可能發生各種各樣的錯誤,包括內部和外部硬體錯誤,如儲存器錯誤、裝置失效或故障,以及各種軟體錯誤,如算術溢位等。對每種情況,作業系統都必須提供響應以清除錯誤條件,使其對正在執行的應用程式影響最小。響應可以是終止引起錯誤的程式、重試操作或簡單地給應用程式報告錯誤。
- 記賬:一個好的作業系統可以收集對各種資源使用的統計資訊,監控諸如響應時間之類的效能引數。對多使用者系統,這個資訊還可用於記賬。
圖2.1也指明瞭典型計算機系統中的三種重要的介面:
- 指令系統體系結構(ISA):定義了計算機遵循的機器語言指令系統,該介面是硬體與軟體的分界線。
-
- 應用程式和實用程式都可以直接訪問ISA,這些程式使用指令系統的一個子集(使用者級ISA);
- 作業系統使用其他一些作業系統資源的機器語言指令(系統級ISA)。
- 應用程式二進位制介面(ABI):這些介面定義了程式間二進位制可移植性的標準。ABI定義了作業系統的系統呼叫介面,以及在系統中通過ISA能使用的硬體資源和服務。
- 應用程式程式設計介面(API):API允許應用程式訪問系統的硬體資源和服務。這些服務由使用者級ISA和高階語言(HLL)庫呼叫來提供。使用API能使應用軟體更容易通過重新編譯移植到其他具有相同API的系統中。
2.1.2 作為資源管理器的作業系統
一臺計算機就是一組資源,這些資源用於對資料的移動、儲存和處理,以及對這些功能的控制。而作業系統負責管理這些資源。
那麼是否可以說是作業系統在控制資料的移動、儲存和處理呢?從某個角度來看,答案是肯定的:通過管理計算機資源,作業系統控制計算機的基本功能,但是這個控制是通過一種不尋常的方式來實施的。通常,我們把控制機制想象成在被控制物件之外或者至少與被控制物件有一些差別和距離(例如,住宅供熱系統是由自動調溫器控制的,它完全不同於熱產生和熱傳送裝置)。但是,作業系統卻不是這種情況,作為控制機制,它有兩方面不同之處:
- 作業系統與普通的計算機軟體作用相同,它也是由處理器執行的一段程式或一組程式。
- 作業系統經常會釋放控制,而且必須依賴處理器才能恢復控制。
作業系統實際上不過是一組計算機程式,與其他計算機程式類似,它們都給處理器提供指令,主要區別在於程式的意圖。作業系統控制處理器使用其他系統資源,並控制其他程式的執行時機。但是,處理器為了做任何一件這類事情,都必須停止執行作業系統程式,而去執行其他程式。因此,這時作業系統釋放對處理器的控制,讓處理器去做其他一些有用的工作,然後用足夠長的時間恢復控制權,讓處理器準備好做下一項工作。隨著本章內容的深入,讀者將逐漸明白所有這些機制。
圖2.2 顯示了由作業系統管理的主要資源。作業系統中有一部分在記憶體中,其中包括核心程式和當前正在使用的其他作業系統程式,核心程式包含作業系統中最常使用的功能。記憶體的其餘部分包含使用者程式和資料,它的分配由作業系統和處理器中的儲存管理硬體聯合控制。作業系統決定在程式執行過程中何時使用I/O 裝置,並控制檔案的訪問和使用。處理器自身也是一個資源,作業系統必須決定在執行一個特定的使用者程式時,可以分配多少處理器時間,在多處理器系統中,這個決定要傳到所有的處理器。
2.1.3 作業系統的易擴充套件性
一個重要的作業系統應該能夠不斷髮展,其原因如下:
- 硬體升級和新型硬體的出現:如早期執行UNIX 和Macintosh 的處理器沒有“分頁”的硬體,因此這兩個作業系統也沒有使用分頁機制,而較新的版本經過修改,具備了分頁功能。
- 新的服務:為適應使用者的要求或滿足系統管理員的需要,需要擴充套件作業系統以提供新的服務。例如,如果發現用現有的工具很難保持較好的效能,作業系統就必須增加新的度量和控制工具。
- 糾正錯誤:任何一個作業系統都有錯誤,隨著時間的推移這些錯誤逐漸被發現並會引入相應的補丁程式。當然,補丁本身也可能會引入新的錯誤。
在構造系統時應該採用模組化的結構,清楚地定義模組間的介面,並備有說明文件。對於像現代作業系統這樣的大型程式,簡單的模組化是不夠的,也就是說,不能只是簡單地把程式劃分為模組,還需要做更多的工作。在本章的後續部分將繼續討論這個問題。
2.2 作業系統的發展
瞭解這些年來作業系統的發展歷史。
2.2.1 序列處理
早期,程式設計師都是直接與計算機硬體打交道的,因為當時還沒有作業系統。這些機器都是在一個控制檯上執行的,控制檯包括顯示燈、觸發器、某種型別的輸入裝置和印表機。用機器程式碼編寫的程式通過輸入裝置(如卡片閱讀機)載入計算機。如果一個錯誤使得程式停止,錯誤原因由顯示燈指示。如果程式正常完成,輸出結果將出現在印表機中。
早期系統引出兩個主要問題:
- 排程:大多數裝置都使用一個硬拷貝的登記表預訂機器時間。通常,一個使用者可以以半小時為單位登記一段時間。有可能使用者登記了1 小時,而只用了45 分鐘就完成了工作,在剩下的時間中計算機只能閒置,這時就會導致浪費。另一方面,如果使用者遇到一個問題,沒有在分配的時間內完成工作,在解決這個問題之前就會被強制停止。
- 準備時間:一個程式稱做作業,它可能包括往記憶體中載入編譯器和高階語言程式(源程式),儲存編譯好的程式(目標程式),然後載入目標程式和公用函式並連結在一起。每一步都可能包括安裝或拆卸磁帶,或者準備卡片組。如果在此期間發生了錯誤,使用者只能全部重新開始。需要大量時間。
這種操作模式稱做序列處理,反映了使用者必須順序訪問計算機的事實。後來,為使序列處理更加有效,開發了各種各樣的系統軟體工具,其中包括公用函式庫、連結器、載入器、偵錯程式和I/O 驅動程式,它們作為公用軟體,對所有的使用者來說都是可用的。
2.2.2 簡單批處理系統
早期計算機由於排程和準備而浪費時間是難以接受的,因此最大限度地利用處理器是非常重要的。
為提高利用率,人們有了開發批處理作業系統的想法。簡單批處理方案的中心思想是使用一個稱做監控程式的軟體。通過使用這類作業系統,使用者不再直接訪問機器,相反,使用者把卡片或磁帶中的作業提交給計算機操作員,由他把這些作業按順序組織成一批,並將整個批作業放在輸入裝置上,供監控程式使用。每個程式完成處理後返回到監控程式,同時,監控程式自動載入下一個程式。
可以從以下兩個角度進行分析:監控程式角度和處理器角度。
- 監控程式角度:監控程式控制事件的順序。為做到這一點,大部分監控程式必須總是處於記憶體中並且可以執行(見圖2.3),這部分稱做常駐監控程式(resident monitor)。其他部分包括一些實用程式和公用函式,它們作為使用者程式的子程式,在需要用到它們的作業開始執行時被載入。監控程式每次從輸入裝置(通常是卡片閱讀機或磁帶驅動器)中讀取一個作業。讀入後,當前作業被放置在使用者程式區域,並且把控制權交給這個作業。當作業完成後,它將控制權返回給監控程式,監控程式立即讀取下一個作業。每個作業的結果被髮送到輸出裝置(如印表機),交付給使用者。
- 處理器角度:從某個角度看,處理器執行記憶體中儲存的監控程式中的指令,這些指令讀入下一個作業並存儲到記憶體中的另一個部分。一旦已經讀入一個作業,處理器將會遇到監控程式中的分支指令,分支指令指導處理器在使用者程式的開始處繼續執行。處理器繼而執行使用者程式中的指令,直到遇到一個結束指令或錯誤條件。不論哪種情況都將導致處理器從監控程式中取下一條指令。
- 因此,“控制權交給作業”僅僅意味著處理器當前取和執行的都是使用者程式中的指令,
- 而“控制權返回給監控程式”的意思是處理器當前從監控程式中取指令並執行指令。
圖2.3 常駐監控程式的記憶體佈局 |
監控程式完成排程功能:
- 一批作業排隊等候,處理器儘可能迅速地執行作業,沒有任何空閒時間。
- 監控程式還改善了作業的準備時間,每個作業中的指令均以一種作業控制語言(Job ControlLanguage,JCL)的基本形式給出。這是一種特殊型別的程式設計語言,用於為監控程式提供指令。舉一個簡單的例子,使用者提交一個用FORTRAN 語言編寫的程式以及程式需要用到的一些資料。除了FORTRAN 指令和資料行,作業中還包括作業控制指令,這些指令以“$”符號打頭。作業的整體格式如下所示:
為執行這個作業:
- 監控程式讀$FTN 行,從海量儲存器(通常為磁帶)中載入合適的語言編譯器。
- 編譯器將使用者程式翻譯成目的碼,並儲存在記憶體或海量儲存器中。如果儲存在記憶體中,則操作稱做“編譯、載入和執行”。如果儲存在磁帶中,就需要$LOAD 指令。
- 編譯操作之後監控程式重新獲得控制權,此時監控程式讀$LOAD 指令,啟動一個載入器,並將控制權轉移給它,載入器將目標程式載入記憶體(在編譯器所佔的位置中)。
在這種方式中,有一大段記憶體可以由不同的子系統共享,但是每次只能執行一個子系統。
在使用者程式的執行過程中,任何輸入指令都會讀入一行資料。使用者程式中的輸入指令導致呼叫一個輸入例程,輸入例程是作業系統的一部分,它檢查輸入以確保程式並不是意外讀入一個JCL 行。如果是這樣,就會發生錯誤,控制權轉移給監控程式。使用者作業完成後,監控程式掃描輸入行,直到遇到下一條JCL 指令。因此,不管程式中的資料行太多或太少,系統都受保護。
可以看出,監控程式或者說批處理作業系統,只是一個簡單的計算機程式。它依賴於處理器可以從記憶體的不同部分取指令的能力,以交替地獲取或釋放控制權。此外,還考慮到了其他硬體功能:
- 記憶體保護:當用戶程式正在執行時,不能改變包含監控程式的記憶體區域。如果試圖這樣做,處理器硬體將發現錯誤,並將控制轉移給監控程式,監控程式取消這個作業,輸出錯誤資訊,並載入下一個作業。
- 定時器:定時器用於防止一個作業獨佔系統。在每個作業開始時,設定定時器,如果定時器時間到,使用者程式被停止,控制權返回給監控程式。
- 特權指令:某些機器指令設計成特權指令,只能由監控程式執行。如果處理器在執行一個使用者程式時遇到這類指令,則會發生錯誤,並將控制權轉移給監控程式。I/O 指令屬於特權指令,因此監控程式可以控制所有I/O 裝置,此外還可以避免使用者程式意外地讀到下一個作業中的作業控制指令。如果使用者程式希望執行I/O,它必須請求監控程式為自己執行這個操作。
- 中斷:早期的計算機模型並沒有中斷能力。這個特徵使得作業系統在讓使用者程式放棄控制權或從使用者程式獲得控制權時具有更大的靈活性。
記憶體保護和特權指令引入了操作模式的概念。使用者程式執行在使用者態,在這個模式下,有些記憶體區域是受到保護的,特權指令也不允許執行。監控程式執行在系統態,也可以稱為核心態,在這個模式下,可以執行特權指令,而且受保護的記憶體區域也是可以訪問的。
對批處理作業系統來說,使用者程式和監控程式交替執行。這樣做存在兩方面的缺點:一部分記憶體交付給監控程式;監控程式消耗了一部分機器時間。所有這些都構成了系統開銷,儘管存在系統開銷,但是簡單的批處理系統還是提高了計算機的利用率。
2.2.3 多道程式設計批處理系統
即便對由簡單批處理作業系統提供的自動作業序列,處理器仍然經常是空閒的。問題在於I/O 裝置相對於處理器速度太慢。圖2.4 詳細列出了一個有代表性的計算過程,這個計算過程所涉及的程式用於處理一個記錄檔案,並且平均每秒處理100條指令。在這個例子中,計算機96%的時間都是用於等待I/O裝置完成檔案資料傳送。
圖2.4 系統利用率例項 |
圖2.5a 顯示了這種只有一個單獨程式的情況,稱做單道程式設計。處理器花費一定的執行時間進行計算,直到遇到一個I/O 指令,這時它必須等到這個I/O 指令結束後才能繼續進行。
這種低效率是可以避免的。記憶體空間可以儲存作業系統(常駐監控程式)和一個使用者程式。假設記憶體空間容得下作業系統和兩個使用者程式,那麼當一個作業需要等待I/O 時,處理器可以切換到另一個可能並不在等待I/O 的作業(見圖2.5b)。進一步還可以擴充套件儲存器以儲存三個、四個或更多的程式,並且在它們之間進行切換(見圖2.5c)。這種處理稱做多道程式設計(multiprogramming)或多工處理(multitasking),它是現代作業系統的主要方案。
(點選檢視大圖)圖2.5 多道程式設計例項 |
舉例來說,一臺計算機,它有250M 位元組的可用儲存器(沒有被作業系統使用)、磁碟、終端和印表機,同時提交執行三個程式,它們的屬性在表2.1 中列出。假設JOB2 和JOB3 對處理器只有最低的要求,JOB3 還要求連續使用磁碟和印表機。對於簡單的批處理環境,這些作業將順序執行,30 分鐘後才完成。表2.2 中的單道程式設計列出了平均資源利用率、吞吐量和響應時間,圖2.6a 顯示了各個裝置的利用率。
假設作業在多道程式作業系統下並行執行。由於作業間幾乎沒有資源競爭,所有這三個作業都可以在計算機中同時存在其他作業的情況下,在幾乎最小的時間內執行(假設JOB2 和JOB3 均分配到了足夠的處理器時間,以保證它們的輸入和輸出操作處於活動狀態),所有這三個作業將在15 分鐘內完成。由圖2.6b 中的直方圖可獲得表2.2 中多道程式設計中的那一列資料,從中可以看出效能的提高是很明顯的。
表2.1 示例程式執行屬性
表2.2 多道程式設計中的資源利用結果
多道程式批處理系統和簡單批處理系統一樣必須依賴於某些計算機硬體功能,對多道程式設計有用的最顯著的輔助功能是支援I/O 中斷和直接儲存器訪問(DMA)的硬體。通過中斷驅動的I/O 或DMA,處理器可以為一個作業發出I/O 命令,當裝置控制器執行I/O 操作時,處理器執行另一個作業;當I/O 操作完成時,處理器被中斷,控制權被傳遞給作業系統中的中斷處理程式,然後作業系統把控制權傳遞給另一個作業。
針對多道程式作業系統:
- 對準備執行的多個作業,它們必須保留在記憶體中,這就需要記憶體管理。
- 此外,如果多個作業都準備執行,處理器必須決定執行哪一個,這需要某種排程演算法。
這些概念將在本章後面部分詳細講述。
(點選檢視大圖)圖2.6 利用率直方圖 |
2.2.4 分時系統
對許多作業來說,需要提供一種模式,以使使用者可以直接與計算機互動。
正如多道程式設計允許處理器同時處理多個批作業一樣,它還可以用於處理多個互動作業。後一種情況,由於多個使用者分享處理器時間,因而該技術稱做分時。
在分時系統中,多個使用者可以通過終端同時訪問系統,由作業系統控制每個使用者程式以很短的時間為單位交替執行。因此,如果有n 個使用者同時請求服務,若不計作業系統開銷,每個使用者平均只能得到計算機有效速度的1/n。但是由於人的反應時間相對比較慢,所以一個設計良好的系統,其響應時間應該可以接近於專用計算機。
批處理和分時都使用了多道程式設計,其主要差別如下所示。
早期,系統執行在一臺記憶體為32 000 個36 位字的機器上,常駐監控程式佔用了5000 個。當控制權被分配給一個互動使用者時,該使用者的程式和資料被載入到記憶體剩餘的27 000 個字的空間中。程式通常在第5000 個字單元處開始被載入,這簡化了監控程式和記憶體管理。系統時鐘以大約每0.2 秒一個的速度產生中斷,在每個時鐘中斷處,作業系統恢復控制權,並將處理器分配給另一位使用者。這項技術稱為時間片技術。為便於恢復,在新的使用者程式和資料被讀入之前,老的使用者程式和資料被寫出到磁碟。隨後,當獲得下一次機會時,老的使用者程式程式碼和資料被恢復到記憶體中。
為減小磁碟開銷,只有當新來的程式需要重寫使用者儲存空間時,使用者儲存空間才被寫出。這個原理如圖2.7 所示。假設有4 個互動使用者,其儲存器需求如下:
JOB1:15 000
JOB2:20 000
JOB3:5000
JOB4:10 000
- 監控程式載入JOB1 並把控制權轉交給它,如圖2.7a 所示。
- 稍後,監控程式決定把控制權轉交給JOB2,由於JOB2 比JOB1 需要更多的儲存空間,JOB1 必須先被寫出,然後載入JOB2,如圖2.7b 所示。
- 接下來,JOB3 被載入並執行,但是由於JOB3 比JOB2 小,JOB2 的一部分仍然留在儲存器中,以減少寫磁碟的時間,如圖2.7c 所示。
- 稍後,監控程式決定把控制交回JOB1,當JOB1 載入儲存器時,JOB2 的另外一部分將被寫出,如圖2.7d 所示。
- 當載入JOB4 時,JOB1的一部分和JOB2 的一部分仍留在儲存器中,如圖2.7e 所示。
- 此時,如果JOB1 或JOB2 被啟用,則只需要載入一部分。在這個例子中是JOB2 接著執行,這就要求JOB4 和JOB1 留在儲存器中的那一部分被寫出,然後讀入JOB2 的其餘部分,如圖2.7f 所示。
(點選檢視大圖)圖2.7 CTSS 操作 |
與當今的分時系統相比,CTSS 是一種原始的方法,但它可以工作。它非常簡單,從而使監控程式最小。由於一個作業經常被載入到儲存器中相同的單元,因而在載入時不需要重定位技術(在後面講述)。這個技術僅僅寫出必須的內容,可以減少磁碟的活動。在7094 上執行時,CTSS最多可支援32 個使用者。
分時和多道程式設計引發了作業系統中的許多新問題。如果記憶體中有多個作業,必須保護它們不相互干擾,例如不會修改其他作業的資料。有多個互動使用者時,必須對檔案系統進行保護,只有授權使用者才可以訪問某個特定的檔案,還必須處理資源(如印表機和海量儲存器)競爭問題。在本書中會經常遇到這樣或那樣的問題以及可能的解決方法。
2.3 主要的成就
作業系統開發中的5 個重要的理論進展:
- 程序
- 記憶體管理
- 資訊保護和安全
- 排程和資源管理
- 系統結構。
2.3.1 程序
程序比作業更通用一些。存在很多關於程序的定義,如下:
- 一個正在執行的程式。
- 計算機中正在執行的程式的一個例項。
- 可以分配給處理器並由處理器執行的一個實體。
- 由單一的順序的執行執行緒、一個當前狀態和一組相關的系統資源所描述的活動單元。後面將會對這個概念進行更清晰的闡述。
計算機系統的發展有三條主線:多道程式批處理操作、分時和實時事務系統,它們在時間安排和同步中所產生的問題推動了程序概念的發展。
- 多道程式設計:為了讓處理器和I/O 裝置(包括儲存裝置)同時保持忙狀態,以實現最大效率。其關鍵機制是:在響應表示I/O 事務結束的訊號時,作業系統將對記憶體中駐留的不同程式進行處理器切換。
- 分時:為了及時響應單個使用者的要求,但是由於成本原因,又要可以同時支援多個使用者。由於使用者反應時間相對比較慢,這兩個目標是可以同時實現的。當然,在這個計算中,還必須考慮作業系統的開銷因素。
- 實時事務處理系統:很多使用者都在對資料庫進行查詢或修改,例如航空公司的預訂系統。事務處理系統和分時系統的主要差別在於前者侷限於一個或幾個應用,而分時系統的使用者可以從事程式開發、作業執行以及使用各種各樣的應用程式。對於這兩種情況,系統響應時間都是最重要的。
在開發早期的多道程式和多使用者互動系統時使用的主要工具是中斷。一個已定義事件(如I/O 完成)的發生可以暫停任何作業的活動。處理器儲存某些上下文(如程式計數器和其他暫存器),然後跳轉到中斷處理程式中,處理中斷,然後恢復使用者被中斷作業或其他作業的處理。
設計出一個協調各種不同活動的系統軟體是非常困難的。
在任何時刻都有許多作業在執行中,每個作業都包括要求按順序執行的很多步驟。由於缺乏能夠在所有活動中進行協調和合作的系統級的方法,程式設計師只能基於他們對作業系統所控制的環境的理解,採用自己的特殊方法。然而這種方法是很脆弱的,尤其對於一些程式設計中的小錯誤,因為這些錯誤只有在很少見的事件序列發生時才會出現。由於需要從應用程式軟體錯誤和硬體錯誤中區分出這些錯誤,因而診斷工作是很困難的。即使檢測出錯誤,也很難確定其原因,因為很難再現錯誤產生的精確場景。一般而言,產生這類錯誤有4 個主要原因:
- 不正確的同步:即一個例程必須掛起,等待系統中其他地方的某一事件。例如,一個程式啟動了一個I/O 讀操作,在繼續進行之前必須等到緩衝區中有資料。在這種情況下,需要來自其他例程的一個訊號,而設計不正確的訊號機制可能導致訊號丟失或接收到重複訊號。
- 失敗的互斥:多個使用者或程式試圖同時使用一個共享資源的情況。因此必須有某種互斥機制,以保證一次只允許一個例程對一部分資料執行事務處理。很難證明這類互斥機制的實現對所有可能的事件序列都是正確的。
- 不確定的程式操作:一個特定程式的結果只依賴於該程式的輸入,而並不依賴於共享系統中其他程式的活動。但是,當程式共享記憶體並且處理器控制它們交錯執行時,它們可能會因為重寫相同的記憶體區域而發生不可預測的相互干擾。因此,程式排程順序可能會影響某個特定程式的輸出結果。
- 死鎖:很可能有兩個或多個程式相互掛起等待。例如,兩個程式可能都需要兩個I/O 裝置執行一些操作(如從磁碟複製到磁帶)。一個程式獲得了一個裝置的控制權,而另一個程式獲得了另一個裝置的控制權,它們都等待對方釋放自己想要的資源。這樣的死鎖依賴於資源分配和釋放的時機安排。
解決這些問題需要一種系統級的方法監控處理器中不同程式的執行。程序的概念為此提供了基礎。程序可以看做是由三部分組成的:
- 一段可執行的程式
- 程式所需要的相關資料(變數、工作空間、緩衝區等)
- 程式的執行上下文
最後一部分是根本。執行上下文又稱做程序狀態(process state),是作業系統用來管理和控制程序所需的內部資料。這種內部資訊和程序是分開的,因為作業系統資訊不允許被程序直接訪問。上下文包括作業系統管理程序以及處理器正確執行程序所需要的所有資訊。包括了各種處理器暫存器的內容,如程式計數器和資料暫存器。它還包括作業系統使用的資訊,如程序優先順序以及程序是否在等待特定I/O 事件的完成。
圖2.8 給出了一種程序管理的方法。兩個程序存在於記憶體的某些部分。給每個程序(包含程式、資料和上下文資訊)分配一塊儲存器區域,並且在由作業系統建立和維護的程序表中進行記錄。程序表包含記錄每個程序的表項,表項內容包括:
- 指向包含程序的儲存塊地址的指標;
- 該程序的部分或全部執行上下文。執行上下文的其餘部分存放在別處,可能和程序自己儲存在一起(如圖2.8 所示),通常也可能儲存在記憶體裡一塊獨立的區域中。
- 程序索引暫存器(process index register)包含當前正在控制處理器的程序在程序表中的索引。
- 程式計數器指向該程序中下一條待執行的指令。
- 基址暫存器(base register)和界限暫存器(limit register)定義了該程序所佔據的儲存器區域:
- 基址暫存器中儲存了該儲存器區域的開始地址,
- 界限暫存器中儲存了該區域的大小(以位元組或字為單位)。
程式計數器和所有的資料引用相對於基址暫存器被解釋,並且不能超過界限暫存器中的值,這就可以保護內部程序間不會相互干涉。
在圖2.8 中,程序索引暫存器表明程序B正在執行。以前執行的程序被臨時中斷,在A中斷的同時,所有暫存器的內容被記錄在它的執行上下文環境中,以後作業系統就可以執行程序切換,恢復程序A的執行。程序切換過程包括儲存B的上下文和恢復A 的上下文。當在程式計數器中載入指向A的程式區域的值時,程序A 自動恢復執行。
(點選檢視大圖)圖2.8 典型的程序實現方法 |
程序被當做資料結構來實現。一個程序可以是正在執行,也可以是等待執行。任何時候整個程序狀態都包含在它的上下文環境中。這個結構使得可以開發功能強大的技術,以確保在程序中進行協調和合作。在作業系統中可能會設計和併入一些新的功能(如優先順序),這可以通過擴充套件上下文環境以包括支援這些特徵的新資訊。在本書中,將有很多關於使用程序結構解決在多道程式設計和資源共享中出現的問題的例子。
2.3.2 記憶體管理
通過支援模組化程式設計的計算環境和資料的靈活使用,使用者的要求可以得到很好的滿足。系統管理員需要有效且有條理地控制儲存器分配。作業系統為滿足這些要求,擔負著5 個基本的儲存器管理責任:
- 程序隔離:作業系統必須保護獨立的程序,防止互相干涉各自的儲存空間,包括資料和指令。
- 自動分配和管理:程式應該根據需要在儲存層次間動態地分配,分配對程式設計師是透明的。作業系統有效地實現分配問題,僅在需要時才給作業分配儲存空間。
- 支援模組化程式設計:程式設計師應該能夠定義程式模組,並且動態地建立、銷燬模組,動態地改變模組大小。
- 保護和訪問控制:不論在儲存層次中的哪一級,儲存器的共享都會產生一個程式訪問另一個程式儲存空間的潛在可能性。當一個特定的應用程式需要共享時,這是可取的。但在別的時候,它可能威脅到程式的完整性,甚至威脅到作業系統自身。作業系統必須允許一部分記憶體可以由各種使用者以各種方式進行訪問。
- 長期儲存:許多應用程式需要在計算機關機後長時間儲存資訊。
在典型情況下,作業系統使用虛擬儲存器和檔案系統機制來滿足這些要求。
檔案系統實現了長期儲存,它在一個有名字的物件中儲存資訊,這個物件稱做檔案。對作業系統來說,檔案是訪問控制和保護的一個有用單元。
虛擬儲存器機制允許程式從邏輯的角度訪問儲存器,而不考慮實體記憶體上可用的空間數量。虛擬儲存器的構想是為了滿足有多個使用者作業同時駐留在記憶體中的要求,這樣,當一個程序被寫出到輔助儲存器中並且後繼程序被讀入時,在連續的程序執行之間將不會脫節。由於程序大小不同,如果處理器在很多程序間切換,則很難把它們緊密地壓入記憶體中,因此引進了分頁系統。在分頁系統中,程序由許多固定大小的塊組成,這些塊稱做頁。程式通過虛地址(virtualaddress)訪問字,虛地址由頁號和頁中的偏移量組成。程序的每一頁都可以放置在記憶體中的任何地方,分頁系統提供了程式中使用的虛地址和記憶體中的實地址或實體地址之間的動態對映。
有了動態對映硬體,下一邏輯步驟是消除一個程序的所有頁同時駐留在記憶體中的要求。一個程序的所有頁都保留在磁碟中,當程序執行時,一部分頁在記憶體中。如果需要訪問的某一頁不在記憶體中,儲存管理硬體可以檢測到,然後安排載入這個缺頁。這個配置稱做虛擬記憶體,如圖2.9所示。
圖2.9 虛擬儲存器概念 |
(點選檢視大圖)圖2.10 虛擬儲存器定址 |
處理器硬體和作業系統一起提供給使用者“虛擬處理器”的概念,而“虛擬處理器”有對虛擬儲存器的訪問權。這個儲存器可以是一個線性地址空間,也可以是段的集合,而段是可變長度的連續地址塊。不論哪種情況,程式設計語言的指令都可以訪問虛擬儲存器區域中的程式和資料。可通過給每個程序一個唯一的不重疊的虛擬儲存器空間來實現程序隔離;可以通過使兩個虛擬儲存器空間的一部分重疊來實現記憶體共享;檔案可用於長期儲存,檔案或其中一部分可以複製到虛擬儲存器中供程式操作。
圖2.10 顯示了虛擬儲存器方案中的定址關係。儲存器由記憶體和低速的輔助儲存器組成,記憶體可直接訪問到(通過機器指令),外存則可以通過把塊載入記憶體間接訪問到。地址轉換硬體(對映器)位於處理器和記憶體之間。程式使用虛地址訪問,虛地址將對映成真實的記憶體地址。如果訪問的虛地址不在實際記憶體中,實際記憶體中的一部分內容將換到外存中,然後換入所需要的資料塊。在這個活動過程中,產生這個地址訪問的程序必須被掛起。作業系統設計者的任務是開發開銷很少的地址轉換機制,以及可以減小各級儲存器級間交換量的儲存分配策略。
2.3.3 資訊保護和安全
有一些通用工具可以嵌入支援各種保護和安全機制的計算機和作業系統內部。總之,我們關心對計算機系統的控制訪問和其中儲存的資訊。
大多數與作業系統相關的安全和保護問題可以分為4 類:
- 可用性:保護系統不被打斷。
- 保密性:保證使用者不能讀到未授權訪問的資料。
- 資料完整性:保護資料不被未授權修改。
- 認證:涉及使用者身份的正確認證和訊息或資料的合法性。
2.3.4 排程和資源管理
作業系統的一個關鍵任務是管理各種可用資源(記憶體空間、I/O 裝置、處理器),並排程各種活動程序使用這些資源。任何資源分配和排程策略都必須考慮三個因素:
- 公平性:通常希望給競爭使用某一特定資源的所有程序提供幾乎相等和公平的訪問機會。
- 有差別的響應性:另一方面,作業系統可能需要區分有不同服務要求的不同作業類。作業系統將試圖做出滿足所有要求的分配和排程決策,並且動態地做出決策。例如,如果一個程序正在等待使用一個I/O 裝置,作業系統會盡可能迅速地排程這個程序,從而釋放這個裝置以方便其他程序使用。
- 有效性:作業系統希望獲得最大的吞吐量和最小的響應時間,並且在分時的情況下,能夠容納儘可能多的使用者。這些標準互相矛盾,在給定狀態下尋找適當的平衡是作業系統中一個正在進行研究的問題。
此外,系統活動的度量對監視效能並進行調節是非常重要的。
圖2.11 給出了多道程式設計環境中涉及程序排程和資源分配的作業系統主要元件。作業系統中維護著多個佇列,每個佇列代表等待某些資源的程序的簡單列表。
- 短期佇列由在記憶體中(或至少最基本的一小部分在記憶體中)並等待處理器可用時隨時準備執行的程序組成。任何一個這樣的程序都可以在下一步使用處理器,究竟選擇哪一個取決於短期排程器,或者稱為分派器( dispatcher)。一個常用的策略是依次給佇列中的每個程序一定的時間,這稱為時間片輪轉技術,時間片輪轉技術使用了一個環形佇列。另一種策略是給不同的程序分配不同的優先順序,根據優先順序進行排程。
- 長期佇列是等待使用處理器的新作業的列表。作業系統通過把長期佇列中的作業轉移到短期佇列中,實現往系統中新增作業,這時記憶體的一部分必須分配給新到來的作業。因此,作業系統要避免由於允許太多的程序進入系統而過量使用記憶體或處理時間。每個I/O 裝置都有一個I/O 佇列,可能有多個程序請求使用同一個I/O 裝置。所有等待使用一個裝置的程序在該裝置的佇列中排隊,同時作業系統必須決定把可用的I/O 裝置分配給哪一個程序。
如果發生了一箇中斷,則作業系統在中斷處理程式入口得到處理器的控制權。程序可以通過服務呼叫明確地請求某些作業系統的服務,如I/O 裝置處理服務。在這種情況下,服務呼叫處理程式是作業系統的入口點。在任何情況下,只要處理中斷或服務呼叫,就會請求短期排程器選擇一個程序執行。
前面所述的是一個功能描述,關於作業系統這部分的細節和模組化的設計,在各種系統中各不相同。作業系統中這方面的研究大多針對選擇演算法和資料結構,其目的是提供公平性、有差別的響應性和有效性。
圖2.11 用於多道程式設計的作業系統的主要元件 |
2.4 現代作業系統的特徵
促使作業系統發展的硬體因素主要有:
- 包含多處理器的計算機系統、高速增長的機器速度、高速網路連線和容量不斷增加的各種儲存裝置。
- 多媒體應用、Internet 和Web 訪問、客戶/伺服器計算等應用領域也影響著作業系統的設計。
- 在安全性方面,網際網路的訪問增加了潛在的威脅和更加複雜的攻擊,例如病毒、蠕蟲和黑客技術。
不僅需要修改和增強現有的作業系統體系結構,而且需要有新的作業系統組織方法。在實驗用和商用作業系統中有很多不同的方法和設計要素,大致可以分為:
- 微核心體系結構
- 多執行緒
- 對稱多處理
- 分散式作業系統
- 面向物件設計
至今,大多數作業系統都有一個單體核心,作業系統應該提供的功能由這些大核心提供,包括排程、檔案系統、網路、裝置驅動器、儲存管理等。典型情況下,這個大核心是作為一個程序實現的,所有元素都共享相同的地址空間。微核心體系結構只給核心分配一些最基本的功能,包括地址空間、程序間通訊(簡稱IPC)和基本的排程。其他的作業系統服務都是由執行在使用者態下且與其他應用程式類似的程序提供,這些程序可根據特定的應用和環境需求進行定製,有時也稱這些程序為伺服器。這種方法把核心和服務程式的開發分離開,可以為特定的應用程式或環境要求定製服務程式。微核心方法可以使系統結構的設計更加簡單、靈活,很適合於分散式環境。實質上,微核心可以以相同的方式與本地和遠端的服務程序互動,使分散式系統的構造更為方便。
多執行緒技術是指把執行一個應用程式的程序劃分成可以同時執行的多個執行緒。執行緒和程序有以下差別:
- 執行緒:可分派的工作單元。包括處理器上下文環境(包含程式計數器和棧指標)和棧中自己的資料區域(為允許子程式分支)。執行緒順序執行,並且是可中斷的,這樣處理器可以轉到另一個執行緒。
- 程序:一個或多個執行緒和相關係統資源(如包含資料和程式碼的儲存器空間、開啟的檔案和裝置)的集合。這緊密對應於一個正在執行的程式的概念。通過把一個應用程式分解成多個執行緒,程式設計師可以控制應用程式的模組性和應用程式相關事件的時間安排。
多執行緒對執行許多本質上獨立、不需要序列處理的應用程式是很有用的,例如監聽和處理很多客戶請求的資料庫伺服器。在同一個程序中執行多個執行緒,線上程間來回切換所涉及的處理器開銷要比在不同程序間進行切換的開銷少。執行緒對構造程序是非常有用的,程序作為作業系統核心的一部分,將在第3 章中講述。
到現在為止,大多數單使用者的個人計算機和工作站基本上都只包含一個通用的微處理器。隨著效能要求的不斷增加以及微處理器價格的不斷降低,計算機廠商引進了擁有多個微處理器的計算機。為實現更高的有效性和可靠性,可使用對稱多處理(SMP)技術。對稱多處理不僅指計算機硬體結構,而且指反映該硬體結構的作業系統行為。對稱多處理計算機可以定義為具有以下特徵的一個獨立的計算機系統:
- 有多個處理器。
- 這些處理器共享同一個記憶體和I/O 裝置,它們之間通過通訊匯流排或別的內部連線方案互相連線。
- 所有處理器都可以執行相同的功能(因此稱為對稱)。
近年來,在單晶片上的多處理器系統(也稱為單片多處理器系統)已經開始廣泛應用。無論是單片多處理器還是多片對稱多處理器(SMP),許多設計要點是一樣的。
對稱多處理作業系統可排程程序或執行緒到所有的處理器執行。對稱多處理器結構比單處理器結構具有更多的潛在優勢,如下所示:
- 效能:如果計算機完成的工作可組織為讓一部分工作可以並行完成,那麼有多個處理器的系統將比只有一個同類型處理器的系統產生更好的效能,如圖2.12 所示。對多道程式設計而言,一次只能執行一個程序,此時所有別的程序都在等待處理器。對多處理系統而言,多個程序可以分別在不同的處理器上同時執行。
圖2.12 多道程式設計和多道處理 |
- 可用性:在對稱多處理計算機中,由於所有的處理器都可以執行相同的功能,因而單個處理器的失敗並不會使機器停止。相反,系統可以繼續執行,只是效能有所降低。
- 增量增長:使用者可以通過新增額外的處理器來增強系統的功能。
- 可擴充套件性:生產商可以根據系統配置的處理器的數量,提供一系列不同價格和效能特徵的產品。
特別需要注意的是,這些只是潛在的優點,而不是確定的。作業系統必須提供發掘對稱多處理計算機系統中並行性的工具和功能。
多執行緒和對稱多處理總是被放在一起討論,但它們是兩個獨立的概念。即使在單處理器機器中,多執行緒對結構化的應用程式和核心程序也是很有用的。由於多個處理器可以並行執行多個程序,因而對稱多處理計算機對非執行緒化的程序也是有用的。但是,這兩個設施是互補的,一起使用將會更有效。
對稱多處理技術一個很具有吸引力的特徵是多處理器的存在對使用者是透明的。作業系統負責在多個處理器中排程執行緒或程序,並且負責處理器間的同步。本書講述了給使用者提供單系統外部特徵的排程和同步機制。另外一個不同的問題是給一群計算機(多機系統)提供單系統外部特徵。在這種情況下,需要處理的是一群實體(計算機),每一個都有自己的記憶體、外存和其他I/O 模組。分散式作業系統使使用者產生錯覺,使多機系統好像具有一個單一的記憶體空間、外存空間以及其他的統一存取措施,如分散式檔案系統。儘管叢集正變得越來越流行,市場上也有很多叢集產品,但是,分散式作業系統的技術發展水平落後於單處理器作業系統和對稱多處理作業系統。我們將在第八部分分析這類系統。
作業系統設計的另一個改革是使用面向物件技術。面向物件設計的原理用於給小核心增加模組化的擴充套件上。在作業系統一級,基於物件的結構使程式設計師可以定製作業系統,而不會破壞系統的完整性。面向物件技術還使得分散式工具和分散式作業系統的開發變得更容易。
2.5 虛擬機器
2.5.1 虛擬機器和虛擬化
一般來說,應用程式直接執行在作業系統之上,作業系統之下的硬體可能是個人計算機或是伺服器。但無論是哪個,在同一時間裡只能執行一個作業系統。因此,應用程式提供商必須針對目標執行平臺對程式的一些部分進行相應的修改。而針對這個難題的一種解決辦法就是虛擬化。
虛擬化技術使得一個硬體平臺(個人計算機或者伺服器)可以同時執行多種不同的作業系統或者是同一種作業系統的多個版本。對於具備虛擬化技術的機器來說,可以在單個機器上管理多種應用程式,即使這些應用程式是為不同的作業系統開發的。
本質上,這個機器的主系統可以支援很多虛擬機器,而每一臺虛擬機器可以具備某個特定作業系統的特性,甚至一些虛擬化技術能讓虛擬機器具備特定硬體平臺的特性。
虛擬化技術在處理老版本程式的相容性問題以及通過虛擬化來豐富單臺計算機所能執行的應用程式種類方面特別普遍。不同公司的虛擬機器技術的體系架構不盡相同。下圖是比較典型的架構。
- 虛擬機器管理程式(VMM)執行在宿主作業系統上。模擬硬體裝置的虛擬機器由VMM支援和管理。每個虛擬機器上都執行一個獨立的作業系統。VMM負責管理這些作業系統與真正的處理器、儲存介質及網路之間的通訊。
- 在執行程式時,VMM會將處理器的控制權交給虛擬機器上的作業系統。
- 如果虛擬機器之間需要通訊,大多數情況下虛擬機器會使用虛擬的網路來相互通訊。
- 上述架構最關鍵的優勢是,VMM提供了一個應用透明的、可程式設計的中間層,將應用程式執行環境與下層的物理機和主作業系統分開,從而可以更大地發揮硬體的功能。
2.5.2 虛擬機器架構
。。。
2.6 針對多處理器和多核的作業系統設計考慮因素
。。。
2.6.1 對稱多處理器計算機的作業系統設計考慮因素
。。。
2.6.2 多核計算機的作業系統設計考慮因素
。。。
2.7 微軟windows系統簡介
。。。
2.8 傳統的UNIX系統
。。。
2.9 現代UNIX系統
。。。
2.10 Linux作業系統
。。。
2.11 Linux Vserver虛機器機構
轉載於:https://my.oschina.net/cqlcql/blog/689139