成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

五分鐘聊完磁盤

存儲 存儲軟件
盤可以說是硬件里面比較簡單的構造了,同時也是最重要的。下面我們從盤談起,聊聊它的物理構造

 盤

盤可以說是硬件里面比較簡單的構造了,同時也是最重要的。下面我們從盤談起,聊聊它的物理構造

盤硬件

盤會有很多種類型。其中最簡單的構造就是磁盤(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 位,除此之外,硬盤一般具有一定數量的備用扇區,用于替換制造缺陷的扇區。

低級格式化后的每個 0 扇區的位置都和前一個磁道存在偏移,如下圖所示

 

這種方式又被稱為 柱面斜進(cylinder skew),之所以采用這種方式是為了提高程序的運行性能。可以這樣想,磁盤在轉動的過程中會經由磁頭來讀取扇區信息,在讀取內側一圈扇區數據后,磁頭會進行向外側磁道的尋址操作,尋址操作的同時磁盤在繼續轉動,如果不采用這種方式,可能剛好磁頭尋址到外側,0 號扇區已經轉過了磁頭,所以需要旋轉一圈才能等到它繼續讀取,通過柱面斜進的方式可以消除這一問題。

柱面斜進量取決于驅動器的幾何規格。柱面斜進量就是兩個相鄰同心圓 0 號扇區的差異量。如下圖所示

 

這里需要注意一點,不只有柱面存在斜進,磁頭也會存在斜進(head skew),但是磁頭斜進比較小。

磁盤格式化會減少磁盤容量,減少的磁盤容量都會由前導碼、扇區間間隙和 ECC 的大小以及保留的備用扇區數量。

在磁盤使用前,還需要經過最后一道工序,那就是對每個分區分別執行一次高級格式化(high-level format),這一操作要設置一個引導塊、空閑存儲管理(采用位圖或者是空閑列表)、根目錄和空文件系統。這一步操作會把碼放在分區表項中,告訴分區使用的是哪種文件系統,因為許多操作系統支持多個兼容的文件系統。在這一步之后,系統就可以進行引導過程。

當電源通電后,BIOS 首先運行,它會讀取主引導記錄并跳轉到主引導記錄中。然后引導程序會檢查以了解哪個分區是處于活動的。然后,它從該分區讀取啟動扇區(boot sector)并運行它。啟動扇區包含一個小程序來加載一個更大一點的引導器來搜索文件系統以找到系統內核(system kernel),然后程序被轉載進入內存并執行。

“這里說下什么是引導扇區:引導扇區是磁盤或者存儲設備的保留扇區,其中包含用于完成計算機或磁盤引導過程所必要的數據或者代碼。引導扇區存儲引導記錄數據,這些數據用于在計算機啟動時提供指令。有兩種不同類型的引導扇區

Master boot record 稱為主引導扇區

Volume boot record 卷啟動記錄

對于分區磁盤,引導扇區由主引導記錄組成;非分區磁盤由卷啟動記錄組成。

磁盤臂調度算法

下面我們來探討一下關于影響磁盤讀寫的算法,一般情況下,影響磁盤快讀寫的時間由下面幾個因素決定

  • 尋道時間 - 尋道時間指的就是將磁盤臂移動到需要讀取磁盤塊上的時間
  • 旋轉延遲 - 等待合適的扇區旋轉到磁頭下所需的時間
  • 實際數據的讀取或者寫入時間

這三種時間參數也是磁盤尋道的過程。一般情況下,尋道時間對總時間的影響最大,所以,有效的降低尋道時間能夠提高磁盤的讀取速度。

如果磁盤驅動程序每次接收一個請求并按照接收順序完成請求,這種處理方式也就是 先來先服務(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 算法。

一些磁盤控制器為軟件提供了一種檢查磁頭下方當前扇區號的方法,使用這樣的控制器,能夠進行另一種優化。如果對一個相同的柱面有兩個或者多個請求正等待處理,驅動程序可以發出請求讀寫下一次要通過磁頭的扇區。

“這里需要注意一點,當一個柱面有多條磁道時,相繼的請求可能針對不同的磁道,這種選擇沒有代價,因為選擇磁頭不需要移動磁盤臂也沒有旋轉延遲。

對于磁盤來說,最影響性能的就是尋道時間和旋轉延遲,所以一次只讀取一個或兩個扇區的效率是非常低的。出于這個原因,許多磁盤控制器總是讀出多個扇區并進行高速緩存,即使只請求一個扇區時也是這樣。一般情況下讀取一個扇區的同時會讀取該扇區所在的磁道或者是所有剩余的扇區被讀出,讀出扇區的數量取決于控制器的高速緩存中有多少可用的空間。

磁盤控制器的高速緩存和操作系統的高速緩存有一些不同,磁盤控制器的高速緩存用于緩存沒有實際被請求的塊,而操作系統維護的高速緩存由顯示地讀出的塊組成,并且操作系統會認為這些塊在近期仍然會頻繁使用。

當同一個控制器上有多個驅動器時,操作系統應該為每個驅動器都單獨的維護一個未完成的請求表。一旦有某個驅動器閑置時,就應該發出一個尋道請求來將磁盤臂移到下一個被請求的柱面。如果下一個尋道請求到來時恰好沒有磁盤臂處于正確的位置,那么驅動程序會在剛剛完成傳輸的驅動器上發出一個新的尋道命令并等待,等待下一次中斷到來時檢查哪個驅動器處于閑置狀態。

錯誤處理

磁盤在制造的過程中可能會有瑕疵,如果瑕疵比較小,比如只有幾位,那么使用壞扇區并且每次只是讓 ECC 糾正錯誤是可行的,如果瑕疵較大,那么錯誤就不可能被掩蓋。

一般壞塊有兩種處理辦法,一種是在控制器中進行處理;一種是在操作系統層面進行處理。

這兩種方法經常替換使用,比如一個具有 30 個數據扇區和兩個備用扇區的磁盤,其中扇區 4 是有瑕疵的。

 

控制器能做的事情就是將備用扇區之一重新映射。

 

還有一種處理方式是將所有的扇區都向上移動一個扇區

 

上面這這兩種情況下控制器都必須知道哪個扇區,可以通過內部的表來跟蹤這一信息,或者通過重寫前導碼來給出重新映射的扇區號。如果是重寫前導碼,那么涉及移動的方式必須重寫后面所有的前導碼,但是最終會提供良好的性能。

穩定存儲器

磁盤經常會出現錯誤,導致好的扇區會變成壞扇區,驅動程序也有可能掛掉。RAID 可以對扇區出錯或者是驅動器崩潰提出保護,然而 RAID 卻不能對壞數據中的寫錯誤提供保護,也不能對寫操作期間的崩潰提供保護,這樣就會破壞原始數據。

我們期望磁盤能夠準確無誤的工作,但是事實情況是不可能的,但是我們能夠知道的是,一個磁盤子系統具有如下特性:當一個寫命令發給它時,磁盤要么正確地寫數據,要么什么也不做,讓現有的數據完整無誤的保留。這樣的系統稱為 穩定存儲器(stable storage)。穩定存儲器的目標就是不惜一切代價保證磁盤的一致性。

穩定存儲器使用兩個一對相同的磁盤,對應的塊一同工作形成一個無差別的塊。穩定存儲器為了實現這個目的,定義了下面三種操作:

  • 穩定寫(stable write)
  • 穩定讀(stable read)
  • 崩潰恢復(crash recovery)

穩定寫指的就是首先將塊寫到比如驅動器 1 上,然后將其讀回來驗證寫入的是否正確,如果不正確,那么就會再次嘗試寫入和讀取,一直到能夠驗證寫入正確為止。如果塊都寫完了也沒有驗證正確,就會換塊繼續寫入和讀取,直到正確為止。無論嘗試使用多少個備用塊,都是在對你驅動器 1 寫入成功之后,才會對驅動器 2 進行寫入和讀取。這樣我們相當于是對兩個驅動器進行寫入。

穩定讀指的就是首先從驅動器 1 上進行讀取,如果讀取操作會產生錯誤的 ECC,則再次嘗試讀取,如果所有的讀取操作都會給出錯誤的 ECC,那么會從驅動器 2 上進行讀取。這樣我們相當于是對兩個驅動器進行讀取。

崩潰恢復指的是崩潰之后,恢復程序掃描兩個磁盤,比較對應的塊。如果一對塊都是好的并且是相同的,就不會觸發任何機制;如果其中一個塊觸發了 ECC 錯誤,這時候就需要使用好塊來覆蓋壞塊。

如果 CPU 沒有崩潰的話,那么這種方式是可行的。如果在穩定寫期間出現 CPU 崩潰會怎么樣?這就取決于崩潰發生的精確時間,有五種情況,下面來說一下

  • 第一種情況是崩潰發生在寫入之前,在恢復的時候就什么都不需要修改,舊的值也會繼續存在。

 

  • 第二種情況是 CPU 崩潰發生在寫入驅動器 1 的時候,崩潰導致塊內容被破壞,然而恢復程序能夠檢測出這一種錯誤,并且從驅動器 2 恢復驅動器 1 上的塊。

 

  • 第三種情況是崩潰發生在磁盤驅動器 1 之后但是還沒有寫驅動器 2 之前,這種情況下由于磁盤 1 已經寫入成功

 

  • 第四種情況是崩潰發生在磁盤驅動 1 寫入后在磁盤驅動 2 寫入時,恢復期間會用好的塊替換壞的塊,兩個塊的最終值都是最新的

 

  • 最后一種情況就是崩潰發生在兩個磁盤驅動寫入后,這種情況下不會發生任何問題

 

這種模式下進行任何優化和改進都是可行的,但是代價高昂,一種改進是在穩定寫期間監控被寫入的塊,這樣在崩潰后進行檢驗的塊只有一個。

有一種 非易失性 RAM 能夠在崩潰之后保留數據,但是這種方式并不推薦使用。

 

責任編輯:武曉燕 來源: Java建設者
相關推薦

2023-08-07 06:35:07

系統限流

2009-11-20 18:08:37

Oracle數據庫

2024-07-12 14:21:32

Python編碼

2025-03-13 06:22:59

2024-12-11 07:00:00

面向對象代碼

2009-11-16 10:53:30

Oracle Hint

2021-09-07 09:40:20

Spark大數據引擎

2019-08-09 10:33:36

開發技能代碼

2021-06-07 09:51:22

原型模式序列化

2025-01-20 08:50:00

2024-09-18 08:21:24

JavaScriptTypeScriptprototype

2009-11-05 14:53:54

Visual Stud

2021-10-19 07:27:08

HTTP代理網絡

2009-10-22 16:18:19

Oracle表空間

2009-11-16 09:53:56

PHP上傳類

2025-01-21 07:39:04

Linux堆內存Golang

2009-11-17 14:50:50

Oracle調優

2023-09-07 23:52:50

Flink代碼

2022-12-16 09:55:50

網絡架構OSI

2021-12-01 06:50:50

Docker底層原理
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一区二区精品 | 四虎在线观看 | 日韩av免费在线观看 | 日韩精品av一区二区三区 | 欧美精品一区二区三区在线 | 操久久 | av在线成人 | 亚洲精品视频在线观看免费 | 亚洲精品www| 久久久久亚洲av毛片大全 | 中文字幕在线免费 | 国产免费一区二区 | 久久精品一级 | 欧美一区二区三区视频在线观看 | 欧美激情精品久久久久久 | 日本天堂视频在线观看 | 国产在线第一页 | 日日天天| 亚洲国产欧美一区二区三区久久 | 97精品视频在线 | 波多野结衣亚洲 | 亚洲精品电影网在线观看 | 天天操 天天操 | 亚洲成人激情在线观看 | 日韩a在线观看 | 欧美三级视频在线观看 | 在线欧美亚洲 | 亚洲精品一区二区三区蜜桃久 | 国产精品欧美一区二区三区 | 国产成人精品免费视频 | h在线看 | 91精品国产综合久久久久久漫画 | 久久九九网站 | 日本精品免费在线观看 | 人人草天天草 | 日本三级做a全过程在线观看 | 国产高清在线视频 | 亚洲精品9999 | 亚洲精品一区在线观看 | 黄色毛片视频 | 小h片免费观看久久久久 |