OS- -I/O之盘和时钟
OS- -I/O之盤和時鐘
文章目錄
- OS- -I/O之盤和時鐘
- 一、盤
- 1.盤硬件
- 磁盤
- RAID
- 磁盤格式化
- 2.磁盤臂調度算法
- 3.錯誤處理
- 4.穩定存儲器
- 二、時鐘
- 1.時鐘硬件
- 2.時鐘軟件
- 3.軟定時器
一、盤
盤可以說是硬件里面比較簡單的構造了,同時也是最重要的。
下面我們從盤談起,聊聊它的物理構造
1.盤硬件
- 盤會有很多種類型。其中最簡單的構造就是磁盤(magnetic hard disks),也被稱為hard disk,HDD等。
- 磁盤通常與安裝在磁臂上的磁頭配對,磁頭可將數據讀取或者將數據寫入磁盤,因此磁 盤的讀寫速度都同樣快。
- 在磁盤中,數據是隨機訪問的,這也就說明可以通過任意的順序來存儲和檢 索單個數據塊,所以你可以在任意位置放置磁盤來讓磁頭讀取,磁盤是一種非易失性的設備,即使斷 電也能永久保留。
- 在計算機發展早期一般是用光盤來存儲數據的,然而隨著固態硬盤的流行,固態硬盤不包含運動部件的 特點,成為現在計算機的首選存儲方式。
磁盤
-
為了組織和檢索數據,會將磁盤組織成特定的結構,這些特定的結構就是磁道、扇區和柱面
-
每一個磁盤都是由無數個同心圓組成,這些同心圓就好像樹的年輪一樣
-
磁盤被組織成柱面形式,每個盤用軸相連,每一個柱面包含若干磁道,每個磁道由若干扇區組成。
-
軟盤 上大約每個磁道有8 - 32個扇區,硬盤上每條磁道上扇區的數量可達幾百個,磁頭大約是1 - 16個。
-
對于磁盤驅動程序來說,一個非常重要的特性就是控制器是否能夠同時控制兩個或者多個驅動器進行磁 道尋址,這就是重疊尋道(overlapped seek)
-
對于控制器來說,它能夠控制一個磁盤驅動程序完成 尋道操作,同時讓其他驅動程序等待尋道結束。控制器也可以在一個驅動程序上進行讀寫操作,與此 同時讓另外的驅動器進行尋道操作,但是軟盤控制器不能在兩個驅動器上進行讀寫操作。
RAID
- RAID稱為磁盤冗余陣列,簡稱磁盤陣列。利用虛擬化技術把多個硬盤結合在一起,成為一個或多個 磁盤陣列組,目的是提升性能或數據冗余。
- RAID有不同的級別
- ?RAID 0-無容錯的條帶化磁盤陣列
- ?RAID 1 -鏡像和雙工
- ?RAID 2 -內存式糾錯碼
- ?RAID 3 -比特交錯奇偶校驗
- ?RAID 4 -塊交錯奇偶校驗
- ?RAID 5 -塊交錯分布式奇偶校驗
- ?RAID 6 - P + Q冗余
磁盤格式化
- 磁盤由一堆鋁的、合金或玻璃的盤片組成,磁盤剛被創建出來后,沒有任何信息。磁盤在使用前必須經 過低級格式化(low-levvel format)
下面是一個扇區的格式:
- 前導碼相當于是標示扇區的開始位置,通常以位模式開始,前導碼還包括柱面號、扇區號等一些其他 信息。
- 緊隨前導碼后面的是數據區,數據部分的大小由低級格式化程序來確定。大部分磁盤使用512字 節的扇區。
- 數據區后面是ECC, ECC的全稱是error correction code ,數據糾錯碼,它與普通的錯 誤檢測不同,ECC還可以用于恢復讀錯誤。
- ECC階段的大小由不同的磁盤制造商實現。ECC大小的設 計標準取決于設計者愿意犧牲多少磁盤空間來提高可靠性,以及程序可以處理的ECC的復雜程度。通 常情況下ECC是16位
- 除此之外,硬盤一般具有一定數量的備用扇區,用于替換制造缺陷的扇區。
- 低級格式化后的每個。扇區的位置都和前一個磁道存在偏移,如下圖所示:
- 這種方式又被稱為 柱面斜進(cylinder skew),之所以采用這種方式是為了提高程序的運行性能。
- 可 以這樣想,磁盤在轉動的過程中會經由磁頭來讀取扇區信息,在讀取內側一圈扇區數據后,磁頭會進行 向外側磁道的尋址操作,尋址操作的同時磁盤在繼續轉動,如果不采用這種方式,可能剛好磁頭尋址到 外側。0號扇區已經轉過了磁頭,所以需要旋轉一圈才能等到它繼續讀取,通過柱面斜進的方式可以消 除這一問題。
- 柱面斜進量取決于驅動器的幾何規格。柱面斜進量就是兩個相鄰同心圓。號扇區的差異量。
如下圖所示:
- 這里需要注意一點,不只有柱面存在斜進,磁頭也會存在斜進(head skew),但是磁頭斜進比較小。
- 磁盤格式化會減少磁盤容量,減少的磁盤容量都會由前導碼、扇區間間隙和ECC的大小以及保留的備 用扇區數量。
- 在磁盤使用前,還需要經過最后一道工序,那就是對每個分區分別執行一次高級格式化(high-level format),這一操作要設置一個引導塊、空閑存儲管理(采用位圖或者是空閑列表)、根目錄和空文件 系統。
- 這一步操作會把碼放在分區表項中,告訴分區使用的是哪種文件系統,因為許多操作系統支持多 個兼容的文件系統。在這一步之后,系統就可以進行引導過程。
- 當電源通電后,BIOS首先運行,它會讀取主引導記錄并跳轉到主引導記錄中。然后引導程序會檢查以 了解哪個分區是處于活動的。
- 然后,它從該分區讀取啟動扇區(boot sector)并運行它。啟動扇區包 含一個小程序來加載一個更大一點的引導器來搜索文件系統以找到系統內核(system kernel),然后 程序被轉載進入內存并執行。
- 這里說下什么是引導扇區:引導扇區是磁盤或者存儲設備的保留扇區,其中包含用于完成計算機 或磁盤引導過程所必要的數據或者代碼。
- 引導扇區存儲引導記錄數據,這些數據用于在計算機啟動時提供指令。有兩種不同類型的引導扇 區
- ?Master boot record稱為主引導扇區
- ?Volume boot record 卷啟動記錄
- 對于分區磁盤,引導扇區由主引導記錄組成;
- 非分區磁盤由卷啟動記錄組成。
2.磁盤臂調度算法
-
下面我們來探討一下關于影響磁盤讀寫的算法,一般情況下,影響磁盤快讀寫的時間由下面幾個因素決 定
-
?尋道時間?尋道時間指的就是將磁盤臂移動到需要讀取磁盤塊上的時間
-
?旋轉延遲?等待合適的扇區旋轉到磁頭下所需的時間
-
?實際數據的讀取或者寫入時間
-
這三種時間參數也是磁盤尋道的過程。一般情況下,尋道時間對總時間的影響最大,所以,有效的降低 尋道時間能夠提高磁盤的讀取速度。
-
如果磁盤驅動程序每次接收一個請求并按照接收順序完成請求,這種處理方式也就是先來先服務 (First-Come, First-served, FCFS),這種方式很難優化尋道時間
-
因為每次都會按照順序處 理,不管順序如何,有可能這次讀完后需要等待一個磁盤旋轉一周才能繼續讀取,而其他柱面能夠馬上 進行讀取,這種情況下每次請求也會排隊。
-
通常情況下,磁盤在進行尋道時,其他進程會產生其他的磁盤請求。磁盤驅動程序會維護一張表,表中 會記錄著柱面號當作索引,每個柱面未完成的請求會形成鏈表,鏈表頭存放在表的相應表項中。
-
一種對先來先服務的算法改良的方案是使用最短路徑優先(SSF)算法,下面描述了這個算法。
-
假如我們在對磁道6號進行尋址時,同時發生了對11 ,2,4, 14, 8, 15,3的請求,如果采用先來先服 務的原則,如下圖所示
-
我們可以計算一下磁盤臂所跨越的磁盤數量為5 + 9 + 2 + 10 + 6 + 7 + 12 = 51,相當于是跨越了 51 次盤面,如果使用最短路徑優先,我們來計算一下跨越的盤面
-
跨越的磁盤數量為4+1+1+4 + 3 + 3+1=17,相比51足足省了兩倍的時間。
-
但是,最短路徑優先的算法也不是完美無缺的,這種算法照樣存在問題,那就是優先級問題,
-
這里有一個原型可以參考就是我們日常生活中的電梯,電梯使用一種電梯算法(elevator algorithm)來進行調度,從而滿足協調效率和公平性這兩個相互沖突的目標。電梯一般會保持向一個 方向移動,直到在那個方向上沒有請求為止,然后改變方向。
-
電梯算法需要維護一個二進制位,也就是當前的方向位:UP(向上)或者是DOWN(向下)。當一個請 求處理完成后,磁盤或電梯的驅動程序會檢查該位,如果此位是UP位,磁盤臂或者電梯倉移到下一個 更高跌未完成的請求。如果高位沒有未完成的請求,則取相反方向。當方向位是DOWN時,同時存在 一個低位的請求,磁盤臂會轉向該點。如果不存在的話,那么它只是停止并等待。
-
我們舉個例子來描述一下電梯算法,比如各個柱面得到服務的順序是4, 7, 10, 14, 9, 6, 3, 1 ,那 么它的流程圖如下
-
所以電梯算法需要跨越的盤面數量是3 + 3 + 4 + 5 + 3 + 3 + 1=22
-
電梯算法通常情況下不如SSF算法。
-
一些磁盤控制器為軟件提供了一種檢查磁頭下方當前扇區號的方法,使用這樣的控制器,能夠進行另一 種優化。如果對一個相同的柱面有兩個或者多個請求正等待處理,驅動程序可以發出請求讀寫下一次要 通過磁頭的扇區。
-
這里需要注意一點,當一個柱面有多條磁道時,相繼的請求可能針對不同的磁道,這種選擇沒有 代價,因為選擇磁頭不需要移動磁盤臂也沒有旋轉延遲。
-
對于磁盤來說,最影響性能的就是尋道時間和旋轉延遲,所以一次只讀取一個或兩個扇區的效率是非常 低的。
-
出于這個原因,許多磁盤控制器總是讀出多個扇區并進行高速緩存,即使只請求一個扇區時也是 這樣。一般情況下讀取一個扇區的同時會讀取該扇區所在的磁道或者是所有剩余的扇區被讀出,讀出扇 區的數量取決于控制器的高速緩存中有多少可用的空間。
-
磁盤控制器的高速緩存和操作系統的高速緩存有一些不同,磁盤控制器的高速緩存用于緩存沒有實際被 請求的塊,而操作系統維護的高速緩存由顯示地讀出的塊組成,并且操作系統會認為這些塊在近期仍然 會頻繁使用。
-
當同一個控制器上有多個驅動器時,操作系統應該為每個驅動器都單獨的維護一個未完成的請求表。一 旦有某個驅動器閑置時,就應該發出一個尋道請求來將磁盤臂移到下一個被請求的柱面。
-
如果下一個尋 道請求到來時恰好沒有磁盤臂處于正確的位置,那么驅動程序會在剛剛完成傳輸的驅動器上發出一個新 的尋道命令并等待,等待下一次中斷到來時檢查哪個驅動器處于閑置狀態。
3.錯誤處理
-
磁盤在制造的過程中可能會有瑕疵,如果瑕疵比較小,比如只有幾位,那么使用壞扇區并且每次只是讓ECC糾正錯誤是可行的,如果瑕疵較大,那么錯誤就不可能被掩蓋。
-
一般壞塊有兩種處理辦法,一種是在控制器中進行處理;一種是在操作系統層面進行處理。
-
這兩種方法經常替換使用,比如一個具有30個數據扇區和兩個備用扇區的磁盤,其中扇區4是有瑕疵 的。
-
控制器能做的事情就是將備用扇區之一重新映射
-
還有一種處理方式是將所有的扇區都向上移動一個扇區
-
上面這這兩種情況下控制器都必須知道哪個扇區,可以通過內部的表來跟蹤這一信息,或者通過重寫前 導碼來給出重新映射的扇區號。
-
如果是重寫前導碼,那么涉及移動的方式必須重寫后面所有的前導碼, 但是最終會提供良好的性能。
4.穩定存儲器
-
磁盤經常會出現錯誤,導致好的扇區會變成壞扇區,驅動程序也有可能掛掉
-
RAID可以對扇區出錯或 者是驅動器崩潰提出保護,然而RAID卻不能對壞數據中的寫錯誤提供保護,也不能對寫操作期間的崩 潰提供保護,這樣就會破壞原始數據。
-
我們期望磁盤能夠準確無誤的工作,但是事實情況是不可能的,但是我們能夠知道的是,一個磁盤子系 統具有如下特性:當一個寫命令發給它時,磁盤要么正確地寫數據,要么什么也不做,讓現有的數據完 整無誤的保留。這樣的系統稱為 穩定存儲器(stable storage)
-
穩定存儲器的目標就是不惜一切代 價保證磁盤的一致性。
-
穩定存儲器使用兩個一對相同的磁盤,對應的塊一同工作形成一個無差別的塊。穩定存儲器為了實現這 個目的,定義了下面三種操作:
-
? 穩定寫(stable write)
-
?穩定讀(stable read)
-
?崩潰恢復(bash recovery)
-
穩定寫指的就是首先將塊寫到比如驅動器1上,然后將其讀回來驗證寫入的是否正確,如果不正確,那 么就會再次嘗試寫入和讀取,一直到能夠驗證寫入正確為止。
-
如果塊都寫完了也沒有驗證正確,就會換 塊繼續寫入和讀取,直到正確為止。無論嘗試使用多少個備用塊,都是在對你驅動器1寫入成功之后, 才會對驅動器2進行寫入和讀取。這樣我們相當于是對兩個驅動器進行寫入。
-
穩定讀指的就是首先從驅動器1上進行讀取,如果讀取操作會產生錯誤的ECC,則再次嘗試讀取,如 果所有的讀取操作都會給出錯誤的ECC,那么會從驅動器2上進行讀取。這樣我們相當于是對兩個驅 動器進行讀取。
-
崩潰恢復指的是崩潰之后,恢復程序掃描兩個磁盤,比較對應的塊。如果一對塊都是好的并且是相同 的,就不會觸發任何機制;如果其中一個塊觸發了 ECC錯誤,這時候就需要使用好塊來覆蓋壞塊。
-
如果CPU沒有崩潰的話,那么這種方式是可行的,因為穩定寫總是對每個塊寫下兩個有效的副本,并 且假設自發的錯誤不會再相同的時刻發生在兩個對應的塊上。
-
如果在穩定寫期間出現CPU崩潰會怎么 樣?這就取決于崩潰發生的精確時間,有五種情況,下面來說一下
-
?第一種情況是崩潰發生在寫入之前,在恢復的時候就什么都不需要修改,舊的值也會繼續存在。
-
?第二種情況是CPU崩潰發生在寫入驅動器1的時候,崩潰導致塊內容被破壞,然而恢復程序能夠 檢測出這一種錯誤,并且從驅動器2恢復驅動器1上的塊。
-
第三種情況是崩潰發生在磁盤驅動器1之后但是還沒有寫驅動器2之前,這種情況下由于磁盤1 已經寫入成功
-
?第四種情況是崩潰發生在磁盤驅動1寫入后在磁盤驅動2寫入時,恢復期間會用好的塊替換壞的 塊,兩個塊的最終值都是最新的
-
最后一種情況就是崩潰發生在兩個磁盤驅動寫入后,這種情況下不會發生任何問題
-
這種模式下進行任何優化和改進都是可行的,但是代價高昂,一種改進是在穩定寫期間監控被寫入的 塊,這樣在崩潰后進行檢驗的塊只有一個。
-
有一種非易失性RAM能夠在崩潰之后保留數據,但是這 種方式并不推薦使用。
二、時鐘
- 時鐘(Clocks)也被稱為定時器(timers),時鐘/定時器對任何程序系統來說都是必不可少的。時鐘 負責維護時間、防止一個進程長期占用CPU時間等其他功能。
- 時鐘軟件(clock software)也是一 種設備驅動的方式。
1.時鐘硬件
-
在計算機中有兩種類型的時鐘,這些時鐘與現實生活中使用的時鐘完全不一樣。
-
?比較簡單的一種時鐘被連接到110V或220V的電源線上,這樣每個電壓周期會產生一個中斷, 大概是50 - 60 HZO這些時鐘過去一直占據支配地位。
-
?另外的一種時鐘由晶體振蕩器、計數器和寄存器組成,示意圖如下所示
-
這種時鐘稱為可編程時鐘,可編程時鐘有兩種模式,一種是一鍵式(one-shot mode)
-
當時鐘啟動 時,會把存儲器中的值復制到計數器中,然后,每次晶體的振蕩器的脈沖都會使計數器-1。當計數器變 為0時,會產生一個中斷,并停止工作,直到軟件再一次顯示啟動。
-
還有一種模式時方波(squarewave mode)模式,在這種模式下,當計數器變為0并產生中斷后,存儲寄存器的值會自動復制到計 數器中,這種周期性的中斷稱為一個時鐘周期。
2.時鐘軟件
- 時鐘硬件所做的工作只是根據已知的時間間隔產生中斷,而其他的工作都是由時鐘軟件來完成,一般 操作系統的不同,時鐘軟件的具體實現也不同,但是一般都會包括以下這幾點維護一天的時間
- ?阻止進程運行的時間超過其指定時間
- ?統計CPU的使用情況
- ?處理用戶進程的警告系統調用
- ?為系統各個部分提供看門狗定時器
- ?完成概要剖析,監視和信息收集
3.軟定時器
- 時鐘軟件也被稱為可編程時鐘,可以設置它以程序需要的任何速率引發中斷。時鐘軟件觸發的中斷是一 種硬中斷,但是某些應用程序對于硬中斷來說是不可接受的。
- 這時候就需要一種軟定時器(soft timer)避免了中斷,無論何時當內核因為某種原因呢在運行時, 它返回用戶態之前都會檢查時鐘來了解軟定時器是否到期。
- 如果軟定時器到期,則執行被調度的事件也 無需切換到內核態,因為本身已經處于內核態中。這種方式避免了頻繁的內核態和用戶態之前的切換, 提高了程序運行效率。
- 軟定時器因為不同的原因切換進入內核態的速率不同,原因主要有
- ?系統調用
- ?TLB未命中
- ?缺頁異常
- ?I/O中斷
- ?CPU變得空閑
總結
以上是生活随笔為你收集整理的OS- -I/O之盘和时钟的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OS- -I/O之I/O软件原理及层次结
- 下一篇: OS- -死锁(二)