電腦輸入輸出系統摘自《作業系統精髓與設計原理》
BY William Stallings
劉建文略譯(http://blog.csdn.net/keminlau
)
KEY:功能 邏輯分層 功能分步 系統
INTRO
I/O子系統可能是作業系統設計最麻煩的部分了。因為硬體裝置和應用都是多種多樣的,很難為其設計一套通用和統一的解決方案。本部分按照由一般到特殊的順序講述I/O子系統相關的內容。
- 首先從最一般的I/O結構開始,也就是在電腦體繫結構(computer architecture)的有關I/O組織與功能;
- 接著是作業系統裡的I/O系統實現,內容包括I/O設計目標、I/O功能的結構化方式、I/O緩衝功能詳細(緩衝功能是作業系統提供基本的I/O服務,有助於提高I/O整體效能)等。
- 下一部分特別講講更特殊的具體的磁碟I/O。現代電腦中磁碟I/O在系統整體效能中起著重要的作用(第一,現在很多的應用都資料處理集中的;第二,多道程式功能需要快速的外存輔助等)。
I/O裝置
I/O裝置分類方式有很多種,其中一種是分成以下三大類:人可讀裝置、機器可讀裝置和通訊裝置。
- 人可讀裝置:這種裝置是面向人面向使用者的,與使用者互動的裝置,像印表機、顯示器、鍵盤和終端等
- 機器可讀裝置:這種裝置是面向機器的,互動時沒有使用者介入,像磁碟機、感應器、裝置的控制器(控制器是裝置的一部分,但也可單獨出來成為一種裝置,像主板的很多晶片實現了很多控制器)等。
- 通訊裝置:這種裝置也是面向機器的,互動時沒有使用者介入,但是互動的對象不在本地。像網卡、貓。
這三類裝置不僅在各大類之間裝置差異性很大,同一類內的各種裝置的差異也是很大的(所以這種分類對是I/O系統的設計顯然是初步的),它們之間的差異關鍵點如下:
- 資料轉送率(data rate):各種裝置間資料轉送率可能達一個到幾個數量級的差別,看;
- 應用(application):裝置的使用方式上的差異也會影響其它配套的軟體和作業系統對這些裝置實施的管理原則(policy)的不同。比如為了讓磁碟裝置實現以檔案方式儲存資料,作業系統必須為磁碟裝置設定檔管理軟體(像檔案系統);為了讓磁碟裝置用作虛擬記憶體,作業系統和CPU都要聯合提供一些虛擬記憶體硬體和軟體設施。再舉一個終端裝置的例子。使用終端的使用者可能是一般的使用者,也可能是管理員。這意味著作業系統得為終端裝置實施不同使用特權層級和不同優先順序別的軟體策略。
- 操控的複雜度(complexity of controls):不同的裝置的控制介面肯定不一樣,像印表機只需要很簡單的控制介面,但像磁碟這樣的,控制介面則會很複雜。存在不同的控制介面複雜度的結果是,作業系統必須把部分I/O控制硬體化,做進一個叫I/O模組的控制器, I/O模組面對裝置的一端負責裝置專用的控制規則,另一端提供一致的介面給作業系統(驅動程式)控制。
- 傳輸單元(unit of transfer):裝置傳輸的資料可能是字元流(位元組流),或者是很大的資料區塊。
- 資料編碼(data representation):不同的裝置使用不同的編碼方案,包括字元集和同位規則。
- 錯誤偵測(error conditions):裝置產生的錯誤的性質、報告方式、處理方法都是不盡相同的。
無論是從作業系統角度還是從使用者進程的角度看,為如此多樣化的裝置設計一套統一的I/O系統都是很困難的。
I/O功能的變革
電腦技術日新月異,電腦系統及各獨立組件的演變表現出一定的模式。I/O功能的演變最明顯。下面是I/O功能演變過程的概況:
Direct Memory Access
展示了DMA最一般的邏輯構成。與CPU一樣,DMA也是電腦的邏輯單元(組件),負責接替CPU完成部分系統功能——控制系統匯流排並進行記憶體資料傳送。通常,DMA模組必須只在CPU不需要使用匯流排時工作,或者強迫CPU臨時掛起操作後工作。後者被稱為周期竊取或周期挪用。
DMA技術工作過程是這樣的。當CPU要讀或寫一塊資料時,它向DMA模組發出一條命令,內容如下:
- 操作命令(讀或寫),通過CPU與DMA模組之間的讀寫控制線(read or write control line);
- 待傳輸的I/O裝置的地址,通過資料線(data line)傳送;
- 待讀寫的記憶體起始地址,通過資料線傳送並儲存到DMA的地址寄存器(address register)中;
- 待讀寫的資料資料量,通過資料線傳送並儲存到DMA的資料計數寄存器(data count register)中;
當完整的下達DMA命令後,CPU繼續自己的工作,與DMA控制器這個特殊的處理器並行工作。DMA控制器負責傳送大塊資料(一次一字)進出記憶體,無須CPU幹涉。當傳輸完成後,DMA會發送一個中斷訊號給CPU表示完成;因此在資料轉送的全程中,CPU只涉及傳輸開始和結束處理。
展示了CPU在指令周期何處被掛起。CPU在試圖使用被DMA佔用的匯流排時被掛起。DMA然後在傳輸完一個字後把控制權交還給CPU。注間這個過程並不是中斷,CPU並不保持上下文資訊或做其它動作,CPU只是被暫停了一個匯流排周期。整體效果是感覺CPU運行慢了(KEMIN:因為是共用匯流排,多少要有點代價)。雖然如此,在傳輸大塊資料的情況時,DMA還是要比中斷方式或編程I/O有效得多。
DMA機制可以按需要配置(configured)成各種不同的模式。展示了幾種可能的模式。在第一種模式中,電腦的所有模組共用單一的匯流排。DMA模組扮演著代理(surrogate)的角色,負責使用編程I/O的方式交換記憶體和I/O模組間的資料。這種配置模式顯然是很經濟的,效率低下也是很明顯的。因為使用編程I/O的方式,每傳輸一個字都消耗兩個匯流排周期。
提高效率的通用手法是把通用的東西改為專用的。所以通過給I/O模組整合DMA可以大大的降低傳輸所需的匯流排周期。中的第二種配置模式,DMA模組與一個或幾個I/O模組之間有單獨的非系統匯流排通路(path)。DMA邏輯上是I/O模組的一部分,或者是獨立的模組,但是負責控制部分I/O模組。這個思想可以往前推進一步,把所有I/O模組用單獨的I/O匯流排連結到DMA模組,看第三種配置模式。通過共用I/O匯流排,把串連DMA的介面降低到一個,這樣提供一種極易擴充的配置方式(KEMIN:看原文,具體如何配置沒講)。在後兩種配置模式裡,DMA與CPU、記憶體共用的系統匯流排只用於傳送從CPU到DMA的控制訊號和DMA與記憶體間資料資訊,DMA和I/O模組間的資料轉送完全被移離系統匯流排。
作業系統設計 設計目標
I/O系統設計有兩個至高(paramount)的目標:效率(efficiency)和通用性(generality)。效率的重要性體現在I/O操作已經成為目前電腦效能的第一大瓶頸。
由本文第一張圖可見,輸入輸出裝置的速度遠遠慢於記憶體和處理器。解決辦法之一就是引入多道程式,使得一些進程等待IO操作時,另一些進程可以繼續執行。雖然現今的機器記憶體已經相當的大了,但是I/O操作常常還是跟不上處理器。而為了讓處理器操持忙碌,引入對換(swapping)機制把額外就緒的進程從磁碟調入記憶體執行,可是這個動作本身就是I/O操作。所以I/O系統設計主要目標是試圖提高效率。由於磁碟I/O的重要性,這方面也是受到最多的關注,本章主要研究磁碟I/O的效率。
另一個主要目標是通用性。為了追求簡單性和降低輸入輸入出的錯誤,人們想使用一致的方式處理輸入輸入出。包括面向使用者進程的介面和作業系統的管理介面。因為裝置的差異性(diversity),實踐中上很難做到真正的一致。實際上能做到的是利用分層的模組化的方法設計I/O功能(function)。這種方法把裝置I/O操作的細節隱藏入一些低層級的常式中,而使用者進程和高一級的作業系統把裝置看成一系列通用功能,如read,write,open,close,lock,unlock。
I/O功能的邏輯分層結構
在討論系統結構的時候,我們看到了現代作業系統是分層結構的。分層的指導原則是,作業系統各層必鬚根據功能複雜度、時間配量(time scale)特性和抽象層級進行分隔。分層思想把作業系統分成數層,每一層負責實現作業系統功能的一個子集(KEMIN:如果是分層的話,這個功能子集不應該是橫向,而應該是縱向的,不是嗎?如果回答是肯定,那不能叫子集,叫某一個功能的某一步,是嗎?)。高一層的功能的實現有賴於低一層提供的原始操作原始功能,而這一層本身對這些原始的操作進行封裝提供給更高一層的功能的實現。在理想的情況下,各層通過介面互操作,一層的修改都不影響另一層。分層思想使我們可以把複雜的大問題分解成多個可管理的小問題。
通常,層次更低的操作工作在更短的時間配量(time scale)內。比如,作業系統的一些部分是直接與硬體互動的,而這些互動操作的時間配量一般在十億分之一秒;而互動的另一端,作業系統與使用者互動則在數秒之內。這種情況是使用分層思想的理想之地。
分層思想應用於I/O系統時有如的分層結構。結構的具體詳細可能會因不同的裝置和應用而有所不同。圖中展示的是最重要的三種邏輯分層結構:本地外圍裝置、通訊連接埠和檔案系統。
我們來分析最簡單的I/O例子——通過字元流或記錄流通訊的本地外圍裝置:
邏輯I/O層:顧名思義,本層提供的I/O是邏輯的(包括邏輯資源和邏輯操作),是對具體的I/O資料和控制進行封裝,為使用者進行提供簡易介面,比如裝置標識和裝置操作命令open,close,read,write等。
裝置I/O層:來自邏輯層的資料(緩衝的字元和記錄)和操作請求會在本層被轉譯成相應的I/O指令序列、通道命令(channel commands)和控制器命令(controller orders)。緩衝技術會在本層實現,用來提高效能。
調度與控制層(scheduling and control):作業系統對I/O操作的排隊與調度發生在本層,也包括對操作的控制。因此,中斷處理和I/O狀態報表也發生在本層。本層是軟體層中最底的一層,是與硬體進行實際互動的一層。
在通訊裝置的例子中,分層結構與外圍裝置很類似,只是邏輯I/O被替換成通訊架構(communications architecture)。通訊架構本身也由一系列邏輯層組成,比如我們熟知的七層的開放系統互連接構(OSI)。
在檔案系統的例子中,有三層是以上兩個例子的分層結構所沒有的,它們是:
目錄管理層:在這一層中,檔案名稱符號被轉換為一個標識,這標識通過一個檔案描述符或索引表直接或間接地引用一個檔案。本層也會處理面向使用者的一些檔案目錄操作,比如添加、刪除和重組。
檔案系統層:本層處理檔案的邏輯結構和面向使用者的一些檔案操作,像open, close, read, write。檔案存取權限管理也在這一層實現。
物理組織層:就像虛擬記憶體地址通過分段和分頁結構轉為實體記憶體地址一樣,對檔案或記錄的邏輯引用也必須通過檔案的物理軌道和扇區結構轉換為外存的物理地址。外存空間管理以及外存緩衝管理功能也在這一層實現。