設備管理的對象主要是I/O 設備,及設備控制器和I/O 通道。設備管理為了完成用戶提出的I/O 請求,提高I/O 速率以及提高I/O 設備的利用率。設備管理的主要功能有: 緩沖區管理、設備分配、設備處理、虛擬設備及實現設備獨立性等。I/O 系統中包括有用於實現信息輸入、輸出和存儲功能的設備和相應的設備控制器,在有的大、中型機中,還有I/O 通道或I/O 處理機。
I/O系統
I/O設備分類
塊設備用於存儲信息,信息的存取總是以數據塊為單位,它屬於有結構設備。典型的塊設備是磁盤,每個盤塊的大小為512 B~4 KB。磁盤設備的基本特征是其傳輸速率較高,可尋址。磁盤設備的I/O 常采用DMA方式。
字符設備用於數據的輸入和輸出,其基本單位是字符,它屬於無結構類型。字符設備的種類繁多,如交互式終端、打印機等。字符設備的基本特征是其傳輸速率較低,不可尋址。字符設備在輸入/輸出時,常采用中斷驅動方式。
設備控制器
設備並不是直接與CPU 進行通信,而是與設備控制器通信,因此,在I/O 設備中應含有與設備控制器間的接口,數據信號線、控制信號線和狀態信號線。
設備控制器是計算機中的一個實體,其主要職責是控制一個或多個I/O 設備,以實現I/O設備和計算機之間的數據交換。設備控制器是一個可編址的設備(每個設備都有唯一的地址)。設備控制器的基本功能:接收和識別命令(為此內含控制寄存器和譯碼器)、數據交換(內含數據寄存器)、標識和報告設備狀態(內含狀態寄存器)、地址識別(內含地址譯碼器)、數據緩沖(內含緩沖器)、差錯控制。控制器的組成如下圖,包扣設備控制器與處理機接口(共有三類信號線: 數據線、地址線和控制線)、設備控制器與設備的接口(數據、控制和狀態三種信號)、I/O邏輯(用於實現對設備的控制。它通過一組控制線與處理機交互,處理機利用該邏輯向控制器發送I/O 命令;I/O 邏輯對收到的命令進行譯碼)。
I/O 通道是一種特殊的處理機,它具有執行I/O 指令的能力,並通過執行通道(I/O)程序來控制I/O 操作。I/O 通道與一般的處理機 一是其指令類型單一;二是通道沒有自己的內存,通通道與CPU共享內存。I/O通道的目的是為了減少CPU的負擔,CPU只需要發送簡單指令給I/O通道,剩余控制交給I/O通道。通到的類型有:字節多路通道(子通道按時間片輪轉方式共享主通道)、數組選擇通道(主通道在一段時間內有一個程序獨占)、數組多路通道(結合上述兩種)。 解決I/O“瓶頸”問題的有效方法,便是增加設備到主機間的通路而不增加通道,如換言之,就是把一個設備連接到多個控制器上,而一個控制器又連接到多個通道上。
總線
- ISA(Industry Standard Architecture)總線
- EISA(Extended ISA)總線
- 局部總線(是指將多媒體卡、高速LAN 網卡、高性能圖形板等,從ISA 總線上卸下來,再通過局部總線控制器直接接到CPU 總線上,使之與高速CPU 總線相匹配。如VESA(Video Electronic Standard Association)總線、PCI(Peripheral Component Interface)總線隨)
I/O控制方式
I/O的控制方式有:程序I/O方式、中斷驅動I/O控制方式、DMA I/O控制方式、I/O通道控制方式。
程序I/O方式
程序IO方式是早期使用,或稱為忙——等待方式。在處理機向控制器發出一條I/O 指令啟動輸入設備輸入數據時,要同時把狀態寄存器中的忙/閑標志busy置為1,然后便不斷地循環測試busy。當busy=1 時,表示輸入機尚未輸完一個字(符),直至busy=0,表明輸入機已將輸入數據送入控制器的數據寄存器中。於是處理機將數據寄存器中的數據取出,送入內存指定單元中,這樣便完成了一個字(符)的I/O。由於CPU的高速性和I/O 設備的低速性,致使CPU的絕大部分時間處於等待和循環測試中。CPU 之所以要不斷地測試I/O 設備的狀態,就是因為在CPU 中無中斷機構,使I/O 設備無法向CPU報告它已完成了一個字符的輸入操作。
中斷驅動I/O控制方式
當某進程要啟動某個I/O 設備工作時,便由CPU向相應的設備控制器發出一條I/O 命令,然后立即返回繼續執行原來的任務。設備控制器於是按照該命令的要求去控制指定I/O 設備,一旦數據進入數據寄存器,控制器便通過控制線向CPU發送一中斷信號,由CPU檢查輸入過程中是否出錯,若無錯,便向控制器發送取走數據的信號,然后再通過控制器及數據線將數據寫入內存指定單元中。
直接存儲器訪問(DMA)I/O控制方式
該方式的特點:(1) 數據傳輸的基本單位是數據塊,即在CPU 與I/O 設備之間,每次傳送至少一個數據塊;(2) 所傳送的數據是從設備直接送入內存的,或者相反;(3) 僅在傳送一個或多個數據塊的開始和結束時,才需CPU 干預,整塊數據的傳送是在控制器的控制下完成的。
DMA 控制器如圖由三部分組成:主機與DMA 控制器的接口;DMA 控制器與塊設備的接口;I/O 控制邏輯。其中命令/狀態寄存器(CR),用於接收從CPU 發來的I/O 命令,或有關控制信息,或設備的狀態。(2) 內存地址寄存器(MAR),在輸入時,它存放把數據從設備傳送到內存的起始目標地址;在輸出時,它存放由內存到設備的內存源地址。(3) 數據寄存器(DR),用於暫存從設備到內存,或從內存到設備的數據。(4) 數據計數器(DC),存放本次CPU要讀或寫的字(節)數。
IO通道方式
I/O 通道方式是DMA方式的發展,它可進一步減少CPU的干預,即把對一個數據塊的讀(或寫)為單位的干預減少為對一組數據塊的讀(或寫)及有關的控制和管理為單位的干預。通道是通過執行通道程序,並與設備控制器共同實現對I/O 設備的控制的。
緩沖管理
為了緩和CPU與I/O 設備速度不匹配的矛盾,減少對CPU的中斷頻率放寬對CPU中斷響應時間的限制,提高CPU和I/O 設備的並行性,幾乎所有的I/O 設備在與處理機交換數據時都用了緩沖區。緩沖管理的主要職責是組織好這些緩沖區,並提供獲得和釋放緩沖區的手段。
單緩沖情況下,每當用戶進程發出一I/O 請求時,操作系統便在主存中為之分配一緩沖區。由於T 和C 是可以並行的,當T>C 時,系統對每一塊數據的處理時間為M+T,反之則為M+C,故可把系統對每一塊數據的處理時間表示為Max(C,T)+M。
雙緩沖
循環緩沖
當輸入與輸出或生產者與消費者的速度基本相匹配時,采用雙緩沖能獲得較好的效果,可使生產者和消費者基本上能並行操作。但若兩者的速度相差甚遠,雙緩沖的效果則不夠理想,不過可以隨着緩沖區數量的增加,使情況有所改善。在循環緩沖中包括多個緩沖區,其每個緩沖區的大小相同。作為輸入的多緩沖區可分為三種類型:用於裝輸入數據的空緩沖區R、已裝滿數據的緩沖區G 以及計算進程正在使用的現行工作緩沖區C。作為輸入的緩沖區可設置三個指針:用於指示計算進程下一個可用緩沖區G 的指針Nextg、指示輸入進程下次可用的空緩沖區R的指針Nexti,以及用於指示計算進程正在使用的緩沖區C的指針。Current。
當Nexti 指針追趕上Nextg 指針。這意味着輸入進程輸入數據的速度大於計算進程處理數據的速度,已把全部可用的空緩沖區裝滿,再無緩沖區可用。此時,輸入進程應阻塞,直到計算進程把某個緩沖區中的數據全部提取完,使之成為空緩沖區R,並調用Releasebuf過程將它釋放時,才將輸入進程喚醒。這種情況被稱為系統受計算限制。
Nextg 指針追趕上Nexti 指針。這意味着輸入數據的速度低於計算進程處理數據的速度,使全部裝有輸入數據的緩沖區都被抽空,再無裝有數據的緩沖區供計算進程提取數據。這時,計算進程只能阻塞,直至輸入進程又裝滿某個緩沖區,並調用Releasebuf 過程將它釋放時,才去喚醒計算進程。這種情況被稱為系統受I/O 限制。
緩沖池
上述的緩沖區僅適用於某特定的I/O 進程和計算進程,因而它們屬於專用緩沖。當系統較大時,將會有許多這樣的循環緩沖,這不僅要消耗大量的內存空間,而且其利用率不高。為了提高緩沖區的利用率,目前廣泛流行公用緩沖池(Buffer Pool),在池中設置了多個可供若干個進程共享的緩沖區。
(1) 收容輸入。在輸入進程需要輸入數據時,便調用Getbuf(emq)過程,從空緩沖隊列emq 的隊首摘下一空緩沖區,把它作為收容輸入工作緩沖區hin。然后,把數據輸入其中,裝滿后再調用Putbuf(inq,hin)過程,將該緩沖區掛在輸入隊列inq 上。
(2) 提取輸入。當計算進程需要輸入數據時,調用Getbuf(inq)過程,從輸入隊列inq 的隊首取得一個緩沖區,作為提取輸入工作緩沖區(sin),計算進程從中提取數據。計算進程用完該數據后,再調用Putbuf(emq,sin)過程,將該緩沖區掛到空緩沖隊列emq 上。
(3) 收容輸出。當計算進程需要輸出時,調用Getbuf(emq)過程從空緩沖隊列emq 的隊首取得一個空緩沖區,作為收容輸出工作緩沖區hout。當其中裝滿輸出數據后,又調用Putbuf(outq,hout)過程,將該緩沖區掛在outq 末尾。
(4) 提取輸出。由輸出進程調用Getbuf(outq)過程,從輸出隊列的隊首取得一裝滿輸出數據的緩沖區,作為提取輸出工作緩沖區sout。在數據提取完后,再調用Putbuf(emq,sout)過程,將該緩沖區掛在空緩沖隊列末尾。
I/O軟件
I/O軟件設計目標:與具體設備無關、統一命名、對錯誤的處理、緩沖技術、設備的分配與釋放、I/O控制方式。I/O軟件普遍采用層次結構,在層次式結構的I/O 軟件中,只要層次間的接口不變,對每個層次中的軟件進行的修改都不會引起其下層或高層代碼的變更,僅最低層才會涉及到硬件的具體特性。
中斷處理程序
中斷處理層的主要工作有:進行進程上下文的切換,對處理中斷信號源進行測試,讀取設備狀態和修改進程狀態等。
通常由硬件自動將處理機狀態字PSW 和程序計數器(PC)中的內容,保存在中斷保留區(棧)中,然后把被中斷進程的CPU現場信息(即包括所有的CPU寄存器,如通用寄存器、段寄存器等內容)都壓入中斷棧中。
設備驅動程序
設備驅動程序通常又稱為設備處理程序,它是I/O 進程與設備控制器之間的通信程序,又由於它常以進程的形式存在,故以后就簡稱之為設備驅動進程。其主要任務是接收上層軟件發來的抽象I/O 要求,如read或write命令,在把它轉換為具體要求后,發送給設備控制器,啟動設備去執行;此外,它也將由設備控制器發來的信號傳送給上層軟件。設備驅動程序的主要任務是啟動指定設備。但在啟動之前,還必須完成必要的准備工作,如檢測設備狀態是否為“忙”等。在完成所有的准備工作后,才最后向設備控制器發送一條啟動命令。工作過程如下:
- 將抽象要求轉換為具體要求;
- 檢查I/O 請求的合法性;
- 讀出和檢查設備的狀態;
- 傳送必要的參數;
- 工作方式的設置;
- 啟動I/O 設備。
設備獨立性軟件
設備獨立性軟件是為了應用程序獨立於具體使用的物理設備。為了在應用程序中,使用邏輯設備名稱來請求使用某類設備;而系統在實際執行時,還必須使用物理設備名稱。設備獨立性軟件的主要功能有:1對獨立設備的分配與回收;2將邏輯設備名映射為物理設備名,進一步可以找到相應物理設備的驅動程序;3對設備進行保護,禁止用戶直接訪問設備;4緩沖管理,即對字符設備和塊設備的緩沖區進行有效的管理,以提高I/O的效率;5差錯控制,由於在I/O操作中的絕大多數錯誤都與設備無關,故主要由設備驅動程序處理,而設備獨立性軟件只處理那些設備驅動程序無法處理的錯誤;6 提供獨立於設備的邏輯塊;7向用戶層(或文件層)軟件提供統一接口。
為了實現設備的獨立性,系統必須設置一張邏輯設備表(LUT,Logical Unit Table),用於將應用程序中所使用的邏輯設備名映射為物理設備名。在該表的每個表目中包含了三項:邏輯設備名、物理設備名和設備驅動程序的入口地址。LUT 的設置可采取兩種方式:第一種方式是在整個系統中只設置一張LUT;第二種方式是為每個用戶設置一張LUT。
用戶層的I/O軟件
一般而言,大部分的I/O 軟件都在操作系統內部,但仍有一小部分在用戶層,包括與用戶程序鏈接在一起的庫函數,以及完全運行於內核之外的一些程序。
設備分配
在多道程序環境下,系統中的設備供所有進程共享。為防止諸進程對系統資源的無序競爭,特規定系統設備不允許用戶自行使用,必須由系統統一分配。
用到的數據結構有:設備控制表(用於記錄本設備使用情況)、控制器控制表(記錄本控制器情況)、通道控制表(記錄本通道的情況)和系統設備表(全部設備情況)等。
系統在分配設備時,應考慮: ① 設備的固有屬性(獨占性、共享性、可虛擬設備);② 設備分配算法(與進程調度相似,先來先服務、優先級最高優先);③ 設備分配時的安全性(安全分配方式即IO請求后,進程阻塞;不安全分配方式即IO請求后,進程繼續至發現設備被占用才阻塞);④ 設備獨立性。
系統分配設備步驟:1、分配設備;2、分配控制器;3、分配通道。 進程是以物理設備名來提出I/O 請求的;采用的是單通路的I/O 系統結構,容易產生“瓶頸”現象。改進方法是增加設備的獨立性,進程應使用邏輯設備名請求I/O和采用多通路的I/O 系統結構。
SPOOLing技術
通過SPOOLing 技術便可將一台物理I/O 設備虛擬為多台邏輯I/O 設備,同樣允許多個用戶共享一台物理I/O設備。為了緩和CPU的高速性與I/O 設備低速性間的矛盾而引入了脫機輸入、脫機輸出技術。SPOOLing 技術是對脫機輸入、輸出系統的模擬。該技術是利用專門的外圍控制機,將低速I/O 設備上的數據傳送到高速磁盤上;或者相反。使得此時的外圍操作與CPU對數據的處理同時進行。SPOOLing系統必須建立在具有多道程序功能的操作系統上,而且還應有高速隨機外存的支持,這通常是采用磁盤存儲技術。
(1) 輸入井和輸出井。這是在磁盤上開辟的兩個大存儲空間。輸入井是模擬脫機輸入時的磁盤設備,用於暫存I/O 設備輸入的數據;輸出井是模擬脫機輸出時的磁盤,用於暫存用戶程序的輸出數據。
(2) 輸入緩沖區和輸出緩沖區。為了緩和CPU 和磁盤之間速度不匹配的矛盾,在內存中要開辟兩個緩沖區:輸入緩沖區和輸出緩沖區。輸入緩沖區用於暫存由輸入設備送來的數據,以后再傳送到輸入井。輸出緩沖區用於暫存從輸出井送來的數據,以后再傳送給輸出設備。
(3) 輸入進程SPi和輸出進程SPo。這里利用兩個進程來模擬脫機I/O 時的外圍控制機。其中,進程SPi模擬脫機輸入時的外圍控制機,將用戶要求的數據從輸入機通過輸入緩沖區再送到輸入井,當CPU 需要輸入數據時,直接從輸入井讀入內存;進程SPo模擬脫機輸出時的外圍控制機,把用戶要求輸出的數據先從內存送到輸出井,待輸出設備空閑時,再將輸出井中的數據經過輸出緩沖區送到輸出設備上。
磁盤管理
最常見磁盤分類有:將磁盤分成硬盤和軟盤、單片盤和多片盤、固定頭磁盤和活動頭(移動頭)磁盤等。
磁盤調度算法
- 先來先服務(FCFS,First Come First Served):根據進程請求訪問磁盤的先后次序進行調度。優點是公平;缺點是平均尋到時間長。
- 最短尋道時間優先(SSTF,Shortest Seek Time First):每次選擇訪問的磁道與當前磁頭所在的磁道距離最近,以使每次的尋道時間最短的進程。優點是每次尋到時間最短;缺點是可能出現飢餓現象。
- 掃描(SCAN )算法:又常稱之為電梯調度算法,不僅考慮到欲訪問的磁道與當前磁道間的距離,更優先考慮的是磁頭當前的移動方向。當磁頭正在自里向外移動時,SCAN算法所考慮的下一個訪問對象,應是其欲訪問的磁道既在當前磁道之外,又是距離最近的。這樣自里向外地訪問,直至再無更外的磁道需要訪問時,才將磁臂換向為自外向里移動。優點是避免了飢餓現象,缺點是當磁頭剛從里向外移動而越過了某一磁道時,恰好又有一進程請求訪問此磁道,這時,該進程必須等待,待磁頭繼續從里向外,然后再從外向里掃描完所有要訪問的磁道后,才處理該進程的請求,致使該進程的請求被大大地推遲。
- 循環掃描(CSCAN )算法:規定磁頭單向移動,例如,只是自里向外移動,當磁頭移到最外的磁道並訪問后,磁頭立即返回到最里的欲訪問的磁道,亦即將最小磁道號緊接着最大磁道號構成循環,進行循環掃描。請求進程的請求延遲將從原來的2T減為T + S,其中,T為由里向外或由外向里單向掃描完要訪問的磁道所需的尋道時間,而S 是將磁頭從最外面被訪問的磁道直接移到最里面欲訪問的磁道(或相反)的尋道時間。
- NStepSCAN 算法:在 SSTF、SCAN 及CSCAN 幾種調度算法中,都可能會出現磁臂停留在某處不動的情況,例如,有一個或幾個進程對某一磁道有較高的訪問頻率,即這個(些)進程反復請求對某一磁道的I/O 操作,從而壟斷了整個磁盤設備,我們把這一現象稱為“磁臂粘着”。N步SCAN 算法是將磁盤請求隊列分成若干個長度為N 的子隊列,磁盤調度將按FCFS 算法依次處理這些子隊列,而每處理一個隊列時又是按SCAN 算法,對一個隊列處理完后,再處理其他隊列。當正在處理某子隊列時,如果又出現新的磁盤I/O 請求,便將新請求進程放入其他隊列,這樣就可避免出現粘着現象。
- FSCAN 算法:實質上是N步SCAN 算法的簡化一個是由當前所有請求磁盤I/O 的進程形成的隊列,由磁盤調度按SCAN 算法進行處理。在掃描期間,將新出現的所有請求磁盤I/O的進程,放入另一個等待處理的請求隊列。
磁盤高速緩存指利用內存中的存儲空間來暫存從磁盤中讀出的一系列盤塊中的信息。訪問數據時,先看高速緩存,沒有在訪問磁盤。數據交付的方式有數據交付(直接將高速緩存中的數據傳送到請求者進程的內存工作區中)、指針交付(將指向高速緩存中某區域的指針交付給請求者進程)。當高速緩存滿是將會發送置換,較常用的置換算法仍然是最近最久未使用算法LRU、最近未使用算法NRU及最少使用算法LFU等。解決數據點一致性問題,有LRU鏈,和周期性的寫入磁盤。
提高磁盤IO速度的方法除了磁盤高速緩存,還有提前讀(預先讀取下一塊數據到緩沖區)、延遲寫(指在緩沖區A中的數據,本應立即寫回磁盤,但考慮到該緩沖區中的數據在不久之后可能還會再被本進程或其它進程訪問(共享資源),因而並不立即將該緩沖區A 中的數據寫入磁盤,而是將它掛在空閑緩沖區隊列的末尾)、優化物理塊分布、虛擬盤(是指利用內存空間去仿真磁盤,又稱為RAM 盤)。
廉價磁盤冗余陣列(RAID,Redundant Array of Inexpensive Disk)的並行交叉存取是指在該系統中,有多台磁盤驅動器,系統將每一盤塊中的數據分為若干個子盤塊數據,再把每一個子盤塊的數據分別存儲到各個不同磁盤中的相同位置上,當要將一個盤塊的數據傳送到內存時,采取並行傳輸方式。 RAID 的分級為0到7。
參考
《計算機操作系統》第三版 湯小丹