官术网_书友最值得收藏!

2.6 I/O設備

操作系統的核心內容是內存管理、進程管理等,而I/O設備作為計算機系統與外界的交互和通信媒介,其管理和控制也不容忽視。并且,由于I/O設備千差萬別,這就給操作系統的I/O設備管理和控制造成了不少的難度和麻煩。

在I/O設備中,最重要的也許就數磁盤了。磁盤作為操作系統和各類應用程序及數據文件的存儲介質,其管理和調度的效率同樣是操作系統性能的重要影響因素。I/O設備盡管很多,但是可以根據其信息傳遞的發送者和接收者的不同將其分為3類,即人機交互型、計算機系統內交互型和通信類型。其中人機交互型I/O是指用于人機交互的I/O設備,如顯示器、鍵盤、鼠標和打印機等;對計算機系統內交互型I/O而言,所傳遞的信息只是計算機內部可識別的,如磁盤驅動器、傳感器、控制器等;通信類型I/O則用于計算機系統與外部設備的交互,這樣的I/O設備包括調制解調器、網卡等。

2.6.1 I/O設備描述參數

I/O設備千差萬別,總結起來,可以看出I/O設備在6個方面顯示出各自不同于其他I/O設備的特征,這在I/O設備管理和控制中需要考慮到。

(1)數據傳輸速率

不同I/O設備之間的數據傳輸速率可以相差幾個數量級。例如,現在的磁盤傳輸峰值速率可以達到100Mbps,而鍵盤輸入數據的傳輸速率可能慢到幾分鐘才一個字節。

(2)功能應用

I/O設備的功能界定會影響到操作系統的相關設計。例如,一個磁盤I/O需要操作系統具備文件系統管理功能。

(3)控制復雜度

打印機可能只需要很簡單的控制界面,而磁盤控制界面可能就復雜得多。如何能夠隱藏這些復雜性,使得使用簡便,是操作系統需要考慮的事情。

(4)傳輸數據的計量單位

傳輸數據的計量單位是塊傳輸方式還是流傳輸方式,都會對操作系統的設計產生影響。

(5)數據編碼方式

不同的I/O設備有著不同的編碼方式,這其中包括字符含義的規定和不同的奇偶校驗等。

(6)出錯情況

I/O設備在運行過程中出現的錯誤及其報告方式、錯誤所導致的后果,以及可能的反應都因I/O設備的不同而不同。

2.6.2 I/O技術的演變

和計算機系統的其他軟、硬模塊存在一個演化的過程一樣,I/O技術也在不斷地發展演化。從早期的由處理器直接控制到現在的I/O模塊自成一體,I/O技術的演變總共可以分為6個階段。

● 處理器直接控制外圍設備。

● 可編程I/O模塊引入,處理器與某些I/O設備工作的具體細節有了某種程度的分離,不過在這階段,處理器需要在進行I/O操作的過程中掛起等待直到操作完成。

● 在可編程I/O模塊的基礎上引入中斷,這樣,處理器可以在I/O設備完成相應操作的同時去執行其他指令。

● DMA技術引入,這個時候,I/O模塊可以通過DMA技術和內存直接打交道而不需要通過處理器才能完成每一次的I/O讀寫。

● I/O模塊功能進一步增強,可以看做是一個專用的處理器,從而中央處理器得到了進一步解放。

● I/O模塊功能再一次提升,開始擁有自己的獨立的內存。

從以上發展趨勢不難看出,I/O技術的演變過程實際上也是計算機系統的中央處理器從I/O繁重的事務處理中不斷得到解脫的過程。雖然說,I/O技術已經發展到了第六階段,但是值得注意的是,直接內存訪問(DMA)技術仍然在計算機系統的I/O技術中扮演著非常重要的角色。其中第五階段的I/O模塊被稱為I/O通道,第六階段的I/O模塊被稱為I/O處理器,一般地,兩者可統稱為I/O通道。

2.6.3 I/O設備邏輯描述

前面已經看到,I/O設備在6個方面各有特色,并且I/O技術也在不斷演化,可能出現即便是同一種I/O設備,卻用不同技術實現的情況,這就給操作系統的I/O設備管理與控制帶來了難度。一般而言,在這方面,操作系統設計需要考慮兩方面的問題。一是效率問題,因為I/O設備是系統性能的瓶頸所在,效率就尤顯重要;二是抽象程度問題,總是希望所有的I/O設備都能有一個統一的接口便于上層系統和應用的操作,因此,需要對各I/O設備進行某種程度甚至是多個層次的抽象以便統一管理和操作。

多道程序設計在某種程度上可以提高效率,它可以讓在某些進程等待I/O處理的同時,別的進程仍然繼續運行。然而,即便是這樣,仍然會有瓶頸存在,那就是當進程在內存和磁盤之間進行交換(swap)的時候,需要涉及到對磁盤的頻繁訪問,而磁盤訪問本身就是一個很典型的I/O操作,將在后面章節詳細闡述相關內容。這里主要討論與抽象問題有關的I/O設備的邏輯描述。

I/O設備邏輯描述本質上是一個層次化描述。通過對較低一層的抽象和某些細節的隱藏,從而對上層提供更抽象、更一般化的操作界面,進而達到對各類I/O設備的某種抽象層次上的統一。

按照這種層次化思想,我們可以根據各類設備的不同特點抽象出適合它們的邏輯描述形式,在圖2-9中給出了最常見的3種。

圖2-9 一個I/O邏輯描述形式

先來看看其中最簡單的一種,就是本地外圍設備I/O的邏輯描述,如圖2-9(a)所示。

(1)邏輯I/O

邏輯I/O模塊將I/O設備看做是一個邏輯資源,而不需要去考慮具體某個細節是怎么實現的,它提供用戶進程所需的一些一般性的I/O功能接口,從而讓用戶進程只需要進行類似打開、關閉、讀和寫這樣的簡單命令就可以對I/O設備進行操作了。

(2)設備I/O

在設備I/O層,各種操作申請和一些數據被轉換成一連串的I/O指令、通道命令及控制指令。在這里,緩沖技術可用來提高效率。

(3)調度與控制

I/O操作的排隊和調度在這一層完成,同時也包括對操作的控制。在這一層中,中斷被處理,I/O狀態得以收集和報告,軟件和硬件才開始真正打交道。

對于一個通信設備而言,如圖2-9(b)所示,其邏輯描述形式和本地外圍設備的很相像。最主要的不同點就是邏輯I/O模塊被換成了通信架構模塊,而這個模塊本身可能就包含很多層,比如說TCP/IP等。

圖2-9(c)給出了支持文件系統的外圍存儲設備I/O的一個很典型的邏輯表達形式,它有著本地外圍設備I/O所沒有的3個層次。

①目錄管理

在這一層中,以字符串形式給出的文件名將被轉換成一個通過文件描述符或者索引表格直接或間接地指向相應文件的標識。這一層也處理用戶進程所發出的某些針對文件目錄的操作,如創建、刪除、重新組織等。

②文件系統

這一層負責文件的邏輯組織,并且會處理用戶發出的某些操作申請,比如打開、關閉、讀、寫等,訪問權限管理也在這一層實現。

③物理組織

對文件和記錄位置的邏輯表達必須在適當時候轉換成外圍存儲設備中的物理地址,并且外圍存儲空間的分配需要合理管理,這些都是物理組織層的任務所在。

2.6.4 I/O緩沖技術

現代操作系統引入了虛擬內存管理,這為進程管理和程序編寫帶來了極大方便。現在來考慮在一般情況下,進程在完成對某I/O設備的讀寫操作時會發生什么情況。

先來看進程在其虛擬內存中間完成讀寫操作的情況。當進程需要和I/O設備交換信息的時候,需要在其虛擬內存空間保留一塊內存區域來容納相應的信息,這就有可能導致死鎖:當進程發出I/O操作申請之后,如果進程掛起,并在I/O操作完成之前被換出物理內存,進程就會進入阻塞狀態以等待I/O操作完成,同時I/O操作也會進入阻塞狀態以等待進程換入物理內存。因此在讀寫操作的過程中,這塊區域所在的分頁應當始終處于物理內存中,進而這個I/O操作就會影響正常的虛擬內存管理。

為了避免這種情況的出現,可以引入I/O緩沖技術,以此來提高操作系統性能。為便于討論,可以將I/O設備分成兩類。一類是流傳輸設備,也稱為字符設備,在這類設備中,傳輸數據的最小單位是字節,并且只允許按順序訪問,一般不使用緩沖技術;另外一類是塊設備,其傳輸數據的基本單位是可尋址的塊,大多數塊設備允許隨機訪問,而且常常采用緩沖技術。

1.單緩沖

最簡單的I/O緩沖技術就是單緩沖(Single Buffering),如圖2-10(b)所示。當用戶進程發出一個I/O操作請求時,操作系統就會在操作系統內核所擁有的物理內存空間開辟一塊連續存儲區域用做緩沖內存。

圖2-10 I/O緩沖技術(I/O讀)

對塊設備而言,一個典型的I/O讀操作包含兩步:首先,將一個單位的信息塊讀入緩沖內存,然后,這個信息塊被轉移到用戶進程空間。這樣做比起無緩沖的情況主要有兩個優越性:第一,可以提高操作系統效率,信息塊讀取的分步進行可以帶來操作的并行化;第二,進程的虛擬內存管理不會再受其I/O操作的影響,避免了出現死鎖等麻煩。與此相適應,操作系統本身的設計需要增加新的內容。

假設讀入一個信息塊的時間是T,而相鄰兩次I/O讀申請的時間間隔是C。可以對無緩沖技術和單緩沖技術的性能做一個粗略比較:可以計算出在無緩沖時,每個信息塊所耗費時間是T+C,而在單緩沖情況下,所耗費的時間則是max(C,T)+M,其中M是將緩沖內存的信息塊轉移到用戶進程空間所耗費的時間,通常,這個時間很少。不難看出,在單緩沖情況下,系統性能會有很大提高。

2.雙緩沖

對單緩沖的一個改進就是將緩沖內存塊增加一個,從而變成兩個交替讀入信息塊,如圖2-10(c)所示。這樣當用戶進程正從某一個緩沖內存塊轉移數據時,操作系統就可以同時從I/O設備將新的信息塊讀入另一個緩沖內存塊了。

對于塊設備而言,在雙緩沖情況下,同樣可以大致估算出讀入每個信息塊所耗費的時間是max(C,T)。如果C<T的話,則雙緩沖技術可以提高塊設備的利用率,即單位時間內其傳入的信息量將會增加;如果C>T的話,則雙緩沖技術可以在某種程度上減少用戶進程等待新數據塊讀入的次數。

3.循環緩沖

雙緩沖在某種程度上使得信息在I/O設備間的流動更加順暢,但是如果進程在短時間內需要不斷讀取信息的話,雙緩沖技術也就不夠用了,需要引入循環緩沖技術。

在循環緩沖技術中,操作系統的內存空間開辟有若干個緩沖數據塊,這些數據塊最終首尾相接形成了一個循環鏈表結構,如圖2-10(d)所示。在操作系統不斷地從I/O設備讀入信息的同時,用戶進程也在不斷地轉移已讀入的信息,如此循環往復。只要緩沖數據塊的大小和個數選擇恰當,不僅能夠保證最終進程等待的時間降至最低,而且還能保證數據讀入的先后順序的正確性,而后者在字符設備緩沖中很重要。

上述3種緩沖技術都可以用于流設備的情況。這個時候,流設備讀入信息可以以字節為單位,也可以以某個特定長度的信息塊為單位,比如說以屏幕一行的信息量為一次性讀寫量對信息進行讀寫操作。

2.6.5 磁盤調度

在過去的30多年里,處理器和內存的速度增長遠遠超過了磁盤訪問速度的增長,現在處理器的速度已經達到了GHz,而磁盤訪問速度至少要比它低兩個數量級,而且這種趨勢似乎要保持很久。計算機操作系統、應用程序和各類數據大多是保存在磁盤中的,而且虛擬內存管理中的進程的分頁往往是在內存和磁盤之間倒來倒去的。磁盤管理的性能往往是計算機系統性能的瓶頸,磁盤管理的性能受磁盤性能參數和磁盤調度算法的影響,同時也受文件系統的影響。先來看磁盤參數和磁盤調度算法。

1.磁盤性能參數

磁盤I/O操作的具體細節取決于計算機系統、操作系統、I/O控制模塊的特征,以及磁盤控制電路等因素。圖2-11給出了磁盤I/O的一般傳輸時序。

圖2-11 磁盤I/O傳輸時序

當磁盤驅動器工作時,磁盤以一個恒定的速度在高速旋轉著。現在普通的PC硬盤的磁盤旋轉速度可以達到7200RPM,隨著磁盤技術的發展,這個速度會更高。當需要訪問磁盤的某個區域時,磁頭會首先移動到相應盤面的相應磁道,然后等待磁盤旋轉直到所需要的扇區到達磁頭為止,這個時候就開始進行數據傳輸了。磁頭從開始位置移動到相應磁道所耗費的時間通常被稱為尋道時間(Seek Time),而后等待磁盤旋轉到所需扇區所耗費的時間被稱為旋轉延遲時間(Rotational Time),或者也稱為潛伏時間(Latency Time),尋道時間和旋轉延遲時間的總和通常被稱為訪問時間(Access Time),數據傳輸所耗費的時間被稱為傳輸時間(Transfer Time)。

其中,尋道時間Ts的計算方法如下。

Ts=m×n+s

其中,m為跨越每個磁道的平均時間,n為需要跨越的磁道的數量,s為啟動時間。并且,旋轉延遲時間與轉速有關。比如對于一個轉速為7200RPM的硬盤,盤面旋轉一周的時間大約為8.3ms,那么平均而言,旋轉延遲時間就是4.2ms。

傳輸時間T的計算方法如下。

其中,b為要傳送的字節數,r為磁盤轉速,N為每磁道字節數除了訪問時間和傳輸時間外,還有若干個和磁盤I/O操作相關的時間參數。當進程提出I/O申請后,它通常是要進入一個等待進程隊列以等待設備空閑,而如果設備與其他磁盤驅動器共享I/O通道的話,這個時候,仍然需要一個等待通道空閑所耗費的時間。

從上面給出的磁盤性能參數及其計算方法可知,如果要想提高一個特定磁盤的傳輸速率,我們只可能在訪問時間上下功夫。一個理想的情況就是,需要訪問的數據正好在磁頭下方,如此,旋轉延遲時間為零,并且所有數據都按照訪問順序放在同一磁道,且正好在磁頭所在的磁道,這樣的話,就可以取得最高的傳輸速率。如果希望磁盤能夠提供較高的傳輸速率,則需要磁頭的位置距離下一個待訪問數據盡可能近,這其中不僅包括磁道距離,而且也包括扇區距離。磁頭的這個距離帶有隨意性,因此,磁頭總是要做頻繁移動,從而使得訪問時間大大增加。

2.磁盤調度算法

在多道程序設計計算機系統中,每一個I/O設備通常會有多個I/O申請形成隊列。在這種情況下,如何選擇下一個要處理的I/O申請對磁盤傳輸速度有很大影響,而每一種選擇策略就是一個磁道調度算法。

如果選擇是隨意的,那么每次訪問的磁道的分布也具有隨機性,從而導致磁頭尋道時間大大增加,導致磁盤傳輸性能大大降低。一個很公平的選擇方法就是先入先出規則(FIFO),即最先提出的I/O申請最早得到處理。這種選擇策略在只有少數幾個I/O申請并且所有申請訪問的扇區屬于扎堆的情況下,能取得比較好的性能,但是如果I/O申請很多,并且訪問的磁盤區域比較隨機的話,那就需要尋找更好的選擇策略。下面介紹7種這樣的選擇策略。

(1)遵從I/O申請進程優先級原則(PRI)

對于一個基于優先級的操作系統而言,磁盤調度將受制于系統的進程調度規則,這也是從系統整體性能來考慮的。

(2)遵從進程的后進先出原則(LIFO)

有的時候,最先處理最新到達的任務往往會取得一些令人意想不到的結果。比如說在事務處理系統中,將設備提交給最新用戶往往能減少磁頭的移動量。FIFO、PRI及LIFO調度原則都是僅僅從I/O請求的申請者的角度提出來的,如果我們知道任何時刻磁頭的位置的話,那么我們就可以從訪問目標的角度出發來設計一些算法。下面將給予闡述。

(3)遵從最短服務時間最先處理原則(SSTF)

SSTF調度原則在選擇下一個待處理的I/O請求的時候,會首先選擇一個起始訪問位置與磁頭所在位置相距最近的I/O申請,這樣可以保證每次磁頭總能花費最少的尋道時間。當然,每次保證最少的尋道時間并不能保證最終平均尋道時間最短,但是這種調度方法卻能提供比FIFO更好的性能。

(4)反復單向掃描(SCAN)

一般對于某個I/O設備而言,會不斷有新的I/O申請加入其等待服務隊列。在這種情況下,上面幾種磁盤調度算法都可能導致某個I/O申請始終被晾在一邊不被搭理,只有當隊列只剩下自己時,這樣的申請才會被處理。

SCAN調度算法能避免這一點,其基本算法流程是:磁頭在啟動后一直按照某一個固定的方向(按照磁道號排序升或者降)移動,而在申請等待隊列中的一些訪問目標位置正好位于這個方向上的申請則被依次處理,直到磁頭到達終點(磁道號最大或者最少),又開始反向移動。在移動過程中,按照正向移動的方法對申請等待隊列中的I/O申請進行處理,并在到達原來起點之后再重復開始的過程,如此周而復始地按順序掃描磁盤表面,并對符合條件的I/O申請進行處理。

(5)單向掃描原則(C-SCAN)

C-SCAN調度算法只允許磁頭單向掃描盤面,當到達終點后,快速返回起點,然后繼續原來的掃描過程。在掃描過程中,同時檢查I/O申請等待隊列中的申請,只有發現其訪問位置處于磁頭位置的時候才加以處理。如此周而復始,完成磁盤調度任務。

(6)N步單向掃描原則(N-Step-SCAN)

SSTF、SCAN和C-SCAN調度算法都可能出現一個很讓人惱火的事情,即如果某個磁道一時間有很多I/O申請的話,就會導致磁頭移動到該磁道后長時間不能解脫,從而導致其他申請需要做長時間等待。

N-Step-SCAN調度算法的提出就是為了克服這一現象。這種算法的基本內核仍然是SCAN的,所不同的是,原來的I/O申請等待隊列被分成長度為N的一個個子隊列。SCAN可供選擇的I/O申請是這些子隊列中的某一個,一旦選中,就會不斷執行直到整個隊列處理完,然后轉向下一個子隊列繼續同樣的操作。在處理過程中,難免會有新的I/O申請加入,在這個時候,新的I/O申請不能加入到正在處理的子隊列中,即便它的長度可能已經小于N了,它只能要么加入到其他某個長度小于N的未處理子隊列中,要么形成一個新的子隊列。

(7)FSCAN

FSCAN調度算法的基本思想和N-Step-SCAN算法類似,所不同的是在該算法中,只有兩個I/O申請等待隊列。當某一個隊列開始處理時,另外一個隊列為空,所有新加入的I/O申請都會進入這后一個空隊列。而對前一個隊列的處理直到所有申請都處理完畢之后,才轉入第二個隊列的處理。此后,所有新加入的申請將會被壓入前一個隊列,如此循環。表2-5給出了幾種常用的磁盤調度算法比較。

表2-5 磁盤調度算法比較

主站蜘蛛池模板: 繁峙县| 微博| 富民县| 宜都市| 辽宁省| 峨眉山市| 淮滨县| 马尔康县| 金川县| 沛县| 平湖市| 松溪县| 东明县| 老河口市| 铁岭县| 阳泉市| 额济纳旗| 盐城市| 京山县| 霍邱县| 滨州市| 德清县| 门源| 恭城| 临高县| 绵阳市| 平远县| 宁海县| 阿克苏市| 加查县| 确山县| 南投县| 焦作市| 托克逊县| 泗水县| 钦州市| 通辽市| 营山县| 滦平县| 溆浦县| 潜江市|