【知識強化】第四章 文件管理 4.3 磁盤組織與管理

那由盤面、柱面、扇區又引出了磁盤的物理地址結構,那最後咱們會介紹磁盤的幾種分類。算法

在這個磁盤的中間會有一個馬達,而這個馬達轉動的時候就能夠帶動整個磁盤的轉動。緩存

那這是磁道和扇區相關的概念。網絡

那接下來咱們來看一下怎麼從磁盤當中讀取數據呢?數據結構

因此你們須要注意的是,若是要對一個扇區進行讀或者寫操做的話,那麼須要經過磁頭臂來帶動磁頭,讓磁頭放到那個扇區對應的磁道上。函數

因此這是磁盤的物理地址的結構——(柱面號,盤面號,扇區號)。性能

能夠經過這個磁臂來回地伸縮來帶動磁頭,從而就能夠定位到指定的磁道。學習

那這是按照磁頭是否能夠移動來進行劃分的兩種分類——活動頭磁盤和固定頭磁盤。優化

另外,若是從這些盤片究竟是否能夠更換又能夠把磁盤劃分爲可換盤磁盤還有固定盤磁盤。spa

理解磁道、扇區、柱面、盤面這些最基本的概念。那由盤面、柱面、扇區這些概念咱們能夠知道磁盤的物理地址結構能夠分爲這樣的三元組,能夠用(柱面號、盤面號、扇區號)來定位整個磁盤當中的某一個特定的扇區。那這個物理地址的結構也是很常考查的。而磁頭的移動須要耗費必定的時間。總之要讀取某一個扇區或者某一個磁道上的數據的時候,那咱們須要移動磁頭。那在這個小節的最後咱們介紹了磁盤的分類,那這個你們可以有個印象就能夠了。比較可能進行考查的是固定磁頭磁盤當中每個磁道都會對應一個磁頭,而移動頭磁盤當中每個盤面只會有一個磁頭。這一點有可能在選擇題當中進行考查。操作系統

在這個小節中咱們會學習一個很重要很高頻的考點——磁盤調度算法。

那磁盤調度算法的不一樣會影響尋找時間的長短,因此選擇一個合適的磁盤調度算法對於磁盤的總體性能來講是會有很大影響的。

磁頭是由磁頭臂帶動的,因此在移動磁頭以前是須要先啓動磁頭臂,這個須要花費必定的時間。

那這是讀寫操做要進行的第一個步驟,就是尋道,尋找對應的磁道。

第二個讀寫操做須要花費的時間,叫延遲時間。

那麼轉動磁盤所消耗的這個時間就是我們這兒所謂的延遲時間。那從這個地方咱們能夠看到,磁盤的轉速越高,那它的延遲時間會越小,也就是說磁盤的讀寫速度越快。

那這是讀寫操做過程當中須要花費的第二個部分的時間——延遲時間。

第三個部分的時間叫傳輸時間。

傳輸時間指的哪部分。那經過尋道時間還有延遲時間這兩個部分以後,咱們的磁頭此時已經放在了想要讀取的那個扇區的開頭的位置。

那接下來要讀取這些扇區的數據,就須要繼續轉動磁盤。那轉動磁盤所須要的這些時間就是所謂的傳輸時間。

所以一次磁盤的讀或者寫操做,總共須要的時間就應該是尋道時間+延遲時間+傳輸時間。

那從延遲時間和傳輸時間的這個計算公式你們也能夠發現,轉速越快延遲時間越短,傳輸時間也越短。操做系統不可能用軟件的方式來加快這個磁盤的轉速,因此延遲時間和傳輸時間是操做系統沒法優化的兩個部分的時間。

那操做系統惟一能夠影響的時間就是尋道時間。根據不一樣的磁盤調度算法,這個尋道時間會有很大的差別。那咱們接下來會開始學習各類咱們須要掌握的磁盤調度算法。

因此先來先服務算法的優勢是很公平,先來的就先獲得服務。而且若是請求訪問的那些磁道是比較集中的話,那麼這個算法的性能還算能夠。不過這個算法的缺點也很明顯,若是有大量的進程竟爭地使用這個硬盤,而且請求訪問的這個磁道很分散的話,那麼先來先服務算法的性能就會不好,它在性能上實際上是近似於隨機調度算法。那相應的,若是要訪問那些磁道很分散的話,那麼先來先服務算法的尋道時間就會很長,平均尋找長度也會很長。

相比於以前的先來先服務算法來講,這個平均尋找長度、平均的尋道時間就會變得少了不少了。因此最短尋找時間優先算法的性能是比較好的,平均尋道時間也比較短。可是這種算法的缺點是有可能會產生「飢餓」現象。那這樣的話就致使了這邊的這些請求長期得不到服務的現象,也就是發生了「飢餓」。

只要在這個小區域內有源源不斷的請求到來,那麼它會一直在這個小區域內,而沒辦法跳出這個區域爲其餘區域的這些請求進行服務。

所以爲了解決這個問題人們又提出了掃描算法。可見,這種算法的平均尋找時間要比先來先服務算法要好不少,雖說這個平均尋找長度、平均尋道時間要比最短尋找時間優先算法要更次一些,可是這種算法的規則帶來的好處就是它不會產生「飢餓」現象。因此在剛纔我們分析的這個場景當中,對於90號磁道的訪問頻率要更低一些,而對於184號磁道的訪問頻率要更高一些。

那這是掃描算法能夠再改進的第二個地方。那咱們首先看一下第一個缺點應該怎麼改進。那在以前的掃描算法的當中,這個平均尋找長度是30多個,因此採用LOOK調度算法這種策略的話,那麼平均的尋找長度、平均尋道時間就進一步地獲得了縮短。

那接下來咱們再來看一下掃描算法的第二個缺點應該怎麼解決。因此C-SCAN算法或者說循環掃描算法它比起SCAN算法來講對各個位置的這種磁道的響應頻率就變得很平均了。不過和SCAN算法相似,這種算法有一個很明顯的缺點,

那爲了解決C-SCAN算法的這些缺點,人們又提出了C-LOOK算法。那C-LOOK算法和LOOK算法實際上是很相似的,也是採用了一樣的思想。因此比起C-SCAN算法來講,C-LOOK算法使尋道時間還有平均尋找長度進一步地縮短了。

尋道時間由啓動磁臂的時間和移動磁頭所花的時間組成。那咱們以後介紹的這些磁盤調度算法主要影響的是移動磁頭所花的時間。須要可以本身推出來那個延遲時間和傳輸時間的這個計算公式。最短尋找時間優先算法有可能致使飢餓,而且這種算法它只能保證眼前最優,但沒法保證整體最優。也就是說每一次的尋道確定是當前來看最短的,不過整體來看總的尋道時間、總的尋道長度未必是最短的。那以後咱們又介紹了SCAN算法,還有SCAN算法的改良性算法——LOOK調度算法和C-SCAN算法,還有C-SCAN算法的改良性算法C-LOOK算法。不過你們在作題的時候,若是題目當中沒有特別地說明,那麼題目中所指的SCAN算法其實就是LOOK算法,題目所指的C-SCAN算法其實就是C-LOOK算法,也就是說這個磁頭並不必定須要移動到最外側的那個磁道上,只要磁頭的移動方向上沒有別的請求了,那麼就可讓磁頭當即改變方向。

減小磁盤延遲時間的方法。

探討一個磁盤地址結構的問題。

啓動磁頭臂和移動磁頭實際上是一種物理上的移動,它須要花費的時間是比較高的。那這是盤面號在柱面號以前的這種狀況。

書裏推薦的這種物理地址結構,也就是柱面號放在盤面號以前會發生什麼狀況呢?

所以咱們接下來想要讀取這個範圍內的這些扇區的話,咱們只須要激活1號盤面對應的這個磁頭就能夠了,並不須要像以前所介紹的那樣再啓動磁頭臂而後來回地移動磁頭。

介紹第二種減小磁盤延遲時間的方法,叫作錯位命名。咱們先來分析一下不採用錯位命名方式在讀取這種編號連續的這些扇區的時候會發生什麼狀況。

那這個地方須要注意,全部的這些盤面都是一塊兒連軸轉的,都是同步旋轉的。那假設此時咱們要讀取的是物理地址爲0的扇區一直到物理地址爲8的扇區,也就是一直讀到這個扇區。

那這個讀取的過程應該是這樣的。首先要讀取的是0號盤面最內側這個磁道全部的這些扇區,因此首先須要把0號盤面的這個磁頭激活,而後讓磁盤進行旋轉,而且旋轉的過程當中進行讀寫。

那經過以前的分析咱們知道,它須要轉兩圈才能夠把最內側的這個磁道給讀完。那轉了兩圈以後,此時磁頭指向的是這個位置。那相應的一號盤面和0號盤面也是同步旋轉的,因此1號盤面應該也是指向了它本身的0號扇區所對應的這個位置。

可是以前我們說過,

這個磁盤繼續旋轉,在這個旋轉的過程中,

因爲磁頭尚未準備好讀寫數據,所以1號盤面的0號程序,也就是物理地址爲8的這個程序,從磁頭下面劃過的這個過程中,並不能直接把這塊的數據給讀入。若是要讀入這塊的數據,那隻能等到這個磁盤再轉一圈讓這個扇區再次劃過磁頭下方。也就是說,若是咱們把這些盤面它們相對位置相同的這些扇區都設置爲相同的編號,那麼可能會增長延遲時間。

因此爲了解決這個問題,能夠用錯位命名的方式來進行。0號盤面是在1號盤面的正上方,也就是說0號盤面的0號程序它的正下方對應的應該是1號盤面的7號程序。而0號盤面的4號程序它的正下方對應的應該是1號盤面的0號程序。也就是說這些扇區的編號它們是錯開的,因此這也是爲何叫錯位命名的緣由。

那讀取完這個區域的數據以後,這個磁頭它須要有必定的時間進行準備。那在這個準備的過程當中是不能讀入任何數據的。

 

那相比於以前的那種方案,這種方案很顯然能夠減小磁盤的延遲時間。那這個點實際上是看書的時候不太容易理解的一個點。

咱們須要理解爲何柱面號必定要在盤面號以前,其實本質緣由就是爲了減小移動磁頭的這個次數。

介紹磁盤管理相關的幾個很簡單的知識點。

什麼是磁盤初始化,磁盤初始化的過程當中須要作些什麼。介紹引導塊或者提及始塊的概念。最後會介紹對於磁盤壞塊的一個管理。

咱們的磁盤剛被製造出來的時候,實際上是隻被劃分紅了一個一個的磁道。

那在磁盤正式出廠以前,還須要進行一個叫作低級格式化或者叫物理格式化的過程。

這個過程就是一個劃分扇區的過程。那每一個扇區的數據區域所能存放的數據數量都是相同的,好比說能夠存放512個字節。因此我們以前所聊到的一個扇區能夠存放數據的大小其實指的是數據區域能夠存放的大小。我們在講文件的物理結構的時候講過一種鏈式結構,也就是把文件的那些數據塊用連接的方式把它鏈起來。那前一個數據塊指向下一個數據塊的指針其實就能夠保存在尾部這個部分,也就是說這個連接指針並不須要佔用數據區域,那這樣的話能夠方便操做系統管理。另外呢管理扇區所須要的那些數據結構通常也是放在頭和尾的位置,好比說像扇區校驗碼。那你們在計組當中應該也學過奇偶校驗還有循環冗餘校驗碼等等。這些校驗碼能夠用來檢查數據區域當中存放的這些數據是否發生了錯誤,那這樣的話能夠大幅度地提升磁盤存儲數據的一個可靠性。總之一個扇區由頭、數據區域、尾三個部分組成。那扇區的劃分實際上是在出廠以前,低級格式化也就是物理格式化的時候進行的。

那在咱們正式開始使用磁盤以前,還須要對磁盤進行邏輯上的分區。每一個分區呢由若干個相鄰的柱面組成。

這兒所謂的分區就是咱們平時熟悉的C盤、D盤、E盤。

包括要建立這些根目錄的目錄文件,而且要把那些用於存儲空間管理的數據結構也進行初始化,好比說像我們以前學過的位示圖、空閒分區表等等也是在邏輯格式化這個步驟當中給創建的。那這是磁盤初始化的時候所要作的幾個事情。

什麼是磁盤的引導塊?

在咱們的磁盤完成了物理格式化,還有磁盤分區和邏輯格式化以後,咱們就能夠把操做系統的那些相關數據把它寫到這個磁盤中了。也就是咱們所謂的本身安裝操做系統的一個過程。

那在計算機開機啓動的時候,實際上是須要進行一系列的初始化工做的。包括初始化CPU、初始化內存還有初始化像寄存器之類的一些硬件部件。可是這個初始化的過程須要執行所謂的初始化程序,也叫自舉程序。

那通常來講這個自舉程序是存放在ROM也就是隻讀存儲器當中的。而ROM中的數據是在出廠的時候就已經寫到了這個ROM當中,而且之後就不能再修改。

那通常來講ROM在出廠的時候就直接集成到了咱們的電腦主板上,也就是說計算機開機的時候,它首先會讀取ROM當中的這個這些程序而且執行這些程序來完成初始化的工做。

可是咱們來思考一下。可是因爲自舉程序自己又比較複雜,因此咱們不太可能保證自舉程序相關的數據永遠不改變。

那這個問題怎麼解決呢?那現代的操做系統通常是隻在ROM當中存放很小的一個自舉裝入程序,

而完整的自舉程序會存放在,好比說存放在C盤的這幾個盤塊上。那麼這些區域就能夠稱做啓動分區或者叫引導塊、啓動塊。啓動塊規定必須在磁盤的固定位置。

那當計算機開機的時候首先會執行ROM中的自舉裝入程序。在執行這個自舉裝入程序的過程中,CPU就能夠知道接下來須要執行的自舉程序是存放在硬盤當中的哪一個位置的。那經過自舉裝入程序的引導,CPU就能夠從磁盤中讀取完整的自舉程序。這樣的話就能夠完成初始化。那自舉裝入程序的複雜度不高,很小。因此實際上是能夠保證自舉裝入程序不出錯的,不須要更改的。而自舉程序須要更改的話,咱們就把自舉程序放在磁盤的固定位置。那這樣的話當自舉程序須要更新的時候,只須要從新把這些引導塊當中的數據把它重寫一下、更新一下就能夠了。因此這種方案帶來的好處就是自舉程序的更新會變得很方便。

那通常來講擁有這個啓動分區或者叫引導快、啓動塊的這個邏輯磁盤就被稱爲啓動磁盤或者叫系統磁盤。那像平時我們很熟悉的C盤就是系統磁盤。也就說其實C盤的某一個固定位置是裝了咱們的自舉程序的。那這是引導塊的做用。

操做系統是沒法經過軟件的方式把它進行修復的。

因此爲了防止咱們錯誤地使用這些壞塊,咱們就必須把這些壞塊給標記出來。那標記爲壞塊的這些塊以後再也不分配給任何一個文件就能夠了。那因爲操做系統在對存儲空間進行管理的時候確定是須要讀取文件分配表FAT的內容的。而哪些塊是壞塊是記錄在文件分配表FAT當中的。所以採用這種方式的話,壞塊對這個操做系統是不透明的。

磁盤控制器會負責維護一個叫作壞塊鏈表的一個鏈表,顧名思義就是把這些壞塊用某種方式把它們連接起來。那在磁盤出廠的時候其實就已經有可能有一些壞塊了,因此在出廠以前就會對這些壞塊進行一個檢查,

在低級格式化也就是物理格式化的時候就須要把這個壞塊鏈進行初始化。

另外,磁盤控制器還會保留一些好的「備用」扇區用來替換這些壞塊。可是這個過程對於操做系統是透明的,操做系統是不可知的。那這種方案也被稱爲扇區備用。那這是對磁盤的壞塊進行管理的兩種方法。

磁盤的初始化須要作一些什麼事情,分爲低級格式化(物理格式化)、磁盤分區還有邏輯格式化這樣三個步驟。你們須要理解而且記住各個步驟須要作的是一些什麼事情。引導塊主要是用於存放自舉程序的。在開機的時候必定須要運行自舉程序才能夠完成CPU、內存、寄存器的初始化的過程。最後咱們介紹了兩種壞塊的管理方式。你們只須要有個印象,能應付選擇題就能夠了。

這門課的最後一個章節——設備管理。

操做系統它做爲系統資源的管理者,既須要對上層的軟件進行管理,也須要對下層的硬件進行管理。操做系統它須要對處理機還有存儲器這些硬件進行管理,可是這些硬件實際上是在計算機的主機內部的。那這個章節咱們要探討的所謂的設備管理其實指的是操做系統對計算機主機外部的那些硬件設備的一個管理。

瞭解一下I/O設備的基本概念和分類。

人機交互類外部設備傳輸速度會比較慢,數據的傳輸都是以字節或者幾十字節爲單位的。貓還有路由器這些就屬於網絡通訊設備。網絡通訊設備的傳輸速度會比人機交互類外部設備更快一些,又會比存儲類的外部設備要更慢一些。

由於咱們每敲擊一次鍵盤其實只是往計算機當中輸入了一個字符,因此這種設備和計算機進行數據交換的速度是很慢的。高速設備,像平時我們使用的移動硬盤。那其實高中低速並無一個很明確的這種界限劃分,因此這個知識點你們也不須要特別地記憶,能有一個印象瞭解就能夠了,基本不可能做爲考點進行考查。

移動硬盤、磁盤等等這些就屬於塊設備。那像字符設備的話就是相似於鼠標鍵盤這種,數據的傳輸基本單位是字符或者字節。那中斷的概念我們在第一章也有比較詳細的介紹,在下個小節中咱們還會繼續介紹什麼叫中斷驅動方式。

那像前面的這兩種分類方式,其實並不會有很明確的那種劃分的界限,因此這兩種分類方式其實通常來講也不太可能進行考查。所以你們須要重點關注的是第三種分類方式,也就是按信息交換的單位分類,分爲塊設備和字符設備。你們須要注意它們之間的區別。那這兩類設備最本質的區別是,這種設備與計算機進行數據交換的時候,這種數據交換的基本單位,一個是塊,一個是字符。那除此以外,你們還須要結合上一章的內容理解塊設備是可尋址的,而字符設備是不可尋址的,這樣的兩個特性。那字符設備一般會採用中斷驅動的這種I/O控制方式,那這也是咱們下個小節會詳細介紹的內容。

學習I/O控制器相關的內容。那學習了這個小節的內容以後有助於咱們理解以後的小節會講解的I/O控制方式。

那在操做系統這門課當中重點須要掌握的是電子部件相關的一些知識。其實當咱們的這些I/O設備連上電腦以後,咱們的CPU是沒辦法直接控制這些I/O設備的機械部件的,它必須經過電子部件來間接地控制這些機械部件。

那咱們最熟悉、最簡單的命令固然就是讀或者寫的命令。那除了命令自己以外,CPU還會告訴I/O控制器執行這個命令相關的一些參數。好比說要讀多少個字節,要寫多少個字節。

所以I/O控制器當中須要設置一個叫作控制寄存器的東西,就是用來存放CPU發出的命令和參數的。那以後I/O控制器就能夠根據這個寄存器當中存放的這些數據來肯定本身要執行的究竟是什麼樣一個操做了。那除了接收和識別CPU發出的命令以外,I/O控制器還須要可以向CPU報告設備的狀態。好比說一個設備此時究竟是忙碌的仍是空閒的,仍是說這個設備此時處於故障的狀態。那CPU做爲系統資源的管理者,固然也須要知道各個設備的相應的狀態。

因此I/O控制器當中也會設置一個叫作狀態寄存器的東西。那CPU能夠讀取這個寄存器當中的內容來判斷一個I/O設備此時的狀態。固然若是還有其餘更復雜的狀態的話,那咱們能夠用更多的二進制位來表示。

由於I/O控制器它是CPU和I/O設備機械部件之間的中介。因此它做爲這個中介,固然也須要負責做爲這個數據交換的中間的一個使者。

這個I/O控制器當中會設置各類各樣的寄存器,而且每一種寄存器可能會有多個。那爲了識別這些寄存器,咱們也須要像給內存編址同樣給各個寄存器編上一個相應的地址。那CPU在往這些寄存器當中讀或者寫數據的時候,就是經過這些寄存器對應的地址來進行操做的。

瞭解了I/O控制器的功能,還有各個功能大體須要怎麼實現以後,咱們來看一下I/O控制器應該由哪些部分組成。I/O控制器它實際上是做爲CPU和I/O設備的機械部件之間的一箇中介的關係。而這個中介在鏈接CPU和I/O設備的時候,必然是須要作一些中間的處理的。那這些處理主要就是在I/O邏輯這個部分來完成的。

因此I/O邏輯,固然像我們剛纔提到的,地址識別或者說地址譯碼也是這個I/O邏輯須要進行的。那在接收和識別了CPU的命令以後,它還須要把它翻譯成具體的設備可以明白的一些命令,而後經過這個控制器與設備之間的接口發送給具體的設備,讓設備執行相應的操做。那這個地方你們會發現,一個I/O控制器它可能會有多個控制器與設備之間的接口,也就是說一個I/O控制器有可能會負責控制多個具體的I/O設備。那爲了區別CPU此時要操做的究竟是哪個設備,一樣須要給這些設備進行一個編號,或者說給各個設備接口一個地址,那CPU在發出I/O命令的時候也須要指明本身須要操縱的是哪一個設備。

CPU首先會經過一個叫作控制線的線路,向I/O控制器發出一個具體的I/O指令。同時CPU還會在地址線這樣的一個線路上說明本身要操縱的是哪個設備。那若是說此時是要輸出一個數據的話,那CPU會經過數據總線把本身要輸出的數據放到I/O控制器的數據寄存器當中。那以後I/O邏輯就能夠從數據寄存器當中取得CPU想要輸出的數據。那相似的,CPU此時發出的這個I/O指令可能會有一些相應的參數,那這些參數它會放到控制寄存器當中。那I/O邏輯就能夠從控制寄存器當中讀出相應的參數了。另外,爲了實現對各個設備的管理,CPU還會從這個狀態寄存器當中讀出各個設備的一個狀態,好比說忙碌、空閒仍是故障等等。那I/O邏輯會往狀態寄存器當中寫入相應的數據來告訴CPU各個設備的狀態究竟是什麼樣的。

 那這就是CPU與控制器的接口所須要負責完成的一些事情。這個接口主要就是用於完成CPU和控制器之間的通訊。

那相似的,控制器與設備的接口其實就是用於完成控制器和設備之間的一個通訊。那好比說此時是要輸出一個數據的話,首先就是由CPU經過數據總線把數據寫入到數據寄存器當中,而後I/O邏輯取出數據寄存器當中的內容,而後經過控制器與設備的接口、數據通路把這些數據輸出到外部設備上。那相似的,若是要輸入一個數據的話,這些數據能夠經過控制器與設備的接口輸入,而後I/O邏輯會把這些數據放到數據寄存器當中。以後CPU又從數據寄存器當中取走數據,那這就完成了一個數據輸入的過程。

 那除了這樣一個傳送數據的通路以外,設備還須要及時地向I/O控制器反饋本身的狀態。好比說這個設備究竟是忙碌仍是空閒,那一樣的設備經過這個接口向I/O控制器報告此時本身的狀態,而後I/O控制器的I/O邏輯又會把這個設備的狀態寫入到它對應的狀態寄存器當中。

那最後這個接口中還會有一個用於實現設備控制的一個電路,那I/O邏輯會根據CPU發出的命令還有相應的參數而後對對應的設備發出一些控制命令,讓這些設備執行具體的工做。那這就是I/O控制器的一個組成,分爲這樣的三個部分。

這個地方有兩個小細節比較值得注意。第二,因爲這個控制器會對應多個設備,而各個設備須要輸入輸出的數據還有各個設備的狀態這些確定是不一樣的,因此若是這些設備同時工做的話,那麼顯然只設置一個數據寄存器、狀態寄存器確定是不能知足需求的。因此既然I/O控制器中會有多個寄存器,那爲了識別各個寄存器,也須要給這些寄存器進行編址。

咱們來看一下內存映像I/O和寄存器獨立編址的區別。不過在有的系統當中也有多是各個設備控制器當中的寄存器用連續編號的方式。固然咱們並不須要糾結這些細節,咱們只須要知道若是採用的是寄存器獨立編址這種方案的話,那麼這些寄存器和內存的地址空間並非統一的,它們是兩個獨立的體系。

那採用這種方式有一個很明顯的缺點,就是要設置一些專門的指令來實現對這些寄存器的一個存取操做。那像這個例子當中,各個控制器的這些寄存器它們的地址也都是相互獨立的,那在這種狀況下,咱們不只要指明咱們要操做的寄存器的編號,同時還須要說明到底要操做的是哪個控制器,是控制0仍是控制器1。

而若是咱們採用的是內存映像I/O這種方式的話,那麼咱們就不須要設置專門的指令來支持對這些寄存器的操做。咱們只須要用對內存單元的操做、相同的那些指令來操做這些寄存器就能夠了。那這是這兩種方式的一個區別還有它們的有優缺點。

介紹了I/O控制器,也就是I/O設備的電子部件。那隨着計算機的發展,也出現不少種對I/O設備的控制方式,這是我們以後的那個小節會重點講解的內容。那這個小節的內容考的頻率並非很高,可是你們也須要能有一個大體的印象。須要重點注意的是,兩種寄存器編址方式的一個區別還有它們各自的優缺點,固然I/O控制器由3個部分組成,因此你們對於控制器的組成、主要功能這些也須要有個大致的印象。

學習本章的一個重要的考點——I/O控制方式。可是隨着計算機的發展,I/O控制器也是在不停地發展的。那相應的,I/O控制器對設備的控制方式也出現了不一樣的變化或者說進化。

須要注意這樣的幾個問題。第一,在各類I/O控制方式當中,完成一次讀寫操做的流程分別是怎麼樣的。第二,咱們須要注意的是CPU對這個I/O操做的一個干預的頻率。第三,咱們須要注意在不一樣的控制方式當中,進行一次I/O所要傳送的數據的單位究竟是多少。第四,咱們還須要注意數據的流向。第五,咱們須要注意的是各類控制方式的一個主要缺點和主要優勢。那什麼是干預頻率,什麼是傳送單位,什麼是數據流向,待會看具體的例子就能夠理解了。

首先要了解的是程序直接控制方式,這也是最先期的一種I/O控制方式。那若是要完成一個讀操做的話,CPU首先會經過控制線向I/O控制器發出一個讀指令,因而I/O控制器會根據CPU的要求啓動相應的設備,而且把這個設備對應的狀態設置爲未就緒或者說忙碌的一個狀態,那咱們假設狀態寄存器爲1表示的是設備忙碌。那接下來這個設備就會開始準備計算機想要讀入的數據,可是因爲設備的速度要比CPU的速度慢不少,因此在設備尚未完成I/O以前,CPU會一直不斷地輪詢檢查這個設備的狀態。

因此其實這個數據輸入的過程,原本應該是從設備輸入到內存的,可是這個過程當中必須先通過CPU的寄存器,而後再由寄存器轉存到內存當中。

 

因此其實若是採用程序直接控制方式的話,那麼咱們須要掌握的一個重點的核心詞叫作輪詢。採用這種方式完成一次讀寫操做的流程,就像這個圖表示的這樣。其實讀I/O模塊的狀態,是從I/O控制器的那個狀態寄存器當中讀出數據而後放到CPU的寄存器當中進行分析。由於I/O設備有可能會出現一些故障,那若是I/O設備出錯的話,也會在I/O控制器的狀態寄存器當中寫入相應的那些錯誤代碼。那CPU就能夠根據這些代碼來判斷此時這個I/O設備是否已經產生錯誤了,因此這兒有可能會產生一個錯誤條件。那麼咱們知道咱們定義的這些變量a,b,c,d其實它們是存放在存儲器也就是內存當中的。因此其實這些數據從鍵盤讀入以後,最終確定是要被放到存儲器也就是內存當中。所以,當CPU得到咱們從鍵盤輸入的數據以後,其實尚未結束,還須要把這些數據把它寫入到相應的存儲器的相應單元裏。那原理相同,當咱們使用printf這個輸出數據的函數的時候,其實咱們作的事情是要把內存當中存儲的這些變量的數據拿出來而後最後通過CPU再輸出到輸出設備上。

在使用程序直接控制方式這種方式的時候,CPU須要不斷地輪詢檢查這個I/O操做是否已經完成,因此CPU干預的頻率是很頻繁的。不只在I/O操做開始以前還有完成以後須要CPU的介入,在等待I/O完成的過程中,這個CPU也須要不斷地進行輪詢檢查。那這也是程序直接控制方式的一個最大的一個缺點。

每一次讀入或者寫出的數據,數據量是一個字。

因此每個字的讀和寫都須要CPU的介入幫助,也就是說CPU須要花費大量的時間來輔助完成這個I/O的過程。

優勢的話就是實現簡單,能夠用軟件的方式就能夠實現。那因爲它這個輪詢的過程其實就是在執行一系列循環檢查的指令,因此這種方式才叫程序直接控制方式。由於在CPU發出一個I/O指令以後,CPU並不能去作別的事情,它須要一直不斷地循環檢查這個I/O是否已經完成了。因此CPU會長期處於一個忙等的狀態,致使CPU的利用率低。那相應的,當CPU在進行別的一些計算工做的時候,I/O設備確定也是空閒的,因此I/O設備的利用率其實也是低的。

爲此人們提出了中斷驅動方式。與程序直接控制方式相比,中斷驅動方式主要是引入了中斷機構,可讓CPU在發出了I/O指令以後,轉頭能夠作別的事情,也就是能夠切換到別的進程。那因爲咱們的I/O設備是速度很慢的,而CPU又是一種速度很快的一個硬件機構。固然也能夠選擇不恢復被阻塞的進程,讓它繼續在就緒隊列裏等待,而後先執行別的進程。在中斷驅動方式當中,每次發生中斷只能讀入一個字的數據。因此若是要讀入大量的數據的話,那顯然會發生大量的中斷,那這樣的話就會致使系統的性能下降。

那因爲等待I/O完成的這個過程當中,CPU能夠切換到別的進程執行,因此在引入了中斷以後才實現了CPU和I/O設備並行工做的這樣的一個特色。

每發出一個讀或者寫指令,只會讀入或者寫出一個字大小的數據。

那中斷驅動方式的優勢呢其實就是解決了程序直接控制方式的最大的缺點。引入了中斷技術以後,可讓CPU和I/O設備並行地工做,而後CPU再也不須要不停地輪詢來檢查這個I/O是否完成,這樣的話CPU的利用率還有I/O設備的利用率也獲得了明顯的提高。那這種方式也存在一個很明顯的缺點,就是因爲它每次只能傳送一個字,因此當咱們須要傳送大量的數據的時候,那顯然會發生不少次的中斷,而每一次中斷的處理又須要付出必定的時間代價,因此若是中斷髮生的太頻繁,那麼這個中斷處理會消耗不少的CPU時間。另外呢,採用這種方式的時候,在讀入數據或者寫出數據的時候,都必須先通過CPU,可是經過以前的分析咱們也知道,其實讀入數據無非就是把I/O設備準備好的數據放到內存裏,而寫出數據無非就是把內存中的數據寫出到I/O設備,因此能不能把中間就是必須通過CPU的中轉這個步驟給砍掉呢?

那爲此,人們又提出了一種新的I/O控制方式——DMA方式。每次會讀入或者寫出一個塊。

另外呢,數據的流向再也不須要通過CPU,而是能夠在DMA控制器的控制下直接從設備放入到內存,或者直接從內存寫出到設備。

第三,CPU對於I/O操做的干預頻率又進一步地下降。僅僅在傳送一個或者多個數據塊的開始和結束的時候,才須要CPU進行干預。

DMA控制器其實也是一種I/O控制器,只不過它和我們上一小節介紹的I/O控制器有那麼一些小小的區別。

不過DMA控制器依然是由3個部分組成。第一個部分是主機或者說CPU和控制器的接口,第二個部分是I/O控制邏輯,第三個部分是塊設備和控制器的接口。那這和I/O控制器的3個部分都是一一對應的。那爲了實現控制器和CPU之間的通訊,它會在這個地方設置一系列的寄存器。而後CPU能夠經過系統總線來讀或者寫其中的某一些寄存器當中的內容,用這種方式達到控制I/O設備的一個目的。

DR至關於一箇中轉站,這個和我們以前介紹的數據寄存器沒有太大的區別。MAR它是用於存放內存地址的。那和以前我們介紹的I/O控制器同樣,這些寄存器也有可能會有多個,在這個地方並無列全。那這些寄存器是最主要的主機和控制器之間的接口。

而在控制器和塊設備之間也有一個相應的接口,經過這個接口能夠實現控制器對於這些塊設備的一個通訊、控制的一個過程。

那除此以外,系統總線還會把DMA控制器和內存鏈接在一塊兒。因此DMA控制器和內存之間能夠直接進行數據的讀寫,再也不須要通過CPU。好比說CPU能夠在剛開始指明此次要讀入的數據是存放在磁盤的什麼位置,那這些讀入的數據應該存放在內存的什麼位置,這些信息是存放在MAR裏的。而且還要說明這次要讀入的數據的數據量究竟是多少,那這些數據量又是存放在DC這個寄存器當中。

那接下來DMA控制器就會根據CPU提供的這一系列的參數從磁盤的相應位置讀入數據,而後寫到內存裏。而這個過程就再也不須要CPU的干預,只有DMA控制器完成了整個CPU指定的這一系列的任務以後,它纔會向CPU發出一箇中斷信號,而後CPU再介入進行後續的處理。那這個地方須要注意的是,DMA控制器並非每次直接讀入一整塊的數據,而後直接把一整塊放到內存當中。其實DMA控制器在讀入數據的過程中,也是一個字一個字讀入的。而後每次讀入了一個字都是先會存放在DR也就是數據寄存器當中,再從DR寫入到內存當中。用這樣一個字一個字的方式,最終就能夠完成一整塊的數據的讀入工做。

 

在採用這種方式以後,CPU的干預頻率就進一步地下降了。在開始以前CPU須要發出相應的I/O指令而且指明那些相應的參數。而後在結束以後CPU又須要處理中斷而後進行後續的一系列處理。

而數據的傳送單位也從一個字變成了一個塊。CPU每發出一個讀指令或者寫指令以後,DMA控制器就能夠完成對一個塊或者多個塊的讀和寫的操做。可是須要注意的是,這個地指的多個塊只能是讀寫那些連續的多個塊,而且這些塊在讀入內存以後也必須是連續存放的。也就是說,若是咱們是想要讀入多個離散的塊,或者這些讀入的塊須要離散地存放在內存的不一樣位置的話,那麼採用DMA方式一樣是須要CPU發出多條這個I/O指令。

那在採用了DMA方式以後,數據的流向就再也不須要通過CPU,還能夠直接從I/O設備讀入,而後在DMA控制器的控制下直接把數據放入到內存。在輸出的時候就恰好相反,一樣是不須要通過CPU的。

因此這種方式的優勢呢就是進一步提高了這個數據傳輸的效率。數據傳輸以「塊」爲單位,而後CPU介入的頻率能夠進一步地下降,這樣的話CPU就能夠有更多的時間去進行別的處理。另外,數據傳輸的過程也不須要再通過CPU,因此數據傳輸的效率也獲得了進一步的提高。那全部的這些其實帶來的結果都是,可讓CPU從這些繁雜的I/O工做當中抽離出來,讓CPU有更多的時間去處理別的那些計算任務。因此採用這種方式以後,I/O設備和CPU的並行性獲得了進一步的提高,資源利用率也獲得了進一步的提高。

若是咱們要讀取離散的數據塊,或者讀入的數據塊要離散地存放在不一樣的內存區域當中的時候,就須要發出多條I/O指令。所以這是DMA方式還須要繼續改進的一個特色。

那爲了解決這個問題,人們又提出了通道控制方式。通道能夠識別而且執行一系列的通道指令,就相似於我們CPU識別的那些指令同樣。那爲何叫「弱雞版的CPU」這個我們一下子再解釋。咱們首先來看一下通道的工做原理。CPU、內存、通道經過系統總線鏈接到一塊兒。首先CPU會向通道這個硬件發出I/O指令,而且指明這次要執行的通道程序或者說通道指令的序列它是存放在內存的什麼位置的。同時CPU還須要指明這次要執行操做的設備究竟是哪個。那在把這些信息告訴了通道以後,CPU就能夠切換到其餘進程執行了,能夠抽離出去開始幹別的事情。

那麼以後通道會根據CPU的指示去找到這次要執行的通道程序存放在內存當中的什麼位置。那這個通道程序其實你們能夠把它理解成是一種任務清單,其實這個任務清單就是一系列通道指令的集合。本質上它和咱們熟悉的,普通的那些程序其實都是同樣的。那在這個任務清單的通道指令當中,也會向通道指明這次要讀入和寫出的數據究竟是多少,讀寫的數據應該放在內存當中的什麼位置,它是放在外存中的什麼位置等等這一系列的信息。這些都是通道在執行這個程序的過程中就能夠知道的事情。因此若是採用這種方式的話,就至關於CPU只是告訴通道你如今去執行這樣的一個任務,那這個任務的清單我已經放在內存裏了。但具體這個任務須要作什麼,並非由CPU直接告訴通道的,而是由通道直接去讀取內存當中的這個程序,而後一步一步執行。

那當這個通道執行完了這一系列的任務以後它就會向CPU發出一箇中斷信號。CPU接收到中斷信號以後對中斷進行處理,而後再繼續執行接下來的那一系列的程序。因此這就是通道控制方式當中完成一次I/O所須要經歷的一系列步驟。

那爲何說通道是一種「弱雞版」的CPU呢?由於通道它能夠識別一系列的通道指令,可是它所能識別的這些指令與CPU能識別的那些指令相比,它的指令是很單一的,而且通道也並無本身的內存,它須要和CPU共享主機的內存。因此因爲通道這個硬件只能識別一些很簡單的、很單一的通道指令,所以咱們能夠把它理解爲是一個「弱雞版」的CPU。

而引入了通道以後,CPU的干預頻率就進一步地下降了。CPU能夠一次扔給通道一堆事情,那這些事情會寫在通道程序裏。因此通道能夠根據通道程序的指示,一步一步完成I/O操做。而後當它完成了一系列的數據塊的讀寫以後,才須要對CPU發出中斷信號。所以CPU的干預頻率是極低的。

那DMA控制方式當中每一次讀寫是讀寫一個數據塊或者多個連續的數據塊。可是在通道控制方式當中,每一次讀寫能夠完成對一組數據塊的讀寫操做。

那與DMA控制方式相似,採用了通道控制方式以後,能夠在通道的控制下,讓數據直接從I/O設備讀入內存,或者直接把內存中的數據輸出到I/O設備當中。

那通道方式的主要缺點呢就是

四種咱們須要掌握的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硬件來執行實際的I/O操做。那當I/O硬件作完此次I/O操做,發出I/O應答的時候,又會由這些層次從下往上依次進行處理,最後返回給用戶。那接下來咱們按從上至下的順序依次分析一下各個層次所須要實現的功能。

首先來看用戶層須要實現什麼功能。用戶層做爲最接近用戶的一個層次,那它確定是須要向用戶提供一些簡單易用的交互的接口。那通常來講,用戶層軟件會向用戶提供一些與I/O操做相關的庫函數,讓用戶調用這些庫函數來對設備進行操做。好比說我們很熟悉的C語言裏的Hello World,printf也就是在顯示屏這個I/O設備上打印輸出Hello World這樣一句簡單的代碼,其實這個printf庫函數就是由用戶層軟件提供的。那既然須要使用I/O設備進行輸出操做,因此用戶層軟件確定須要請求操做系統提供服務。由於只有操做系統纔有對硬件操做的權利。

 

所以用戶層軟件會使用設備獨立性軟件這一層向上提供的系統調用接口來請求操做系統內核的服務。

好比說printf("hello world!");這樣一句代碼,在用戶層軟件處理完了以後,會把它翻譯成等價的write系統調用,固然在進行調用的時候它也會填入相應的參數,好比說要打印輸出的內容——"hello,world!"這個字符串。因此其實設備獨立性軟件向上層提供了系統調用的接口。那設備獨立性軟件又是用來處理這個系統調用的一個層次,所以在有的題目當中它也會把這一層稱爲系統調用處理層,這一點你們稍微要注意一下。

可是因爲系統調用過低級了,還須要把它進行進一步的封裝才更方便用戶使用。因此Windows操做系統又會在用戶層進行進一步的封裝,而後向用戶提供一些庫函數接口。Windows API就是用戶層軟件向用戶提供的庫函數接口。那這是用戶層軟件須要作的事情。

設備獨立性軟件要實現一些什麼功能呢?

在不少操做系統當中,設備會被看做是一種特殊的文件。相應的,不一樣的用戶對設備這種特殊的文件的訪問權限確定也是不同的。所以,操做系統須要提供設備保護的功能。

那這個地方你們能有個印象就能夠了,不須要了解差錯處理的細節。由於差錯的類型實在是太多了,因此對差錯的處理基本上不太可能進行考查。

由於不少設備它實際上是一種臨界資源,不能夠同時分配給多個進程使用,因此操做系統固然須要對設備這種資源進行分配與回收的管理。那這個我們在以後也還會細聊。

關於緩衝區管理應該怎麼實現這個很容易在選擇題當中進行考查,不過這兒先不展開細聊,我們在以後的小節中還會專門講解。

所謂邏輯設備名就是用戶在請求使用一個設備的時候,所提供的名字。也就是用戶所看到的設備名。

那操做系統對這些設備進行管理,在背後還會有一個叫作物理設備名的東西。因此當咱們選擇某一個邏輯設備的時候,操做系統固然須要知道這個邏輯設備具體對應的究竟是哪個物理設備。

那通常來講這個映射關係,是經過一個叫作「邏輯設備表」的東西來實現的。英文縮寫是LUT。而且在這個邏輯設備表中,還會記錄每個邏輯設備對應的設備驅動程序的入口地址。

就像這個樣子。這兒的邏輯設備名居然還帶有一個相似於文件路徑的東西。不少操做系統都會把設備看成是一種特殊的文件,因此這個文件固然也會有個存儲的路徑。

那每個表項記錄了邏輯設備名到物理設備名的一個映射關係。而且還記錄了這個設備它所對應的驅動程序的入口地址是在什麼地方。

可是因爲各個用戶在使用設備的時候使用的都是邏輯設備名,而操做系統又是根據邏輯設備名來查找LUT的表項的。因此若是不一樣的用戶使用相同的邏輯設備名的話,那麼就有可能會致使這個邏輯設備到物理設備映射紊亂的問題,因此其實整個系統只設置一張邏輯設備表這種方式只適合於單用戶的操做系統。

那採用這種方式的話,不一樣用戶所使用的邏輯設備名能夠是重複的,而且相同的邏輯設備名能夠被映射到不一樣的物理設備上去。那其實這兩種方式有沒有發現,它就有點相似於咱們在文件管理當中學到的單級目錄和兩級目錄這樣的區別呢?在文件系統中,若是採用的是單級目錄結構的話,那麼不一樣用戶的文件名是不容許相同的。可是在兩級目錄的結構下,不一樣用戶的文件名能夠是相同的。那這裏爲每一個用戶設置了一張邏輯設備表,其實在本質上就有點相似於設置了兩級目錄這樣的結構。因此其實這兩種方案,和咱們以前學過的知識點是有一些內在聯繫的。

不一樣型號的這些設備,它們內部的那些電子部件,有多是徹底不同的。因此若是操做系統要經過這些設備的控制器來控制這些設備的運行的話,那麼操做系統確定是須要瞭解這些設備內部的硬件細節的。不過這些I/O設備多種多樣,因此操做系統不可能瞭解全部的這些設備的內部細節。所以這些設備在出廠的時候,通常來講廠家會提供一個與設備對應的所謂的驅動程序。而後當要控制某一個設備的時候,CPU其實只須要執行這個設備相對應的驅動程序就能夠完成對這個設備控制器的控制了。好比說想設置控制器裏面的寄存器,或者檢查每一個設備的狀態寄存器這些工做就是能夠經過執行驅動程序來完成。

那這個自動安裝的驅動程序其實就是由廠家提供的,爲了讓操做系統實現對這個新的設備硬件進行具體控制的一個程序。因此其實設備獨立性軟件不能夠直接操縱硬件,它必須調用廠家提供的設備驅動程序,由這個設備驅動程序來完成對硬件的具體控制。好比說設置設備裏的各類寄存器等等這些操做。

那像各個類型的設備驅動程序通常來講在系統中會以一個獨立進程的方式運行存在。因此咱們再回到剛纔的這個邏輯設備表,爲何不一樣的設備須要對應不一樣的驅動程序呢?就是由於各類設備內部的硬件特性是不同的,所以必須執行與它對應的特定的驅動程序才能夠正常地完成對這個設備硬件的控制。那這是設備驅動程序這一層須要完成的一個事情。

當咱們的硬件設備完成了I/O操做以後,它會發出一箇中斷信號做爲I/O應答。那系統會根據這個中斷信號的類型來找到與這個中斷信號對應的中斷處理程序,而後執行這個程序進行中斷處理。那中斷處理程序對中斷的處理流程是這樣子的:首先中斷處理程序會從I/O控制器或者說設備控制器當中讀出設備的狀態,來判斷此次的I/O是否是正常地結束。若是這次是正常地結束,那接下來中斷處理程序會從設備控制器的數據寄存器當中讀出一個字的數據,而且經由CPU而後放到內存緩存區當中,這就完成了一個字的讀入。而若是這次I/O是非正常結束的,也就是中間發生了什麼意外,好比說像硬件故障啊之類的。那系統會根據異常的緣由作出相應的處理。因此這就是中斷處理程序所須要作的一件事情。那當中斷處理程序把這一次要輸入的數據放入到內存以後,接下來又會交由設備驅動程序對這些數據進行進一步的處理。等設備驅動程序處理完了它又會交由再上一層的設備獨立性軟件進行再進一步的處理,最後一層一層往上,而後一直返回給用戶。因此若是要輸入一個數據的話,那麼對於這個數據的處理應該是從下往上依次層層處理的。

除了設備驅動程序會直接和硬件打交道以外,其實中斷處理程序它也須要直接和硬件打交道。可是再往上的設備獨立性軟件和用戶層軟件,就不會直接和硬件打交道了。

咱們對I/O軟件的層次結構進行了從上至下的分析,那要完成一個I/O操做,除了軟件的支持以外,確定也離不開硬件。硬件纔是執行具體的I/O操做的部件。它由機械部件和電子部件組成,那這是我們以前的小節談到的內容。那若是一個用戶發出I/O請求的話,這個I/O請求會由上至下依次由這些各個層次進行處理,最後扔給這個I/O硬件實行具體的I/O操做。而若是硬件完成了I/O操做的話,它又會發出一箇中斷信號,接下來會由這些軟件層次由下至上地層層處理,而後最後返回給用戶。那這個小節的內容最常考的實際上是各個層次之間的順序,好比說它常常會問一個I/O請求的處理次序究竟是怎麼樣的。或者一發生I/O應答的時候,每一層軟件的處理順序依次是怎麼樣的。因此你們須要理解而且記住這些各個層次的從上至下的這種順序。另外呢,也有可能考查各個層次要完成一些什麼功能。那你們須要抓住一個最重要的特色,設備驅動程序和中斷處理程序是直接和硬件打交道的。因此若是直接涉及到硬件細節相關的一些操做的話,那麼確定是由下面這兩層完成的。那除此以外的功能基本都是在設備獨立性軟件來完成的。

那除了這兒提到的內容以外,你們也須要對邏輯設備表LUT它的功能有一個大致的印象。

相關文章
相關標籤/搜索