2020-12-5(操作系统---设备管理)
文章目錄
I/O 系統
I/O 設備
設備與控制器之間的接口
設備控制器
I/O通道(I/O Channel)
總線系統
I/O 控制方式
程序I/O(Programmed I/O)方式
中斷驅動(Interrupt Driven)I/O控制方式
直接存儲器訪問(DMA) (Direct Memory Access)I/O控制方式
I/O通道控制方式
緩沖管理
緩沖的引入
單緩沖(Single Buffer)
雙緩沖(Double Buffer)
循環緩沖
緩沖池(Buffer Pool)
I/O 軟件
I/O 軟件的設計目標和原則
I/O軟件的設計目標
I/O 軟件的層次
中斷處理程序
設備驅動程序
設備獨立性(Device Independence)軟件
用戶層的 I/O 軟件
設備分配
設備分配中的數據結構
設備分配時應考慮的因素
獨占設備的分配程序
SPOOLing技術
磁盤存儲器的管理
磁盤性能簡述
磁盤調度
磁盤高速緩存(Disk Cache)
提高磁盤 I/O 速度的其它方法
廉價磁盤冗余陣列 (RAID,Redundant Array of Inexpensive Disk)
I/O 系統
I/O系統管理的主要對象是I/O設備和相應的設備控制器。其最主要的任務是,完成用戶提出的I/O請求,提高I/O速率,以及提高設備的利用率,為更高層的進程方便地使用這些設備提供手段。
I/O系統的基本功能
隱藏物理設備的細節。與設備的無關性。提高處理機和I/O設備的利用率。對I/O設備進行控制。確保對設備的正確共享。錯誤處理。
I/O系統接口
塊設備接口:隱藏了磁盤的二維結構,將抽象命令映射為低層操作。
流設備接口(字符設備接口):流設備接口是流設備管理程序與高層之間的接口,它反映了大部分字符設備的本質特征,用于控制字符設備的輸入或輸出。
網絡通信接口:通過某種方式把計算機連接到網絡上,使計算機能通過網絡與網絡上的其它計算機進行通信或上網瀏覽。
利用特定的I/O指令
在早期的計算機中,為實現CPU和設備控制器之間的通信,為每個控制寄存器分配一個I/O端口,這是一個8位或16位的整數,另外還設置了一些特定的I/O指令。
內存映像I/O
在這種方式中,在編址上不再區分內存單元地址和設備控制器中的寄存器地址.
I/O 設備
按設備的使用特性分類
存儲設備,也稱外存或后備存儲器、 輔助存儲器,是計算機系統用以存儲信息的主要設備。該類設備存取速度較內存慢,但容量比內存大得多,相對價格也便宜。
輸入/輸出設備,又具體可分為輸入設備、 輸出設備和交互式設備。輸入設備用來接收外部信息。輸出設備是用于將計算機加工處理后的信息送向外部的設備。交互式設備則是集成上述兩類設備,利用輸入設備接收用戶命令信息,通過輸出設備同步顯示用戶命令以及命令執行的結果。
按傳輸速率分類
低速設備,這是指其傳輸速率僅為每秒鐘幾個字節至數百個字節的一類設備。屬于低速設備的典型設備有鍵盤、鼠標器、語音的輸入和輸出等設備。
中速設備,這是指其傳輸速率在每秒鐘數千個字節至 數十萬個字節的一類設備。典型的中速設備有行式打印機、 激光打印機等。
高速設備,這是指其傳輸速率在數百個千字節至千兆字節的一類設備。典型的高速設備有磁帶機、磁盤機、光盤機等。
按信息交換的單位分類
塊設備(Block Device),這類設備用于存儲信息。由于信息的存取總是以數據塊為單位,故而得名。它屬于有結構設備。 典型的塊設備是磁盤,每個盤塊的大小為 512 B~4 KB。磁盤設備的基本特征是其傳輸速率較高,通常每秒鐘為幾兆位;另一特征是可尋址,即對它可隨機地讀/寫任一塊;此外,磁盤設備的 I/O 常采用 DMA 方式。
字符設備(Character Device),用于數據的輸入和輸出。其基本單位是字符。它屬于無結構類型。基本特征是其傳輸速率較低,另一特征是不可尋址,即輸入/輸出時不能指定數據的輸入源地址及輸出的目標地址,字符設備在輸入/輸出時,常采用中斷驅動方式。
按設備的共享屬性分類
獨占設備。這是指在一段時間內只允許一個用戶(進程)訪問的設備,即臨界資源。 因而,對多個并發進程而言,應互斥地訪問這類設備。系統一旦把這類設備分配給了某進程后,便由該進程獨占,直至用完釋放。獨占設備的分配有可能引起進程死鎖。
共享設備。這是指在一段時間內允許多個進程同時訪問的設備。當然,對于每一時刻而言,該類設備仍然只允許一個進程訪問。顯然,共享設備必須是可尋址的和可隨機訪問的設備。典型的共享設備是磁盤。共享設備不僅可獲得良好的設備利用率,而且它也是實現文件系統和數據庫系統的物質基礎。
虛擬設備。這是指通過虛擬技術將一臺獨占設備變換為若干臺邏輯設備,供若干個用戶(進程)同時使用。
設備與控制器之間的接口
設備并不是直接與 CPU 進行通信,而是與設備控制器通信,因此,在 I/O 設備中應含有與設備控制器間的接口,在該接口中有三種類型的信號,各對應一條信號線。
數據信號線:用于在設備和設備控制器之間傳送數據信號。對輸入設備而言,由外界輸入的信號經轉換器轉換后所形成的數據,通常先送入緩沖器中。當數據量達到一定的比特(字符)數后,再從緩沖器通過一組數據信號線傳送給設備控制器。對輸出設備而言,則是將從設備控制器經過數據信號線傳送來的一批數據先暫存于緩沖器中,經轉換器作適當轉換后,再逐個字符地輸出。
控制信號線:這是作為由設備控制器向 I/O 設備發送控制信號時的通路。該信號規定了設備將要執行的操作。
狀態信號線:這類信號線用于傳送指示設備當前狀態的信號。設備的當前狀態有正在讀(或寫);設備已讀(寫)完成,并準備好新的數據傳送。
在這里插入圖片描述
設備控制器
設備控制器是計算機中的一個實體,其主要職責是控制一個或多個 I/O 設備,以實現 I/O 設備和計算機之間的數據交換。它是 CPU 與 I/O 設備之間的接口,它接收從 CPU 發來的命令,并去控制 I/O 設備工作,以使處理機從繁雜的設備控制事務中解脫出來。 設備控制器是一個可編址的設備,當它僅控制一個設備時,它只有一個唯一的設備地址;
若控制器可連接多個設備時,則應含有多個設備地址,并使每一個設備地址對應一個設備。 設備控制器的復雜性因不同設備而異,相差甚大。
用于控制字符設備的控制器,用于控制塊設備的控制器。
在微型機和小型機中的控制器,常做成印刷電路卡形式,因而也常稱為接口卡,可將它插入計算機。
設備控制器的基本功能
接收和識別命令: CPU 可以向控制器發送多種不同的命令,設備控制器應能接收并識別這些命令。為此,在控制器中應具有相應的控制寄存器,用來存放接收的命令和參數,并對所接收的命令進行譯碼。
數據交換:這是指實現 CPU 與控制器之間、控制器與設備之間的數據交換。對于前者,是通過數據總線,由 CPU 并行地把數據寫入控制器,或從控制器中并行地讀出數據;對于后者,是設備將數據輸入到控制器,或從控制器傳送給設備。為此,在控制器中須設置數據寄存器。
標識和報告設備的狀態:控制器應記下設備的狀態供 CPU 了解。為此,在控制器中應設置一狀態寄存器,用其中的每一位來反映設備的某一種狀態。當 CPU 將該寄存器的內容讀入后,便可了解該設備的狀態。
地址識別:系統中的每一個設備都有一個地址,而設備控制器又必須能夠識別它所控制的每個設備的地址。此外,為使 CPU 能向(或從)寄存器中寫入(或讀出)數據,這些寄存器都應具有唯一的地址。控制器應能正確識別這些地址,為此,在控制器中應配置地址譯碼器。
數據緩沖:由于I/O 設備的速率較低而 CPU 和內存的速率卻很高,故在控制器中必須設置一緩沖器。輸出時,緩沖器暫存由主機高速傳來的數據,然后以 I/O 設備所具有的速率將緩沖器中的數據傳送給 I/O 設備;輸入時,緩沖器用于暫存從I/O設備送來的數據,待接收到一批數據后,再將緩沖器中的數據高速地傳送給主機。
差錯控制:若發現傳送中出現了錯誤,通常是將差錯檢測碼置位,并向 CPU 報告。于是 CPU 將本次傳送來的數據作廢,并重新進行一次傳送。
設備控制器的組成
由于設備控制器位于 CPU 與設備之間,它既要與 CPU 通信,又要與設備通信,還應具有按照 CPU 所發來的命令去控制設備工作的功能。
設備控制器與處理機的接口:該接口用于實現 CPU 與設備控制器之間的通信。共有三類信號線: 數據線、地址線和控制線。數據線通常與兩類寄存器相連接:第一類是數據寄存器,在控制器中可以有一個或多個數據寄存器,用于存放從設備送來的數據(輸入)或從CPU 送來的數據(輸出);第二類是控制/狀態寄存器:在控制器中可以有一個或多個這類寄存器,用于存放從 CPU 送來的控制信息或設備的狀態信息。
設備控制器與設備的接口:在一個設備控制器上,可以連接一個或多個設備。相應地,在控制器中便有一個或多個設備接口。一個接口連接一臺設備。在每個接口中都存在數據、控制和狀態三種類型的信號。控制器中的 I/O 邏輯根據處理機發來的地址信號去選擇一個設備接口。
I/O 邏輯:在設備控制器中的 I/O 邏輯用于實現對設備的控制。它通過一組控制線與處理機交互,處理機利用該邏輯向控制器發送 I/O 命令;I/O 邏輯對收到的命令進行譯碼。每當 CPU 要啟動一個設備時,一方面將啟動命令發送給控制器;另一方面又同時通過地址線把地址發送給控制器,由控制器的 I/O 邏輯對收到的地址進行譯碼,再根據所譯出的命令對所選設備進行控制。
I/O通道(I/O Channel)
I/O 通道設備的引入
雖然在 CPU 與 I/O 設備之間增加了設備控制器后,已能大大減少 CPU 對 I/O 的干預,但當主機所配置的外設很多時,CPU 的負擔仍然很重。為此,在 CPU 和設備控制器之間又增設了通道。其主要目的是為了建立獨立的 I/O 操作,不僅使數據的傳送能獨立于CPU,而且也希望有關對 I/O 操作的組織、管理及其結束處理盡量獨立,以保證CPU 有更多的時間去進行數據處理;或者說,其目的是使一些原來由 CPU 處理的 I/O 任務轉由通道來承擔,從而把 CPU 從繁雜的 I/O 任務中解脫出來。
在設置了通道后,CPU 只需向通道發送一條 I/O 指令。通道在收到該指令后,便從內存中取出本次要執行的通道程序,然后執行該通道程序,僅當通道完成了規定的 I/O 任務后,才向 CPU 發中斷信號。 I/O 通道是一種特殊的處理機,它具有執行 I/O 指令的能力,并通過執行通道 (I/O)程序來控制 I/O 操作。
I/O 通道又與一般的處理機不同,其指令類型單一:這是由于通道硬件比較簡單,其所能執行的命令主要局限于與 I/O 操作有關的指令;通道所執行的通道程序是放在主機的內存中的,換言之,是通道與CPU 共享內存。
通道類型
字節多路通道(Byte Multiplexor Channel) :這是一種按字節交叉方式工作的通道。它通常都含有許多非分配型子通道,其數量可從幾十到數百個,每一個子通道連接一臺 I/O 設備,并控制該設備的 I/O 操作。這些子通道按時間片輪轉方式共享主通道。當第一個子通道控制其 I/O 設備完成一個字節的交換后,便立即騰出主通道,讓給第二個子通道使用;當所有子通道輪轉一周后,重又返回來由第一個子通道去使用字節多路主通道。這樣,只要字節多路通道掃描每個子通道的速率足夠快,而連接到子通道上的設備的速率不是太高時,便不致丟失信息。
數組選擇通道(Block Selector Channel) :字節多路通道不適于連接高速設備,這推動了按數組方式進行數據傳送的數組選擇通道的形成。這種通道雖然可以連接多臺高速設備,但由于它只含有一個分配型子通道,在一段時間內只能執行一道通道程序,控制一臺設備進行數據傳送,致使當某臺設備占用了該通道后,便一直由它獨占。即使是它無數據傳送,通道被閑置,也不允許其它設備使用該通道,直至該設備傳送完畢釋放該通道通道的利用率很低。
數組多路通道(Block Multiplexor Channel) :數組多路通道是將數組選擇通道傳輸速率高和字節多路通道能使各子通道(設備)分時并行操作的點相結合而形成的一種新通道。它含有多個非分配型子通道,因而這種通道既具有很高的數據傳輸速率,又能獲得令人滿意的通道利用率。該通道能被廣泛地用于連接多臺高、中速的外圍設備,其數據傳送是按數組方式進行的。
“瓶頸”問題
由于通道價格昂貴,使機器中所設置的通道數量勢必較少,成了 I/O 的瓶頸,進而造成整個系統吞吐量的下降。解決“瓶頸”問題的最有效的方法,便是增加設備到主機間的通路而不增加通道,就是把一個設備連接到多個控制器上,而一個控制器又連接到多個通道上。多通路方式不僅解決了“瓶頸”問題,而且提高了系統的可靠性,個別通道或控制器的故障不會使設備和存儲器之間沒有通路。
在這里插入圖片描述
在這里插入圖片描述
總線系統
在計算機系統中的各部件,如 CPU、存儲器以及各種 I/O 設備之間的聯系,都是通過總線來實現的。總線的性能是用總線的時鐘頻率、帶寬和相應的總線傳輸速率等指標來衡量的。
I/O 控制方式
盡量減少主機對 I/O 控制的干預,把主機從繁雜的I/O 控制事務中解脫出來,以便更多地去完成數據處理任務。
程序I/O(Programmed I/O)方式
(忙—等待方式)在處理機向控制器發出一條 I/O 指令啟動輸入設備輸入數據時,要同時把狀態寄存器中的忙/閑標志 busy 置為 1,后便不斷地循環測試 busy。當 busy=1 時,表示輸入機尚未輸完一個字(符),處理機應繼續對該標志進行測試,直至 busy=0,表明輸入機已將輸入數據送入控制器的數據寄存器中。于是處理機將數據寄存器中的數據取出,送入內存指定單元中,這樣便完成了一個字(符)的 I/O。接著再去啟動讀下一個數據,并置 busy=1。
在程序 I/O 方式中,由于 CPU 的高速性和 I/O 設備的低速性,致使 CPU 的絕大部分時間都處于等待 I/O 設備完成數據 I/O 的循環測試中,造成對 CPU 的極大浪費。CPU 之所以要不斷地測試 I/O 設備的狀態,就是因為無中斷機構,使 I/O 設備無法向 CPU 報告它已完成了一個字符的輸入操作。
中斷驅動(Interrupt Driven)I/O控制方式
當某進程要啟動某個 I/O 設備工作時,便由 CPU 向相應的設備控制器發出一條 I/O 命令,然后立即返回繼續執行原來的任務。設備控制器于是按照該命令的要求去控制指定 I/O 設備。此時,CPU 與 I/O 設備并行操作。在輸入時,當設備控制器收到 CPU 發來的讀命令后,便去控制相應的輸入設備讀數據。一旦數據進入數據寄存器,控制器便通過控制線向 CPU 發送一中斷信號,由 CPU 檢查輸入過程中是否出錯。若無錯,便向控制器發送取走數據的信號,然后再通過控制器及數據線將數據寫入內存指定單元中。
在 I/O 設備輸入每個數據的過程中,由于無需 CPU 干預,因而可使 CPU 與 I/O 設備并行工作。僅當輸完一個數據時,才需 CPU 花費極短的時間去做些中斷處理。可見,這樣可使 CPU 和 I/O 設備都處于忙碌狀態,從而提高了整個系統的資源利用率及吞吐量。
直接存儲器訪問(DMA) (Direct Memory Access)I/O控制方式
中斷驅動 I/O仍是以字為單位進行 I/O 的,每當完成一個字(節)的 I/O 時,控制器便要向 CPU 請求一次中斷。DMA控制方式數據傳輸的基本單位是數據塊,即在CPU 與 I/O 設備之間,每次傳送至少一個數據塊;所傳送的數據是從設備直接送入內存的,或者相反;僅在傳送一個或多個數據塊的開始和結束時,才需 CPU 干預,整塊數據的傳送是在控制器的控制下完成的。
DMA 控制器的組成:主機與 DMA 控制器的接口;DMA 控制器與塊設備的接口;I/O 控制邏輯。
為了實現在主機與控制器之間成塊數據的直接交換,必須在DMA 控制器中設置四類寄存器。命令/狀態寄存器(CR):用于接收 CPU 發來的 I/O 命令,或有關控制信息,或設備的狀態。內存地址寄存器(MAR):在輸入時,它存放把數據從設備傳送到內存的起始目標地址;在輸出時,它存放由內存到設備的內存源地址。 數據寄存器(DR):用于暫存從設備到內存,或從內存到設備的數據。 數據計數器(DC):存放本次 CPU 要讀或寫的字(節)數。
DMA 工作過程:當 CPU 要從磁盤讀入一數據塊時,便向磁盤控制器發送一條讀命令。該命令被送到其中的命令寄存器(CR)中。同時,還須發送本次要將數據讀入的內存起始目標地址,該地址被送入內存地址寄存器(MAR) 中;本次要讀數據的字(節)數則送入數據計數器(DC)中,還須將磁盤中的源地址直接送至 DMA 控制器的 I/O 控制邏輯上。然后,啟動 DMA 控制器進行數據傳送,CPU 便可去處理其它任務。此后,整個數據傳送過程便由 DMA 控制器進行控制。當 DMA 控制器已從磁盤中讀入一個字(節)的數據并送入數據寄存器(DR)后再挪用一個存儲器周期,將該字(節)傳送到 MAR 所指示的內存單元中。接著便對 MAR 內容加 1,將 DC 內容減 1。若減 1 后 DC 內容不為 0,表示傳送未完,便繼續傳送下一個字(節);否則,由 DMA 控制器發出中斷請求。
在這里插入圖片描述
I/O通道控制方式
實現 CPU、通道和 I/O 設備三者的并行操作,從而更有效地提高整個系統的資源利用率。
通道程序:通道是通過執行通道程序,并與設備控制器共同實現對 I/O 設備的控制的。通道程序是由一系列通道指令(或稱為通道命令)所構成的。通道指令與一般的機器指令不同,在它的每條指令中都包含下列諸信息:
操作碼。操作碼規定了指令所執行的操作,如讀、寫、控制等操作。
內存地址。內存地址標明字符送入內存(讀操作)和從內存取出(寫操作)時的內存首址。
計數。該信息表示本條指令所要讀(或寫)數據的字節數。
通道程序結束位P。用于表示通道程序是否結束。P=1 表示本條指令是通道程序的最后一條指令。
記錄結束標志 R。R=0 表示本通道指令與下一條指令所處理的數據是同屬于一個記錄;R=1 表示這是處理某記錄的最后一條指令。
在這里插入圖片描述
緩沖管理
緩沖的引入
緩和 CPU 與 I/O 設備間速度不匹配的矛盾:凡在數據到達速率與其離去速率不同的地方,都可設置緩沖區,以緩和它們之間速率不匹配的矛盾。減少對 CPU 的中斷頻率,放寬對 CPU 中斷響應時間的限制,提高 CPU 和 I/O 設備之間的并行性,提高系統的吞吐量和設備的利用率。
單緩沖(Single Buffer)
每當用戶進程發出一 I/O 請求時,操作系統便在主存中為之分配一緩沖區。
在塊設備輸入時,假定從磁盤把一塊數據輸入到緩沖區的時間為T,操作系統將該緩沖區中的數據傳送到用戶區的時間為 M,CPU 對這一塊數據處理(計算)的時間為 C。由于 T 和 C 是可以并行的,當 T>C 時,系統對每一塊數據的處理時間為M+T,反之則為M+C。故可把系統對每一塊數據的處理時間表示為Max(C,T)+M。
在字符設備輸入時,緩沖區用于暫存用戶輸入的一行數據,在輸入期間,用戶進程被掛起以等待數據輸入完畢;在輸出時,用戶進程將一行數據輸入到緩沖區后,繼續進行處理。當用戶進程已有第二行數據輸出時,如果第一行數據尚未被提取完畢,則此時用戶進程應阻塞。
雙緩沖(Double Buffer)
(緩沖對換(Buffer Swapping))。在設備輸入時,先將數據送入第一緩沖區,裝滿后便轉向第二緩沖區。此時操作系統可以從第一緩沖區中移出數據,并送入用戶進程。接著由 CPU 對數據進行計算。在雙緩沖時,系統處理一塊數據的時間可以粗略地認為是 Max(C,T)。如果 C<T,可使塊設備連續輸入;如果 C>T,則可使 CPU 不必等待設備輸入。 對于字符設備,若采用行輸入方式,則采用雙緩沖通常能消除用戶的等待時間,即用戶在輸入完第一行之后,在CPU 執行第一行中的命令時,用戶可繼續向第二緩沖區輸下一行數據。 如果我們在實現兩臺機器之間的通信時,僅為它們配置了單緩沖,那么,它們之間在任一時刻都只能實現單方向的數據傳輸。為了實現雙向數據傳輸,必須在兩臺機器中都設置兩個緩沖區,一個用作發送緩沖區,另一個用作接收緩沖區
循環緩沖
若輸入與輸出的速度相差甚遠,雙緩沖的效果則不夠理想,不過可以隨著緩沖區數量的增加,使情況有所改善。可將多個緩沖組織成循環緩沖形式。對于用作輸入的循環緩沖,通常是提供給輸入進程或計算進程使用。輸入進程不斷向空緩沖區輸入數據,而計算進程則從中提取數據進行計算。
循環緩沖的組成
多個緩沖區:在循環緩沖中包括多個緩沖區,其每個緩沖區的大小相同。作為輸入的多緩沖區可分為三種類型:用于裝輸入數據的空緩沖區 R,已裝滿數據的緩沖區 G ,計算進程正在使用的現行工作緩沖區 C。
多個指針:作為輸入的緩沖區可設置三個指針:用于指示計算進程下一個可用緩沖區 G 的指針 Nextg,指示輸入進程下次可用的空緩沖區 R 的指針 Nexti,指示計算進程正在使用的緩沖區 C 的指針 Current。
循環緩沖區的使用
Getbuf 過程:當計算進程要使用緩沖區中的數據時,可調用 Getbuf 過程。該過程將由指針 Nextg 所指示的緩沖區提供給進程使用,相應地,須把它改為現行工作緩沖區,并令 Current 指針指向該緩沖區的第一個單元,同時將Nextg 移向下一個 G 緩沖區。類似地,每當輸入進程要使用空緩沖區來裝入數據時,也調用 Getbuf 過程由該過程將指針 Nexti 所指示的緩沖區提供給輸入進程使用,同時將Nexti 指針移向下一個R 緩沖區。
Releasebuf 過程:當計算進程把 C 緩沖區中的數據提取完畢時,便調用 Releasebuf 過程,將緩沖區 C 釋放。此時,把該緩沖區由當前(現行)工作緩沖區 C 改為空緩沖區 R。類似地,當輸入進程把緩沖區裝滿時,也應調用 Releasebuf 過程,將該緩沖區釋放,并改為 G 緩沖區。
進程同步
使用輸入循環緩沖,可使輸入進程和計算進程并行執行。相應地,指針 Nexti 和指針 Nextg 將不斷地沿著順時針方向移動,這樣就可能出現下述兩種情況:
Nexti 指針追趕上 Nextg 指針:這意味著輸入進程輸入數據的速度大于計算進程處理數據的速度,已把全部可用的空緩沖區裝滿,再無緩沖區可用。此時,輸入進程應阻塞,直到計算進程把某個緩沖區中的數據全部提取完,使之成為空緩沖區 R,并調用 Releasebuf 過程將它釋放時,才將輸入進程喚醒。這種情況被稱為系統受計算限制。
Nextg 指針追趕上 Nexti 指針:這意味著輸入數據的速度低于計算進程處理數據的速度,使全部裝有輸入數據的緩沖區都被抽空,再無裝有數據的緩沖區供計算進程提取數據。這時,計算進程只能阻塞,直至輸入進程又裝滿某個緩沖區,并調用 Releasebuf 過程將它釋放時,才去喚醒計算進程。這種情況被稱為系統受 I/O 限制。
緩沖池(Buffer Pool)
上述的緩沖區僅適用于某特定的 I/O 進程和計算進程,因而它們屬于專用緩沖。當系統較大時,將會有許多這樣的循環緩沖,這不僅要消耗大量的內存空間,而且其利用率不高。
緩沖池的組成
對于既可用于輸入又可用于輸出的公用緩沖池,其中至少應含有以下三種類型的緩沖區: 空(閑)緩沖區; 裝滿輸入數據的緩沖區;裝滿輸出數據的緩沖區。
為了管理上的方便,可將相同類型的緩沖區鏈成一個隊列,于是可形成以下三個隊列:
空緩沖隊列 emq:這是由空緩沖區所鏈成的隊列。輸入隊列 inq:這是由裝滿輸入數據的緩沖區所鏈成的隊列。輸出隊列 outq:這是由裝滿輸出數據的緩沖區所鏈成的隊列。
除了上述三個隊列外,還應具有四種工作緩沖區:用于收容輸入數據的工作緩沖區; 用于提取輸入數據的工作緩沖區;用于收容輸出數據的工作緩沖區;用于提取輸出數據的工作緩沖區。
Getbuf 過程和 Putbuf 過程
為使諸進程能互斥地訪問緩沖池隊列,可為每一隊列設置一個互斥信號量 MS(type)。
此外,為了保證諸進程同步地使用緩沖區,又為每個緩沖隊列設置了一個資源信號量 RS(type)。
緩沖區的工作方式
收容輸入:在輸入進程需要輸入數據時,便調用 Getbuf(emq)過程,從空緩沖隊列 emq 的隊首摘下一空緩沖區,把它作為收容輸入工作緩沖區 hin。然后,把數據輸入其中,裝滿后再調用 Putbuf(inq,hin)過程,將該緩沖區掛在輸入隊列 inq 上。
提取輸入:當計算進程需要輸入數據時,調用 Getbuf(inq)過程,從輸入隊列 inq 的 隊首取得一個緩沖區,作為提取輸入工作緩沖區(sin),計算進程從中提取數據。計算進程用完該數據后,再調用 Putbuf(emq,sin)過程,將該緩沖區掛到空緩沖隊列 emq 上。
收容輸出:當計算進程需要輸出時,調用 Getbuf(emq)過程從空緩沖隊列 emq 的隊首取得一個空緩沖區,作為收容輸出工作緩沖區 hout。當其中裝滿輸出數據后,又調用Putbuf(outq,hout)過程,將該緩沖區掛在 outq 末尾。
提取輸出:由輸出進程調用 Getbuf(outq)過程,從輸出隊列的隊首取得一裝滿輸出數據的緩沖區,作為提取輸出工作緩沖區 sout。在數據提取完后,再調用 Putbuf(emq,sout) 過程,將該緩沖區掛在空緩沖隊列末尾。
I/O 軟件
高效率:確保 I/O 設備與 CPU 的并發性,以提高資源的利用率。
通用性:盡可能地提供簡單抽象、清晰而統一的接口,采用統一標準的方法,來管理所有的設備以及所需的 I/O 操作。
通常將 I/O 軟件組織成一種層次結構,低層軟件用于實現與硬件相關的操作,并可屏蔽硬件的具體細節。高層軟件則主要向用戶提供一個簡潔、友好和規范的接口。每一層具有一個要執行的定義明確的功能和一個與鄰近層次定義明確的接口,各層的功能與接口隨系統的不同而異。
在這里插入圖片描述
I/O 軟件的設計目標和原則
I/O軟件的設計目標
與具體設備無關:對于 I/O 系統中許多種類不同的設備,作為程序員,只需要知道如何使用這些資源來完成所需要的操作,而無需了解設備的有關具體實現細節。為了提高 OS 的可移植性和易適應性,I/O 軟件應負責屏蔽設備的具體細節,向高層軟件提供抽象的邏輯設備,并完成邏輯設備與具體物理設備的映射。 對于操作系統本身而言,應允許在不需要將整個操作系統進行重新編譯的情況下,增添新的設備驅動程序,以方便新的 I/O 設備的安裝。如在 Windows 中,系統可以為新 I/O 設備自動安裝和尋找驅動程序,從而實現即插即用。
統一命名:不同的操作系統有不同的命名規則,一般而言,是在系統中對各類設備采取預先設計的,統一的邏輯名稱進行命名,所有軟件都以邏輯名稱訪問設備。這種統一命名與具體設備無關,即同一個邏輯設備的名稱,在不同的情況下可能對應于不同的物理設備。
對錯誤的處理:一般而言,錯誤多數是與設備緊密相關的,因此對于錯誤的處理,應該盡可能在接近硬件的層面處理。只有低層軟件解決不了的錯誤才通知高層軟件解決。
緩沖技術:由于 CPU 與設備之間的速度差異,無論是塊設備還是字符設備,都需要使用緩沖技術。 對于不同類型的設備,其緩沖區(塊)的大小是不一樣的,就是同類型的設備,其緩沖區(塊)的大小也是存在差異的。因此,I/O 軟件應能屏蔽這種差異,向高層軟件提供統大小一致的數據塊或字符單元,使得高層軟件能夠只與邏輯塊大小一致的抽象設備進行交互。
設備的分配和釋放:對于系統中的共享設備,可以同時為多個用戶服務。對于這樣的設備,應該允許多個進程同時對其提出 I/O 請求。但對于獨占設備,在某一段時間只能供一個用戶使用,對其分配和釋放的不當,將引起混亂,甚至死鎖。
I/O 控制方式:I/O 軟件應向高層軟件提供統一的操作接口。
I/O 軟件的層次
為使十分復雜的 I/O 軟件能具有清晰的結構,更好的可移植性和易適應性。目前在 I/O軟件中已普遍采用了層次式結構,將系統中的設備操作和管理軟件分為若干個層次,每一層都利用其下層提供的服務,完成輸入、輸出功能中的某些子功能,并屏蔽這些功能實現的細節,向高層提供服務。 在層次式結構的 I/O軟件中,只要層次間的接口不變,對每個層次中的軟件進行的修改都不會引起其下層或高層代碼的變更,最低層才會涉及到硬件的具體特性。
用戶層軟件:實現與用戶交互的接口,用戶可直接調用在用戶層提供的、與 I/O 操作有關的庫函數,對設備進行操作。
獨立性軟件:負責實現與設備驅動器的統一接口、設備命名、設備的保護以及設備的分配與釋放等,同時為設備管理和數據傳送提供必要的存儲空間。
設備驅動程序:與硬件直接相關,負責具體實現系統對設備發出的操作指令,驅動I/O設備工作的驅動程序。
中斷處理程序:用于保存被中斷進程的CPU 環境,轉入相應的中斷處理程序進行處理,處理完后再恢復被中斷進程的現場,返回到被中斷進程。
中斷處理程序
中斷處理層的主要工作有:進行進程上下文的切換,對處理中斷信號源進行測試,讀取設備狀態,修改進程狀態等。
當一個進程請求 I/O 操作時,該進程將被掛起,直到 I/O 設備完成 I/O 操作后,設備控制器便向 CPU 發送一中斷請求,CPU 響應后便轉向中斷處理程序,中斷處理程序執行相應的處理,處理完后解除相應進程的阻塞狀態。
中斷處理程序的處理過程
喚醒被阻塞的驅動(程序)進程:當中斷處理程序開始執行時,首先去喚醒處于阻塞狀態的驅動(程序)進程。如果是采用了信號量機制,則可通過執行 signal 操作,將處于阻塞狀態的驅動(程序)進程喚醒。
保護被中斷進程的 CPU 環境:通常由硬件自動將處理機狀態字 PSW 和程序計數器(PC)中的內容,保存在中斷保留區(棧)中,然后把被中斷進程的 CPU 現場信息(即包括所有的 CPU 寄存器,如通用寄存器、段寄存器等內容)都壓入堆棧中。
轉入相應的設備處理程序:由處理機對各個中斷源進行測試,以確定引起本次中斷的 I/O 設備,并發送一應答信號給發出中斷請求的進程,使之消除該中斷請求信號,然后將相應的設備中斷處理程序的入口地址裝入到程序計數器中,使處理機轉向中斷處理程序。
中斷處理:對于不同的設備,有不同的中斷處理程序。該程序首先從設備控制器中讀出設備狀態,以判別本次中斷是正常完成中斷,還是異常結束中斷。若是前者,中斷程序便進行結束處理;若還有命令,可再向控制器發送新的命令,進行新一輪的數據傳送。若是異常結束中斷,則根據發生異常的原因做相應的處理。
恢復被中斷進程的現場:當中斷處理完成以后,便可將保存在中斷棧中的被中斷進程的現場信息取出,并裝入到相應的寄存器中。其中包括該程序下一次要執行的指令的地址 N+1、處理機狀態字 PSW, 以及各通用寄存器和段寄存器的內容。這樣,當處理機再執行本程序時,便從N+1 處開始, 最終返回到被中斷的程序。I/O 操作完成后,驅動程序必須檢查本次 I/O 操作中是否發生了錯誤,并向上層軟件報告。最終向調用者報告本次 I/O 的執行情況。
對多中斷源的處理方式:屏蔽(禁止)中斷,嵌套中斷。
中斷 陷入
陷入通常由處理機正在執行的現行指令引起,而中斷則是由與現行指令無關的中斷源引起的。陷入處理程序提供的服務為當前進程所用,而中斷處理程序提供的服務則不是為了當前進程的。CPU 在執行完一條指令之后,下一條指令開始之前響應中斷,而在一條指令執行中也可以響應陷入。在有的系統中,陷入處理程序被規定在各自的進程上下文中執行,而中斷處理程序則在系統上下文中執行。
設備驅動程序
其主要任務是接收上層軟件發來的抽象 I/O 要求,在把它轉換為具體要求后,發送給設備控制器,啟動設備去執行;此外,它也將由設備控制器發來的信號傳送給上層軟件。有時也可為非常類似的兩類設備配置一個驅動程序。
設備驅動程序的統一接口:一方面,要求每個設備驅動程序與OS之間都有著相同的接口,或者相近的接口,這樣會使添加一個新的設備驅動程序變得很容易,同時在很大程度上方便了開發人員對設備驅動程序的編制。另一方面,要將抽象的設備名映射到適當的驅動程序上,或者說,將抽象的設備名轉換為具體的物理設備名,并進一步可以找到相應物理設備的驅動程序入口。此外,還應對設備進行保護,禁止用戶直接訪問設備,以防止無權訪問的用戶使用。
設備驅動程序的功能
接收由設備獨立性軟件發來的命令和參數,并將命令中的抽象要求轉換為具體要求,檢查用戶 I/O 請求的合法性,了解 I/O 設備的狀態,傳遞有關參數,設置設備的工作方式。 發出 I/O 命令。如果設備空閑,便立即啟動 I/O 設備去完成指定的 I/O 操作;如果設備處于忙碌狀態,則將請求者的請求塊掛在設備隊列上等待。 及時響應由控制器或通道發來的中斷請求,并根據其中斷類型調用相應的中斷處理程序進行處理。 對于設置有通道的計算機系統,驅動程序還應能夠根據用戶的 I/O 請求,自動地構成通道程序。
設備處理方式
為每一類設備設置一個進程,專門用于執行這類設備的 I/O 操作。
在整個系統中設置一個 I/O 進程,專門用于執行系統中所有各類設備的 I/O 操作。
設置一個輸入進程和一個輸出進程,分別處理系統中所有設備的輸入或輸出操作。
不設置專門的設備處理進程,而只為各類設備設置相應的設備處理程序(模塊),供用戶進程或系統進程調用。
驅動程序主要是指在請求 I/O 的進程與設備控制器之間的一個通信和轉換程序。它將進程的 I/O 請求經過轉換后,傳送給控制器;又把控制器中所記錄的設備狀態和 I/O 操作完成情況及時地反映給請求 I/O 的進程。驅動程序與設備控制器和 I/O 設備的硬件特性緊密相關,因而對不同類型的設備應配置不同的驅動程序。驅動程序與 I/O 設備所采用的 I/O 控制方式緊密相關。由于驅動程序與硬件緊密相關,因而其中的一部分必須用匯編語言書寫。目前有很多驅動程序的基本部分,已經固化在 ROM 中。 驅動程序應允許可重入:一個正在運行的驅動程序常會在一次調用完成前被再次調用。 驅動程序不允許系統調用。但是為了滿足其與內核其它部分的交互,可以允許對某些內核過程的調用。
設備驅動程序的處理過程
檢查 I/O 請求的合法性:對于任何輸入設備,都是只能完成一組特定的功能,若該設備不支持這次的 I/O 請求, 則認為這次 I/O 請求非法。
讀出和檢查設備的狀態:在啟動某個設備進行 I/O 操作時,其前提條件應是該設備正處于空閑狀態。因此在啟動設備之前,要從設備控制器的狀態寄存器中,讀出設備的狀態。
傳送必要的參數:對于許多設備,特別是塊設備,除必須向其控制器發出啟動命令外,還需傳送必要的參數。
工作方式的設置:啟動 I/O 設備:在完成上述各項準備工作之后,驅動程序可以向控制器中的命令寄存器傳送相應的控制命令。
對于字符設備,若發出的是寫命令,驅動程序將把一個數據傳送給控制器;若發出的是讀命令,則驅動程序等待接收數據,并通過從控制器中的狀態寄存器讀入狀態字的方法,來確定數據是否到達。
驅動程序發出 I/O 命令后,基本的 I/O 操作是在設備控制器的控制下進行的。通常,I/O 操作所要完成的工作較多,需要一定的時間。
設備獨立性(Device Independence)軟件
應用程序獨立于具體使用的物理設備。 在應用程序中, 使用邏輯設備名稱來請求使用某類設備; 而系統在實際執行時,還必須使用物理設備名稱。 因此,系統須具有將邏輯設備名稱轉換為某物理設備名稱的功能。
設備分配時的靈活性:當應用程序(進程)以物理設備名稱來請求使用指定的某臺設備時,如果該設備已經分配給其他進程或正在檢修,而此時盡管還有幾臺其它的相同設備正在空閑,該進程卻仍阻塞。 若進程能以邏輯設備名稱來請求某類設備時,系統可立即將該類設備中的任一臺分配給進程,僅當所有此類設備已全部分配完畢時,進程才會阻塞。
易于實現 I/O 重定向 :所謂 I/O 重定向,是指用于 I/O 操作的設備可以更換(即重定向),而不必改變應用程序。
設備獨立性軟件
驅動程序是一個與硬件(或設備)緊密相關的軟件。為了實現設備獨立性,必須再在驅動程序之上設置一層軟件,稱為設備獨立性軟件。
功能
執行所有設備的公有操作。包括: 對獨立設備的分配與回收,將邏輯設備名映射為物理設備名,進一步可以找到相應物理設備的驅動程序。對設備進行保護,禁止用戶直接訪問設備。緩沖管理,即對字符設備和塊設備的緩沖區進行有效的管理,以提高I/O的效率。差錯控制,由于在I/O操作中的絕大多數錯誤都與設備有關,故主要由設備驅動程序處理,而設備獨立性軟件只處理那些設備驅動程序無法處理的錯誤;暫時性錯誤:暫時性的事件引起的,可以進行重試來糾正。持久性錯誤:持久性故障引起,通常要查清錯誤原因,才能排除。提供獨立于設備的邏輯塊,不同類型的設備信息交換單位是不同的,讀取和傳輸速率也各不相同,即使同一類型的設備,其信息交換單位大小也是有差異的,對邏輯設備使用并向高層軟件提供大小統一的邏輯數據塊。
向用戶層(或文件層)軟件提供統一接口。邏輯設備名到物理設備名映射的實現。
邏輯設備表(LUT,Logical Unit Table) :為了實現設備的獨立性,系統必須設置一張邏輯設備表,用于將應用程序中所使用的邏輯設備名映射為物理設備名。在該表的每個表目中包含了三項: 邏輯設備名、物理設備名和設備驅動程序的入口地址。當進程用邏輯設備名請求分配 I/O 設備時,系統為它分配相應的物理設備,并在 LUT 上建立一個表目,填上應用程序中使用的邏輯設備名和系統分配的物理設備名,以及該設備驅動程序的入口地址。當以后進程再利用該邏輯設備名請求 I/O 操作時,系統通過查找 LUT,便可找到物理設備和驅動程序。
LUT 的設置問題
整個系統中只設置一張 LUT:由于系統中所有進程的設備分配情況都記錄在同一張 LUT 中,因而不允許在 LUT 中具有相同的邏輯設備名這就要求所有用戶都不使用相同的邏輯設備名。主要用于單用戶系統中。
為每個用戶設置一張 LUT。每當用戶登錄時,便為該用戶建立一個進程,同時也為之建立一張 LUT,并將該表放入進程的 PCB 中。由于通常在多用戶系統中,都配置了系統設備表,故此時的邏輯設備表的表目為邏輯設備名,系統設備表指針。
用戶層的 I/O 軟件
為使諸進程能有條不紊地使用I/O設備,保護設備的安全性, 不允許運行在用戶態的應用進程去直接調用運行在核心態(系統態)的OS過程。應用進程在運行時,又必須取得OS所提供的服務,否則,應用程序幾乎無法運行。 為了解決此矛盾,OS在用戶層中引入了一個中介過程——系統調用。
應用程序可以通過它間接調用OS中的I/O過程,對I/O設備進行操作。用戶層軟件必須通過一組系統調用來取得操作系統服務。在現代的高級語言以及 C 語言中,通常提供了與各系統調用一一對應的庫函數,用戶程序通過調用對應的庫函數使用系統調用。這些庫函數與調用程序連接在一起,包含在運行時裝入在內存的二進制程序中。
設備分配
為防止諸進程對系統資源的無序競爭,特規定系統設備不允許用戶自行使用,必須由系統統一分配。每當進程向系統提出 I/O 請求時,只要是可能和安全的,設備分配程序便按照一定的策略,把設備分配給請求用戶(進程)。在有的系統中,為了確保在 CPU 與設備之間能進行通信,還應分配相應的控制器和通道。
設備分配中的數據結構
設備控制表(DCT) ,用于記錄本設備的情況。
指示設備類型的字段 type
設備標識字段deviceid
設備隊列隊首指針:凡因請求本設備而未得到滿足的進程,其 PCB 都應按照一定的策略排成一個隊列稱該隊列為設備請求隊列或簡稱設備隊列。 其隊首指針指向隊首 PCB。在有的系統中還設置了隊尾指針。
設備狀態。當設備自身正處于使用狀態時,應將設備的忙/閑標志置“1”。若與該設備相連接的控制器或通道正忙,也不能啟動該設備,此時則應將設備的等待標志置“1”。
與設備連接的控制器表指針:在設備到主機之間具有多條通路的情況下,一個設備將與多個控制器相連接。 此時,在 DCT中還應設置多個控制器表指針。
重復執行次數:由于外部設備在傳送數據時,較易發生數據傳送錯誤,因而在許多系統中,如果發生傳送錯誤,并不立即認為傳送失敗,而是令它重新傳送,并由系統規定設備在工作中發生錯誤時應重復執行的次數。在重復執行時,若能恢復正常傳送,則仍認為傳送成功。 僅當屢次失敗,致使重復執行次數達到規定值而傳送仍不成功時,才認為傳送失敗。
控制器控制表(COCT)。控制器標識符,控制器狀態,與控制器連接的通道表指針,控制器隊列的隊首指針,控制器隊列的隊尾指針。
通道控制表(CHCT)。通道標識符,通道狀態,與通道連接的控制器表首址,通道隊列的隊首指針,通道隊列的隊尾指針。
系統設備表(SDT)。其中記錄了系統中全部設備的情況。 每個設備占一個表目,其中包括有設備類型、設備標識符、設備控制表及設備驅動程序的入口等項。
設備分配時應考慮的因素
設備的固有屬性:在分配設備時,首先應考慮與設備分配有關的設備屬性。對于獨占設備,應采用獨享分配策略,即將一個設備分配給某進程后,便由該進程獨占,直至該進程完成或釋放該設備,然后,系統才能再將該設備分配給其他進程使用。設備得不到充分利用,而且還可能引起死鎖。對于共享設備,可同時分配給多個進程使用,此時須注意對這些進程訪問該設備的先后次序進行合理的調度。可虛擬設備。一臺可虛擬設備是可共享的設備,可以將它同時分配給多個進程使用,并對這些訪問該設備的先后次序進行控制。
設備分配算法
先來先服務。當有多個進程對同一設備提出 I/O 請求時,該算法是根據諸進程對某設備提出請求的先后次序,將這些進程排成一個設備請求隊列,設備分配程序總是把設備首先分配給隊首進程。
優先級高者優先。在進程調度中的這種策略,是優先權高的進程優先獲得處理機。 如果對這種高優先權進程所提出的 I/O請求也賦予高優先權,顯然有助于這種進程盡快完成。 在利用該算法形成設備隊列時,將優先權高的進程排在設備隊列前面,而對于優先級相同的 I/O請求,則按先來先服務原則。
設備分配中的安全性
安全分配方式:在這種分配方式中,每當進程發出 I/O 請求后,便進入阻塞狀態,直到其 I/O 操作完成時才被喚醒。一旦進程已經獲得某種設備(資源)后便阻塞,使該進程不可能再請求任何資源,而在它運行時又不保持任何資源。 因此,這種分配方式摒棄了 “請求和保持”條件,從而使設備分配是安全的。 進程進展緩慢,即 CPU 與 I/O 設備是串行工作的。
不安全分配方式:在這種分配方式中,進程在發出 I/O 請求后仍繼續運行,需要時又發出第二個I/O 請求、 僅當進程所請求的設備已被另一進程占用時,請求進程才進入阻塞狀態。 一個進程可同時操作多個設備,使進程推進迅速。分配不安全,因為它可能具備“請求和保持”條件,從而可能造成死鎖。因此,在設備分配程序中,還應再增加一個功能,以用于對本次的設備分配是否會發生死鎖進行安全性計算,僅當計算結果說明分配是安全的情況下才進行設備分配。
獨占設備的分配程序
分配設備:首先根據 I/O 請求中的物理設備名,查找系統設備表(SDT),從中找出該設備的 DCT, 再根據 DCT中的設備狀態字段,可知該設備是否正忙。 若忙,便將請求 I/O 進程的 PCB。掛在設備隊列上;否則,便按照一定的算法來計算本次設備分配的安全性。 如果不會導致系統進入不安全狀態,便將設備分配給請求進程;否則,仍將其PCB 插入設備等待隊列。
分配控制器 :在系統把設備分配給請求 I/O 的進程后,再到其 DCT 中找出與該設備連接的控制器的 COCT,從 COCT的狀態字段中可知該控制器是否忙碌。 若忙,便將請求 I/O 進程的 PCB 掛在該控制器的等待隊列上;否則,便將該控制器分配給進程。
分配通道:在該 COCT 中又可找到與該控制器連接的通道的 CHCT 再根據 CHCT 內的狀態信息, 可知該通道是否忙碌。若忙,便將請求I/O 的進程掛在該通道的等待隊列上; 否則,將該通道分配給進程。只有在設備、 控制器和通道三者都分配成功時,這次的設備分配才算成功。然后,便可啟動該 I/O 設備進行數據傳送。
設備分配程序的改進
增加設備的獨立性:為了獲得設備的獨立性,進程應使用邏輯設備名請求I/O。 這樣,系統首先從 SDT 中 找出第一個該類設備的 DCT。 僅當所有該類設備都忙時,才把進程掛在該類設備的等待隊列上;而只要有一個該類設備可用,系統便進一步計算分配該設備的安全性。
考慮多通路情況:為了防止在 I/O系統中出現“瓶頸”現象,通常都采用多通路的 I/O 系統結構。 此時對控制器和通道的分配同樣要經過幾次反復,僅當所有的控制器(通道)都忙時,此次的控制器(通道)分配才算失敗,才把進程掛在控制器(通道)的等待隊列上。 而只要有一個控制器,(通道)可用,系統便可將它分配給進程。
SPOOLing技術
將一臺物理 I/O 設備虛擬為多臺邏輯 I/O 設備,允許多個用戶共享一臺物理 I/O 設備。
當系統中引入了多道程序技術后,完全可以利用其中的一道程序,來模擬脫機輸入時的外圍控制機功能,把低速 I/O設備上的數據傳送到高速磁盤上;再用另一道程序來模擬脫機輸出時外圍控制機的功能,把數據從磁盤傳送到低速輸出設備上。這樣,便可在主機的直接控制下,實現脫機輸入、輸出功能。 此時的外圍操作與 CPU 對數據的處理同時進行,這種在聯機情況下實現的同時外圍操作稱為 SPOOLing(Simultaneaus Periphernal Operating On Line),或稱為假脫機操作。
SPOOLing 系統的組成
輸入井:模擬脫機輸入時的磁盤,用于暫存 I/O 設備輸入的數據;輸出井:模擬脫機輸出時的磁盤,用于暫存用戶程序的輸出數據。
為了緩和 CPU 和磁盤之間速度不匹配的矛盾,在內存中要開辟兩個緩沖區。輸入緩沖區:用于暫存由輸入設備送來的數據,以后再傳送到輸入井。輸出緩沖區:用于暫存從輸出井送來的數據,以后再傳送給輸出設備。
輸入進程SPi:模擬脫機輸入時的外圍控制機,將用戶要求的數據從輸入機通過輸入緩沖區再送到輸入井,當 CPU 需要輸入數據時,直接從輸入井讀入內存;
輸出進程 SPo:模擬脫機輸出時的外圍控制機,把用戶要求輸出的數據先從內存送到輸出井待輸出設備空閑時,再將輸出井中的數據經過輸出緩沖區送到輸出設備上。
共享打印機
當用戶進程請求打印輸出時,SPOOLing 系統同意為它打印輸出,但并不真正立即把打印機分配給該用戶進程:由輸出進程在輸出井中為之申請一個空閑磁盤塊區,并將要打印的數據送入其中;輸出進程再為用戶進程申請一張空白的用戶請求打印表,并將用戶的打印要求填入其中,再將該表掛到請求打印隊列上。如果還有進程要求打印輸出,系統仍可接受該請求,也同樣為該進程做上述兩件事。 如果打印機空閑,輸出進程將從請求打印隊列的隊首取出一張請求打印表。根據表中的要求將要打印的數據,從輸出井傳送到內存緩沖區,再由打印機進行打印。打印完后,輸出進程再查看請求打印隊列中是否還有等待打印的請求表。若有,又取出隊列中的第一張表,并根據其中的要求進行打印,如此下去,直至請求打印隊列為空,輸出進程才將自己阻塞起來,僅當下次再有打印請求時,輸出進程才被喚醒。
SPOOLing 系統的特點
提高了 I/O 的速度:對數據所進行的 I/O 操作,已從對低速 I/O 設備進行的 I/O操作,演變為對輸入井或輸出井中數據的存取,提高了 I/O 速度,緩和了 CPU 與低速 I/O 設備之間速度不匹配的矛盾。
將獨占設備改造為共享設備。因為在 SPOOLing 系統中,實際上并沒為任何進程分配設備,而只是在輸入井或輸出井中為進程分配一個存儲區和建立一張I/O 請求表。 這樣,便把獨占設備改造為共享設備。
實現了虛擬設備功能。宏觀上,雖然是多個進程在同時使用一臺獨占設備,而對于每一個進程而言,他們都會認為自己是獨占了一個設備。當然,該設備只是邏輯上的設備。 SPOOLing 系統實現了將獨占設備變換為若干臺對應的邏輯設備的功能。
磁盤存儲器的管理
磁盤性能簡述
數據的組織和格式
磁盤設備可包括一或多個物理盤片,每個磁盤片分一個或兩個存儲面(surface)。每個磁盤面被組織成若干個同心環,這種環稱為磁道(track),各磁道之間留有必要的間隙。為使處理簡單起見,在每條磁道上可存儲相同數目的二進制位。磁盤密度即每英寸中所存儲的位數,顯然是內層磁道的密度較外層磁道的密度高。每條磁道又被邏輯上劃分成若干個扇區(sectors),一個扇區稱為一個盤塊(或數據塊),常常叫做磁盤扇區。各扇區之間保留一定的間隙。
一個物理記錄存儲在一個扇區上,磁盤上存儲的物理記錄塊數目是由扇區數、磁道數以及磁盤面數所決定的。為了提高磁盤的存儲容量,充分利用磁盤外面磁道的存儲能力,現代磁盤不再把內外磁道劃分為相同數目的扇區。而是利用外層磁道容量較內層磁道大的特點,將盤面劃分成若干條環帶,使得同一環帶內的所有磁道具有相同的扇區數。顯然,外層環帶的磁道擁有較內層環帶的磁道更多的扇區。為了減少這種磁道和扇區在盤面分布的幾何形式變化對驅動程序的影響,大多數現代磁盤都隱藏了這些細節。向操作系統提供虛擬幾何的磁盤規格,而不是實際的物理幾何規格。
為了在磁盤上存儲數據,必須先將磁盤低級格式化。其中每條磁道含有 30 個固定大小的扇區,每個扇區容量 為 600 個字節,其中 512 個字節存放數據,其余的用于存放控制信息。每個扇區包括兩個字段: 標識符字段,其中SYNCH具有特定的位圖像,作為該字段的定界符,利用磁道號,磁頭號及扇區號三者來標識一個扇區;CRC 字段用于段校驗。數據字段,其中可存放 512 個字節的數據。
磁盤格式化完成后,一般要對磁盤分區。在邏輯上,每個分區就是一個獨立的邏輯磁盤。每個分區的起始扇區和大小都記錄在磁盤 0 扇區的主引導記錄分區表所包含的分區表中。在這個分區表中必須有一個分區被標記成活動的,以保證能夠從硬盤引導系統。 但是,在真正可以使用磁盤前,還需要對磁盤進行一次高級格式化,即設置一個引導塊、空閑存儲管理、根目錄和一個空文件系統,同時在分區表中標記該分區所使用的文件系統。
磁盤的類型
硬盤和軟盤
單片盤和多片盤
固定頭磁盤:這種磁盤在每條磁道上都有一讀/寫磁頭,所有的磁頭都被裝在一剛性磁臂中。通過這些磁頭可訪問所有各磁道,進行并行讀/寫,有效地提高了磁盤的 I/O 速度。 這種結構的磁盤主要用于大容量磁盤上。
移動頭磁盤:每一個盤面僅配有一個磁頭,也被裝入磁臂中。 為能訪問該盤面上的所有磁道,該磁頭必須能移動以進行尋道。可見,移動磁頭僅能以串行方式讀/寫,致使其 I/O 速度較慢; 但由于其結構簡單,故仍廣泛應用于中小型磁盤設備中。在微型機上配置的溫盤和軟盤都采用移動磁頭結構。
磁盤訪問時間
磁盤設備在工作時以恒定速率旋轉。為了讀或寫,磁頭必須能移動到所要求的磁道上,并等待所要求的扇區的開始位置旋轉到磁頭下,然后再開始讀或寫數據。
尋道時間 Ts:這是指把磁臂(磁頭)移動到指定磁道上所經歷的時間。 該時間是啟動磁臂的時間 s 與磁頭移動 n 條磁道所花費的時間之和, Ts = m×n + s 其中,m 是一常數,與磁盤驅動器的速度有關,對于一般磁盤,m = 0.2;對于高速磁盤,m ≤0.1,磁臂的啟動時間約為 2 ms。
旋轉延遲時間 Tr :這是指定扇區移動到磁頭下面所經歷的時間。 不同的磁盤類型中,旋轉速度至少相差一個數量級,甚至更高。
傳輸時間 Tt:這是指把數據從磁盤讀出或向磁盤寫入數據所經歷的時間。Tt的大小與每次所讀/寫的字節數b和旋轉速度有關: Tt= b/ rN 其中,r為磁盤每秒鐘的轉數;N 為一條磁道上的字節數,當一次讀/寫的字節數相當于半條磁道上的字節數時,Tt 與 Tr相同。
因此,可將訪問時間 Ta表示為 Ta=Ts+1/2r+b/rN。在訪問時間中,尋道時間和旋轉延遲時間基本上都與所讀/寫數據的多少無關,而且它通常占據了訪問時間中的大頭。適當地集中數據(不要太零散)傳輸,將有利于提高傳輸效率。
磁盤調度
先來先服務(FCFS,First Come First Served) :這是一種最簡單的磁盤調度算法。它根據進程請求訪問磁盤的先后次序進行調度。 公平、簡單,且每個進程的請求都能依次地得到處理,不會出現某一進程的請求長期得不到滿足的情況。但此算法由于未對尋道進行優化,致使平均尋道時間可能較長。 適用于請求磁盤 I/O 的進程數目較少的場合。
最短尋道時間優先(SSTF,Shortest Seek Time First) :其要求訪問的磁道與當前磁頭所在的磁道距離最近,以使每次的尋道時間最短 但這種算法不能保證平均尋道時間最短。
掃描(SCAN)算法:SSTF 算法雖然能獲得較好的尋道性能,但卻可能導致某個進程發生“饑餓” (Starvation) 現象 。 因為只要不斷有新進程的請求到達,且其所要訪問的磁道與磁頭當前所在磁道的距離較近,這種新進程的 I/O請求必然優先滿足。SCAN算法算法不僅考慮到欲訪問的磁道與當前磁道間的距離,更優先考慮的是磁頭當前的移動方向。自里向外地訪問,直至再無更外的磁道需要訪問時,才將磁臂換向為自外向里移動。要訪問的磁道在當前位置內距離最近者,這樣,磁頭又逐步地從外向里移動,直至再無更里面的磁道要訪問,從而避免了出現“饑餓”現象。由于在這種算法中磁頭移動的規律頗似電梯的運行,因而又常稱之為電梯調度算法。
循環掃描(CSCAN)算法 :SCAN 存在這樣的問題:當磁頭剛從里向外移動而越過了某一磁道時,恰好又有一進程請求訪問此磁道,這時,該進程必須等待,待磁頭繼續從里向外,然后再從外向里掃描完所有要訪問的磁道后,才處理該進程的請求 致使該進程的請求被大大地推遲。 為了減少這種延遲,CSCAN 算法規定磁頭單向移動,當磁頭移到最外的磁道并訪問后,磁頭立即返回到最里的欲訪問的磁道 ,亦即將最小磁道號緊接著最大磁道號構成循環,進行循環掃描。
NStepSCAN 算法
在 SSTF、 SCAN 及 CSCAN幾種調度算法中,都可能會出現磁臂停留在某處不動的情況,從而壟斷了整個磁盤設備。 我們把這一現象稱為“磁臂粘著” (Armstickiness)。在高密度磁盤上容易出現此情況。 N 步 SCAN 算法是將磁盤請求隊列分成若干個長度為 N 的子隊列,磁盤調度將按 FCFS 算法依次處理這些子隊列。 而每處理一個隊列時又是SCAN 算法,對一個隊列處理完后,再處理其他隊列。當正在處理某子隊列時,如果又出現新的磁盤 I/O 請求,便將新請求進程放入其他隊列,這樣就可避免出現粘著現象。 當 N 值取得很大時,會使N 步掃描法的性能接近于SCAN 算法的性能;當 N=1 時,N 步 SCAN 算法便蛻化為 FCFS 算法。
FSCAN 算法
FSCAN 算法實質上是 N 步 SCAN 算法的簡化,即 FSCAN 只將磁盤請求隊列分成兩個子隊列。一個是由當前所有請求磁盤 I/O 的進程形成的隊列,由磁盤調度按 SCAN 算法進行處理。 在掃描期間,將新出現的所有請求磁盤 I/O的進程,放入另一個等待處理的請求隊列。 這樣,所有的新請求都將被推遲到下一次掃描時處理。
磁盤高速緩存(Disk Cache)
指利用內存中的存儲空間來暫存從磁盤中讀出的一系列盤塊中的信息。 因此,這里的高速緩存是一組在邏輯上屬于磁盤,而物理上是駐留在內存中的盤塊。在內存中開辟一個單獨的存儲空間來作為磁盤高速緩存,其大小是固定的,不會受應用程序多少的影響。
把所有未利用的內存空間變為一個緩沖池,供請求分頁系統和磁盤 I/O 時(作為磁盤高速緩存)共享。此時,高速緩存的大小顯然不再是固定的。當磁盤 I/O 的頻繁程度較高時,該緩沖池可能包含更多的內存空間;而在應用程序運行得較多時,該緩沖池可能只剩下較少的內存空間。
數據交付(Data Delivery)
指將磁盤高速緩存中的數據傳送給請求者進程。當有一進程請求訪問某個盤塊中的數據時,由核心先去查看磁盤高速緩沖器,看其中是否存在進程所需訪問的盤塊數據的拷貝。若有其拷貝,便直接從高速緩存中提取數據交付給請求者進程, 這樣,就避免了訪盤操作,從而使本次訪問速度提高;否則,應先從磁盤中將所要訪問的數據讀入并交付給請求者進程,同時也將數據送高速緩存。當以后又需要訪問該盤塊的數據時,便可直接從高速緩存中提取。
數據交付。這是直接將高速緩存中的數據,傳送到請求者進程的內存工作區中。
指針交付。將指向高速緩存中某區域的指針交付給請求者進程。由于所傳送的數據量少,因而節省了數據從磁盤高速緩存到進程的內存工作區的時間。
置換算法
訪問頻率:通常,每執行一條指令時,便可能訪問一次聯想存儲器,亦即聯想存儲器的訪問頻率, 基本上與指令執行的頻率相當。 而對高速緩存的訪問頻率,則與磁盤I/O 的頻率相當。 因此,對聯想存儲器的訪問頻率遠遠高于對高速緩存的訪問頻率。
預見性
數據的一致性
在有的系統中將高速緩存中的所有盤塊數據拉成一條 LRU 鏈。對于那些會嚴重影響到數據一致性的盤塊數據和很久都可能不再使用的盤塊數據,都放在 LRU 鏈的頭部,使它們被優先寫回磁盤,以減少發生數據不一致性的概率,或者可以盡早地騰出高速緩存的空間。 對于那些可能在不久之后便要再使用的盤塊數據,應掛在 LRU鏈的尾部,以便在不久以后需要時,只要該數據塊尚未從鏈中移至鏈首而被寫回磁盤,便可直接到高速緩存中(即 LRU 鏈中)去找到它們。
周期性地寫回磁盤
LRU 鏈意味著鏈中任一元素在被訪問之后,總是又被掛到鏈尾而不被寫回磁盤;只是一直未被訪問的元素,才有可能移到鏈首,而被寫回磁盤,為了解決這一問題,在 UNIX系統中專門增設了一個修改(update)程序,使之在后臺運行,該程序周期性地調用一個系統調用 SYNC,該調用的主要功能是強制性地將所有在高速緩存中已修改的盤塊數據寫回磁盤。 這樣, 因系統故障所造成的工作損失不會超過30 s的勞動量。在MS-DOS中所采用的方法是: 只要高速緩存中的某盤塊數據被修改,便立即將它寫回磁盤,并將這種高速緩存稱為“寫穿透高速緩存”(write-through cache)。 MS-DOS所采用的寫回方式,幾乎不會造成數據的丟失,但須頻繁地啟動磁盤。
提高磁盤 I/O 速度的其它方法
提前讀(Read-ahead)
用戶(進程)對文件進行訪問時,經常采用順序訪問方式,即順序地訪問文件各盤塊的數據。在這種情況下,在讀當前塊時可以預知下一次要讀的盤塊。因此,可以采取預先讀方式,即在讀當前塊的同時,還要求將下一個盤塊(提前讀的塊)中的數據也讀入緩沖區。 這樣,當下一次要讀該盤塊中的數據時,由于該數據已被提前讀入緩沖區,因而此時便可直接從緩沖區中取得下一盤塊的數據,而不需再去啟動磁盤I/O,從而大大減少了讀數據的時間。 這也就等效于提高了磁盤 I/O 的速度。
延遲寫
延遲寫是指在緩沖區 A 中的數據,本應立即寫回磁盤,但考慮到該緩沖區中的數據在不久之后可能還會再被本進程或其它進程訪問(共享資源) ,因而并不立即將該緩沖區 A中的數據寫入磁盤,而是將它掛在空閑緩沖區隊列的末尾。 隨著空閑緩沖區的使用,緩沖區也緩緩往前移動,直至移到空閑緩沖隊列之首。當再有進程申請到該緩沖區時,才將該緩沖區中的數據寫入磁盤,而把該緩沖區作為空閑緩沖區分配出去。 當該緩沖區A仍在隊列中時,任何訪問該數據的進程,都可直接讀出其中的數據而不必去訪問磁盤。
優化物理塊的分布
使磁頭的移動距離最小。 雖然鏈接分配和索引分配方式都允許將一個文件的物理塊分散在磁盤的任意位置,但如果將一個文件的多個物理塊安排得過于分散,會增加磁頭的移動距離。如果我們將這兩個數據塊安排在屬于同一條磁道的兩個盤塊上,顯然會由于消除了磁頭在磁道間的移動而大大提高對這兩個盤塊的訪問速度。
對文件盤塊位置的優化,應在為文件分配盤塊時進行。 如果系統中的空白存儲空間是采用位示圖方式表示的則要將同屬于一個文件的盤塊安排在同一條磁道上或相鄰的磁道上是十分容易的事。 這時,只要從位示圖中找到一片相鄰接的多個空閑盤塊即可。但當系統采用線性表(鏈)法來組織空閑存儲空間時,要為一文件分配多個相鄰接的盤塊,就要困難一些。此時,我們可以將在同一條磁道上的若干個盤塊組成一簇,在分配存儲空間時,以簇為單位進行分配。這樣就可以保證在訪問這幾個盤塊時,不必移動磁頭或者僅移動一條磁道的距離,從而減少了磁頭的平均移動距離。
虛擬盤
所謂虛擬盤,是指利用內存空間去仿真磁盤,又稱為 RAM 盤。該盤的設備驅動程序也可以接受所有標準的磁盤操作,但這些操作的執行,不是在磁盤上而是在內存中。 這些對用戶都是透明的。它是易失性存儲器,故一旦系統或電源發生故障,或系統再啟動時,原來保存在虛擬盤中的數據將會丟失。因此,虛擬盤通常用于存放臨時文件,如編譯程序所產生的目標程序等。 虛擬盤中的內容完全由用戶控制,而高速磁盤緩存中的內容則是由 OS 控制的
廉價磁盤冗余陣列 (RAID,Redundant Array of Inexpensive Disk)
它是利用一臺磁盤陣列控制器,來統一管理和控制一組(幾臺到幾十臺)磁盤驅動器,組成一個高度可靠的、快速的大容量磁盤系統。
并行交叉存取:為了提高對磁盤的訪問速度,已把在大、中型機中應用的交叉存取(Interleave)技術應用到了磁盤存儲系統中。在該系統中,有多臺磁盤驅動器,系統將每一盤塊中的數據分為若干個子盤塊數據,再把每一個子盤塊的數據分別存儲到各個不同磁盤中的相同位置上。當要將一個盤塊的數據傳送到內存時,采取并行傳輸方式,將各個盤塊中的子盤塊數據同時向內存中傳輸,從而使傳輸時間減少。
RAID 的分級
RAID 0級。 本級僅提供了并行交叉存取。它雖能有效地提高磁盤 I/O速度,但并無冗余校驗功能,致使磁盤系統的可靠性不好。 只要陣列中有一個磁盤損壞,便會造成不可彌補的數據丟失,故較少使用。
RAID1級。 它具有磁盤鏡像功能,在每次訪問磁盤時,可利用并行讀、寫特性,將數據分塊同時寫入主盤和鏡像盤。故其比傳統的鏡像盤速度快,但其磁盤容量的利用率只有 50%,它是以犧牲磁盤容量為代價的。
RAID 3級。這是具有并行傳輸功能的磁盤陣列。 它利用一臺奇偶校驗盤來完成數據的校驗功能,比起磁盤鏡像,它減少了所需要的冗余磁盤數。
RAID3級經常用于科學計算和圖像處理。
RAID 5級。這是一種具有獨立傳送功能的磁盤陣列。每個驅動器都各有自己獨立的數據通路,獨立地進行讀/寫,且無專門的校驗盤。用來進行糾錯的校驗信息,是以螺旋 (Spiral)方式散布在所有數據盤上。 RAID 5 級常用于 I/O 較頻繁的事務處理中。
RAID 6級和RAID 7級。 這是強化了的 RAID。在 RAID 6級的陣列中,設置了一個專用的、可快速訪問的異步校驗盤。該盤具有獨立的數據訪問通路,具有比 RAID 3 級及 RAID 5 級更好的性能,但其性能改進得很有限,且價格昂貴。 RAID 7級是對 RAID 6 級的改進,在該陣列中的所有磁盤,都具有較高的傳輸速率和優異的性能 是目前最高檔次的磁盤陣列,但其價格也較高。
RAID 的優點
可靠性高: 除了 RAID 0 級外,其余各級都采用了容錯技術。當陣列中某一磁盤損壞時,并不會造成數據的丟失,因為它既可實現磁盤鏡像,又可實現磁盤雙工,還可實現其它的冗余方式。所以此時可根據其它未損壞磁盤中的信息,來恢復已損壞的盤中的信息。 它與單臺磁盤機相比,其可靠性高出了一個數量級。
磁盤 I/O速度高:由于磁盤陣列可采取并行交叉存取方式,故可將磁盤 I/O 速度提高 N-1 倍(N 為磁盤數目)。
性能/價格比高:利用 RAID技術來實現大容量高速存儲器時 其體積與具有相同容量和速度的大型磁盤系統相比,只是后者的 1/3 價格也只是后者的 1/3,且可靠性高
總結
以上是生活随笔為你收集整理的2020-12-5(操作系统---设备管理)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2020-12-4((ARM汇编)mov
- 下一篇: 2020-12-6(从反汇编理解指针和引