I/O設備的基本概念和分類
什么是I/O設備
“I/O”就是“輸入/輸出”(Input/Output)
I/O設備就是可以將數據輸入到計算機,或者可以接收計算機輸出數據的外部設備,屬於計算機中的硬件部件。
UNIX系統將外部設備抽象為一種特殊的文件,用戶可以使用與文件操作相同的方式對外部設備進行操作。
I/O設備的分類--按使用特性
- 人機交互類外部設備:數據傳輸速度慢
- 存儲設備:數據傳輸速度快
- 網路通信設備:數據傳輸速度介於上述二者之間
I/O設備的分類--按傳輸速率分類
低速設備、中速設備、高速設備
I/O設備的分類--按信息交換的單位分類
- 塊設備:傳輸速率較高,可尋址,即對它可隨機地讀/寫任一塊。
- 字符設備:傳輸速率較慢,不可尋址,在輸入/輸出時常采用中斷驅動方式
I/O控制器
I/O設備的機械部件
I/O設備的機械部件主要用來執行具體I/O操作。
如我們看得見摸得着的鼠標/鍵盤的按鈕;顯示器的LED屏;移動硬盤的磁臂、磁盤盤面。
I/O設備的電子部件通常是一塊插入主板擴充槽的印刷電路板。
I/O設備的電子部件(I/O控制器)
CPU無法直接控制I/O設備的機械部件,因此I/O設備還要有一個電子部件作為CPU和I/O設備機械部件之間的“中介”,用於實現CPU對設備的控制。
這個電子部件就是I/O控制器,又稱設備控制器。CPU可控制I/O控制器,又由I/O控制器來控制設備的機械部件。
I/O控制器的功能:
- 接收和識別CPU發出的命令:如CPU發來的read/write命令,I/O控制器中會有相應的控制寄存器來存放命令和參數
- 向CPU報告設備的狀態:I/O控制器會有相應的狀態寄存器,用於記錄I/O設備的當前狀態。如:1表示空閑,0表示忙碌。
- 數據交換:I/O控制器會設置相應的數據寄存器。輸出時,數據寄存器用於暫存CPU發來的數據,之后再又控制器傳送設備。輸入時,數據寄存器用於暫存設備發來的數據,之后CPU從數據寄存器中取走數據。
- 地址識別:類似於內存的地址,為了區分設備控制器中的各個寄存器,也需要給各個寄存器設置一個特定的“地址”。I/O控制器通過CPU提供的“地址”來判斷CPU要讀/寫的是哪個寄存器。
I/O控制器的組成
值得注意的小細節:
- 一個I/O控制器可能會對應多個設備;
- 數據寄存器、控制寄存器、狀態寄存器可能有多個(如:每個控制/狀態寄存器對應一個具體的設備),且這些寄存器都要有相應的地址,才能方便CPU操作。有的計算機會讓這些寄存器占用內存地址的一部分,稱為內存映射I/O;另一些計算機則采用I/O專用地址,即寄存器獨立編址。
內存映射I/O
內存映射I/O:控制器的寄存器與內存地址統一編址
優點:簡化了指令。可以采用對內存進行操作的指令來對控制進行操作。
寄存器獨立編址
寄存器獨立編址:控制器中的寄存器使用單獨的地址。
缺點:需要設置專門的指令來實現對控制器的操作,不僅要指明寄存器的地址,還要指明控制器的編號。
I/O控制方式
程序直接控制方式
-
完成一次讀/寫操作的流程(見上圖,keyword:輪詢)
-
CPU干預的頻率
很頻繁,I/O操作開始之前、完成之后需要CPU介入,並且在等待I/O完成的過程中CPU需要不斷地輪詢檢查。
-
數據傳送的單位:每次讀/寫一個字。
-
數據的流向
讀操作(數據輸入):I/O設備->CPU->內存
寫操作(數據輸出):內存->CPU->I/O設備
每個字的讀/寫都需要CPU的幫助
-
主要缺點和主要優點
優點:實現簡單。在讀/寫指令之后,加上實現循環檢查的一系列指令即可(因此才稱為“程序直接控制方式”)
缺點:CPU和I/O設備只能串行工作,CPU需要一直輪詢檢查,長期處於“忙等”狀態,CPU利用率低。
中斷驅動方式
引入中斷機制。由於I/O設備速度很慢,因此在CPU發出讀/寫命令后,可將等待I/O的進程阻塞,先切換到別的進行執行。當I/O完成后,控制器會向CPU發出一個中斷信號,CPU檢測到中斷信號后,會保存當前進程的運行環境信息,轉去執行中斷處理程序處理該中斷。處理中斷的過程中,CPU從I/O控制器讀一個字的數據傳送到CPU寄存器,再寫入主存。接着,CPU恢復等待I/O的進程(或其他進程)的運行環境,然后繼續執行。
注意:
- CPU會在每個指令周期的末尾檢查中斷;
- 中斷處理過程中需要保存、恢復進行的運行環境
- 這個過程是需要一定時間開銷的。可見,如果中斷發生的頻率太高,也會降低系統性能。
-
完成一次讀/寫操作的流程(見上圖,keyword:中斷)
-
CPU干預的頻率
很頻繁,I/O操作開始之前、完成之后需要CPU介入
等待I/O完成的過程中CPU可以切換到別的進程執行。
-
數據傳送的單位:每次讀/寫一個字。
-
數據的流向
讀操作(數據輸入):I/O設備->CPU->內存
寫操作(數據輸出):內存->CPU->I/O設備
-
主要缺點和主要優點
優點:與“程序直接控制方式”相比,在“中斷驅動方式”中,I/O控制器會通過中斷信號主動報告I/O已完成,CPU不再需要不停地輪詢。
缺點:每個字在I/O設備與內存之間的傳輸,都需要經過CPU。而頻繁的中斷處理會消耗較多的CPU時間。
DMA方式
與“中斷驅動方式”相比,DMA(Direct Memory Access,直接存儲器存取。主要用於塊設備的I/O控制)有這樣幾個改進:
- 數據的傳送單位是“塊”。不再是一個字、一個字的傳送;
- 數據的流向是從設備直接放入內存,或者從內存直接到設備。不再需要CPU作為“快遞小哥”。
- 僅在傳送一個或多個數據庫的開始和結束時,才需要CPU干預。
DMA控制器:
DR(Data Register,數據寄存器):暫存從設備到內存,或從內存到設備的數據。
MAR(Memory Address Register,內存地址寄存器):在輸入時,MAR表示數據應放到內存中的什么位置;輸出時MAR表示要輸出的數據放在內存中的什么位置。
DC(Data Counter,數據計數器):表示剩余要讀/寫的字節數。
CR(Commadn Register,命令/狀態寄存器):用於存放CPU發來的I/O命令,或設備的狀態信息。
-
完成一次讀/寫操作的流程
-
CPU干預的頻率
僅在傳送一個或多個數據塊的開始和結束時,才需要CPU干預。
-
數據傳送的單位:每次讀/寫一個或多個塊(注意:每次讀寫的只能是連續的多個塊,且這些塊讀入內存后在內存中也必須是連續的)。
-
數據的流向(不再需要經過CPU)
讀操作(數據輸入):I/O設備->內存
寫操作(數據輸出):內存->I/O設備
-
主要缺點和主要優點
優點:數據傳輸以“塊”為單位,CPU介入頻率進一步降低。數據的傳輸不再需要先經過CPU再寫入內存,數據傳輸頻率進一步增加。CPU和I/O設備的並行性得到提升。
缺點:CPU每發出 一條I/O指令,只能讀/寫一個或多個連續的數據塊。如果要讀/寫多個離散存儲的數據庫,或者要將數據分別寫到不同的內存區域時,CPU要分別發出多條I/O指令,進行多次中斷處理才能完成。
通道控制方式
通道:一種硬件,可以理解為是“弱雞版的CPU”。通道可以識別並執行一系列通道指令
與CPU相比,通道可以執行的指令很單一,並且通道程序是放在主機內存中的,也就是說通道與CPU共享內存。
-
完成一次讀/寫操作的流程(見上圖)
-
CPU干預的頻率
極低,通道會根據CPU的指示執行相應的通道程序,只有完成一組數據塊的讀/寫后才需要發出中斷信號,請求CPU干預。
-
數據傳送的單位:每次讀/寫一組數據庫
-
數據的流向(在通道的控制下進行)
讀操作(數據輸入):I/O設備->內存
寫操作(數據輸出):內存->I/O設備
-
主要缺點和主要優點
優點:CPU、通道、I/O設備可並行工作,資源利用率很高。
缺點:實現復雜,需要專門的通道硬件支持。
總結
完成一次讀/寫的過程 | CPU干預頻率 | 每次I/O的數據傳輸單位 | 數據流向 | 優缺點 | |
程序直接控制方式 | CPU發出I/O命令后需要不斷輪詢 | 極高 | 字 | 設備->CPU->內存 內存->CPU->設備 |
每一個階段的優點都是解決了上一階段的最大缺點。總體來說,整個發展過程就是要盡量減少CPU對I/O過程的干預,把CPU從繁雜的I/O控制事務中解脫出來,以便更多地去完成數據處理任務。 |
中斷驅動方式 | CPU發出I/O命令后可以做其他事,本次I/O完成后設備控制器發出中斷信號 | 高 | 字 | 設備->CPU->內存 內存->CPU->設備 |
|
DMA方式 | CPU發出I/O命令后可以做其他事,本次I/O完成后DMA控制器發出中斷信號 | 中 | 塊 | 設備->內存 內存->設備 |
|
通道控制方式 | CPU發出I/O命令后可以做其他事。通道會執行通道程序以完成I/O,完成后通道向CPU發出中斷信號 | 低 | 一組塊 | 設備->內存 內存->設備 |
I/O軟件層次結構
用戶層軟件
庫函數:用戶層軟件實現了與用戶交互的接口,用戶可直接使用該層提供的、與I/O操作相關的庫函數對設備進行操作。
系統調用:用戶層軟件將用戶請求翻譯成格式化的I/O請求,並通過“系統調用”請求操作系統內核的服務。
Windows操作系統向外提供的一系列系統調用,但是由於系統調用的格式嚴格,使用麻煩,因此在用戶層上封裝了一系列更方便的庫函數接口供用戶使用(Windows API)
設備獨立性軟件
設備獨立性軟件,又稱設備無關性軟件。與設備的硬件特性無關的功能幾乎都在這一層實現。
主要實現的功能:
-
向上層提供統一的調用接口(如:read/write系統調用)
-
設備的保護:原理類似於文件保護。設備被看做事一種特殊的文件,不同用戶對各個文件的訪問權限是不一樣的,同理,對設備的訪問權限也不一樣。
-
差錯處理:設備獨立性軟件需要對一些設備的錯誤進行處理。
-
設備的分配與回收
-
數據緩沖區管理:可以通過緩沖技術屏蔽設備之間數據交換單位大小和傳輸速度的差異。
-
建立邏輯設備名到物理設備名的映射關系;根據設備類型進行調用相應的驅動程序。
用戶或用戶層軟件發出I/O操作相關系統調用的系統調用時,需要指明此次要操作的I/O設備的邏輯設備名
設備獨立性軟件需要通過對“邏輯設備表(LUT,Logical Unit Table)”來確定邏輯設備對應的物理設備,並找到該設備對應的設備驅動程序。
操作系統可以采用兩種方式管理邏輯設備表(LUT):
第一種方式,整個系統只設置一張LUT,這就意味着所有用戶不能使用相同的邏輯設備名,因此這張方式只適用於單用戶操作系統。
第二種方式,為每個用戶設置一種LUT,各個用戶使用的邏輯設備名可以重復,適用於多用戶操作系統。系統會在會用登陸時為其建立一個用戶管理進程,而LUT就存放在用戶管理進程的PCB中。
設備驅動程序
不同設備的內部硬件特性也不同,這些特性只有廠家才知道,因此廠家須提供與設備相對應的驅動程序,CPU執行驅動程序的指令序列,來完成設置設備寄存器,檢查設備狀態等工作。
設備驅動程序主要負責對硬件設備的具體控制,將上層發出的一系列命令(如read/write)轉化成特定設備“聽得懂”的一系列操作。包括設置設備寄存器;檢查設備狀態等。
注:驅動程序一般會議一個獨立進程的方式存在。
中斷處理程序
當I/O任務完成時,I/O控制器會發送一個中斷程序,系統會根據中斷信號類型找到相應的中斷處理程序並執行。中斷處理程序的處理流程如下:
硬件
執行I/O操作,有機械部件,電子部件組成
理解並記住I/O軟件各個層次之間的順序,要能夠推理判斷某個處理應該是在哪個層次完成的(最常考的是設備獨立性軟件、設備驅動程序這兩層。只需理解一個特點即可:直接涉及到硬件具體細節、且與中斷無關的操作肯定是在設備驅動程序層完成的;沒有涉及硬件的、對各個設備都需要進行的管理工作都是在設備獨立性軟件層完成)
I/O核心子系統
I/O調度:用某種算法確定一個好的順序來處理各個I/O請求。
同理,打印機等設備也可以用來先來先服務算法、優先級算法、短作業優先等算法來確定I/O調度順序。
操作系統需要實現文件保護功能,不同的用戶對各個文件有不同的訪問權限(如:只讀、讀和寫等)。
在UNIX系統中,設備被看做是一種特殊的文件,每個設備也會有對應的FCB。當用戶請求訪問某個設備時,系統根據FCB中記錄的信息來判斷該用戶是否有相應的訪問權限,依次實現“設備保護”的功能。
假脫機技術
脫機技術
批處理階段引入了脫機輸入/輸出技術(用磁帶完成):
引入脫機技術后,緩解了CPU與慢速I/O設備的速度矛盾。另一方面,即使CPU在忙碌,也可以提前將數據輸入到磁帶;即使慢速的輸出設備正在忙碌,也可以提前將數據輸出到磁帶。
假脫機技術--輸入井和輸出井
“假脫機技術”,又稱“SPOOLing技術”,用軟件的方式模擬脫機技術。SPOOLing系統的組成如下:
要實現SPOOLing技術,必須要有多道程序技術的支持。系統會建立“輸入進程”和“輸出進程”。
輸入/輸出進程:模擬脫機輸入/輸出時的外圍控制機。
輸入/輸出井:模擬脫機輸入/輸出時的磁帶。
輸入緩沖區:在輸入進程的控制下,“輸入緩沖區”用於暫存從輸入設備輸入的數據,之后再轉存到輸入井中。
輸出緩沖區:在輸出進程的控制下,“輸入緩沖區”用於暫存從輸出井送來的數據,之后再傳送到輸出設備上。
注意:輸入/輸出緩沖區是在內存中的緩沖區。
共享打印機原理分析
獨占式設備--只允許各個進程串行使用的設備。一段時間內只能滿足一個進程的請求。
共享設備--允許多個進程“同時”使用的設備(宏觀上同時使用,微觀上可能時交替使用)。可以是同時滿足多個進程的使用請求。
當多個用戶進程提出輸出打印的請求時,系統會答應它們的請求,但是並不是真正把打印機分配給他們,而是由假脫機管理進程為每個進程做兩件事:
- 在磁盤輸出井中為進程申請一個空閑緩沖區(也就是說,這個緩沖區是在磁盤上的),並將要打印的數據送入其中;
- 為用戶進程申請一張空白的打印請求表,並將用戶的打印請求填入表中(其實就是用來說明用戶的打印數據存放位置等信息的),再將該表掛到假脫機文件隊列上。
當打印機空閑時,輸出進行會從文件隊列的隊頭取出一張打印請求表,並根據表中的要求將要打印的數據從輸出井傳送到輸出緩沖區,再輸出到打印機進行打印。用這種方式可依次處理完全部的打印任務。
雖然系統中只有一台打印機,但每個進程提出打印請求時,系統都會為在輸出井中為其分配一個存儲區(相當於分配了一個邏輯設備),是每個用戶進程都覺得自己在獨占一台打印機,從而實現對打印機的共享。
SPOOLing技術可以把一台物理設備虛擬成邏輯上的多台設備,可將獨占式設備改造成共享設備。
設備的分配與回收
設備分配時應考慮的因素
設備的固有屬性:可分為三種獨占設備、共享設備、虛擬設備。
設備的分配算法:先來先服務、優先級高者優先、短任務優先...
設備分配中的安全性:
從進程運行中的安全性上考慮,設備分配由兩種方式:
安全分配方式:為進程分配一個設備后就將進程阻塞,本次I/O完成后才將進程喚醒。
一個時段內每個進程只能使用一個設備。
優點:破環了“請求和保持”條件,不會死鎖。
缺點:對於一個進程來說,CPU和I/O設備只能串行工作。
不安全分配方式:進程發出I/O請求后,系統為其分配I/O設備,進程可繼續執行,之后還可以發出新的I/O請求。只有某個I/O請求得不到滿足時才將進程阻塞。
一個進程可以同時使用多個設備
優點:進程的計算任務和I/O任務可以並行處理,使進程迅速推進
缺點:有可能發生死鎖(死鎖避免、死鎖的檢測和接觸)
靜態分配和動態分配
靜態分配:進程運行前為其分配全部所需資源,運行結束后歸還資源。(破環了“請求和保持”條件,不會死鎖。)
動態分配:進程運行過程中動態申請設備資源。
設備分配管理中的數據結構
設備控制板(DCT):系統為每個設備配置一張DCT,用於記錄設備情況。
控制器控制板(COCT):每個設備控制器都會對應一張COCT。操作系統根據COCT的信息對控制器進行操作和管理。
通道控制板(CHCT):每個通道都會對應一張CHCT。操作系統根據CHCT的信息對通道進行操作和管理。
系統設備表(SDT):記錄了系統中全部設備的情況,每個設備對應一個表目。
設備分配的步驟
- 根據進程請求的物理設備名查找SDT(注:物理設備名是進程請求分配設備時提供的參數)
- 根據SDT找到DCT,若設備忙碌則將進程PCB掛到設備等待隊列中,不忙碌則將設備分配給進程。
- 根據DCT找到COCT,若控制器忙碌則將進程PCB掛到控制器等待隊列中,不忙碌則將控制器分配給進程。
- 根據COCT找到CHCT,若通道忙碌則將進程PCB掛到通道等待隊列中,不忙碌則將通道分配給進程。
注:只有設備、控制器、通道三者都分配成功時,這次設備分配才算成功,之后便可以啟動I/設備進行數據傳送。
設備分配的步驟的改進
缺點:
- 用戶編程時必須使用“物理設備名”,底層細節對用戶不透明,不方便編程
- 若換了一個物理設備,則程序無法運行
- 若進程請求的物理設備正在忙碌,則即使系統中還有同類型的設備,進程也必須阻塞等待。
改進方法:建立邏輯設備名與物理設備名的映射機制,用戶編程時只需提供邏輯設備名。
改進后的步驟:
- 根據進程請求的邏輯設備名查找SDT(注:用戶編程時提供的邏輯設備名其實就是“設備類型”)
- 查找SDT,找到用進程指定類型的、並且空閑的設備,將其分配給該進程。操作系統在邏輯設備表(LUT)新增一個表項。
- 根據DCT找到COCT,若控制器忙碌則將進程PCB掛到控制器等待隊列中,不忙碌則將控制器分配給進程。
- 根據COCT找到CHCT,若通道忙碌則將進程PCB掛到通道等待隊列中,不忙碌則將通道分配給進程。
邏輯設備表(LUT)建立了邏輯設備名與物理設備名之間的映射關系。
某用戶進程第一次使用設備時使用邏輯設備名向操作系統發出請求,操作系統根據用戶進程指定的設備類型(邏輯設備名)查找系統設備表,找到一個空閑設備分配給進程,並在LUT中增加相應表項。
如果之后用戶進程再次通過相同的邏輯設備名請求使用設備,則操作系統通過LUT表即可知道用戶進程實際要使用的是哪個物理設備,並且也知道該設備的驅動程序入口地址。
邏輯設備表的設置問題:
整個系統只有一張LUT:各用戶所用的邏輯設備名不允許重復,適用於單用戶操作系統。
每個用戶一張LUT:不同用戶的邏輯設備名可重復,適用於多用戶操作系統。
緩沖區管理
什么是緩沖區
緩沖區是一個存儲區域,可以由專門的硬件寄存器組成,也可利用內存作為緩沖區。
使用硬件作為緩沖區的成本較高,容量也較小,一般僅用在對速度要求非常高的場合(如存儲管理中所用的聯想寄存器,由於對頁表的訪問頻率極高,因此使用速度很快的聯想寄存器來存放頁表項的副本)
一般情況下,更多的是利用內存作為緩沖區,“設備獨立性軟件”的緩沖區管理就是要管理好這些緩沖區。
緩沖區的作用
-
緩和CPU與I/O設備之間的速度不匹配的矛盾:
-
減少對CPU的中斷頻率,放寬對CPU中斷相應時間的限制
-
解決速度粒度不匹配的問題:如輸出進程每次可以生成一塊數據,但I/O設備每次只能輸出一個字符。
-
提高CPU與I/O設備之間的並行性
單緩沖
假設某用戶進程請求某種塊設備讀入若干塊的數據。若才采用單緩沖的策略,操作系統會在主存中為其分配一個緩沖區(若題目中沒有特別說明,一個緩沖區的大小就是一個塊)。
注意:當緩沖區數據非空時,不能往緩沖區沖入數據,只能從緩沖區把數據傳出;當緩沖區為空時,可以往緩沖區沖入數據,但必須把緩沖區充滿以后,才能從緩沖區把數據傳出。
常考題型:計算每處理一塊數據平均需要多久?
技巧:假定一個初始狀態,分析下次到達相同狀態需要多少時間,這就是處理一塊數據平均所需時間。
結論:采用單緩沖策略,處理一塊數據平均耗時Max(C,T)+M
雙緩沖
假設某用戶進程請求某種塊設備讀入若干塊的數據。若才采用雙緩沖的策略,操作系統會在主存中為其分配兩個緩沖區(若題目中沒有特別說明,一個緩沖區的大小就是一個塊)。
結論:采用雙緩沖策略,處理一個數據塊的平均耗時為Max(T,C+M)
使用單/雙緩沖在通信時的區別
兩台機器之間通信時,可以配置緩沖區用於數據的發送和接受。
顯然,若兩個相互通信的機器只設置單緩沖區,在任一時刻只能實現數據的單向傳輸。
若兩個相互通信的機器設置雙緩沖區,則同一時刻可以實現雙向的數據傳輸。
注:管道通信中的“管道”其實就是緩沖區。要實現數據的雙向傳輸,必須設置兩個管道。
循環緩沖區
將多個大小相等的緩沖區鏈接成一個循環隊列。
注:以下圖示,橙色表示已充滿數據的緩沖區,綠色表示空緩沖區。
緩沖池
緩沖區由系統中共同的緩沖區組成。這些緩沖區按使用狀況可以分為:空緩沖隊列、裝滿輸入數據的緩沖隊列(輸入隊列)、裝滿輸出數據的緩沖隊列(輸出隊列)。
另外,根據一個緩沖區在實際運算中扮演的功能不同,又設置了四種工作緩沖區;用於收容輸入數據的工作緩沖區(hin)、用於提取輸入數據的工作緩沖區(sin)、用於收容輸出數據的工作緩沖區(hout)用於提取輸出數據的工作緩沖區(sout)
①輸入進程請求輸入數據:
從空緩沖隊列中取出一塊作為收容輸入數據的工作緩沖區(hin)。沖滿數據后將緩沖區掛到輸入隊列隊尾
②計算進程想要取得一塊輸入數據:
從輸入隊列中取得一塊沖滿輸入數據的緩沖區作為“提取輸入數據的工作緩沖區(sin)”。緩沖區讀空后掛到空緩沖區隊列。
③計算進程想要將准備好的數據沖入緩沖區:
從空緩沖隊列中取出一塊作為“收容輸出數據的工作緩沖區(hout)”。沖滿數據后將緩沖區掛到輸出隊列隊尾
①輸出進程請求輸入數據:
從輸出隊列中取得一塊沖滿輸出數據的緩沖區作為“提取輸出數據的工作緩沖區(sout)”。緩沖區讀空后掛到空緩沖區隊列。