計算機底層知識拾遺(三)理解磁盤的機制

磁盤是一種重要的存儲器,位於主存結構的下方,是永久存儲的介質。在計算機底層知識拾遺(一)理解虛擬內存機制 這篇中說了虛擬內存是面向磁盤的,理解磁盤的工作原理對理解計算機的很多概念有很大的幫助。尤其是在數據庫和分佈式存儲領域,要經常和磁盤打交道。


磁盤這塊主要有幾個部分的概念:

1. 磁盤的基本結構和工作原理

2. 如何在虛擬內存機制下與內存高效地交換數據

3. 磁盤如何保證數據存儲的可靠性及故障恢復


磁盤的基本結構和工作原理


從單個磁盤來說,由一個個的同心圓組成,一個同心圓就是一個磁道,每個磁道由多個扇區組成,每個扇區之前由沒有磁性的間隙分隔。扇區有磁性物質,支持讀和寫操作

每個磁道的扇區數量是一個常量,每個扇區的大小一般是4KB。扇區是磁盤基本的物理單元

每一個盤面對應一個傳動臂,傳動臂的頭部有一個讀/寫頭可以讀和寫磁盤介質。 傳動臂可以覆蓋所有的磁道,通過旋轉盤面和移動傳動臂,就可以訪問到盤面所有扇區的數據。

一般的硬盤都有多個盤面構成,每個盤面都有上述的結構。一個硬盤上的多個傳動臂是固定在一起的,也就是同時移動的半徑都是一樣的。這樣同一時刻位於多個磁頭下的的各個磁道構成一個柱面,採用多個盤面的好處是可以同時讀取同一個柱面的數據。

我們知道存儲系統都採用邏輯單元塊來表示基本的數據單位,這樣可以提高存儲的效率,比如虛擬內存採用頁爲基本的存儲單位。同樣在磁盤領域,也用塊這個邏輯單元來管理磁盤。扇區是基本的物理單元,大小爲4KB。磁盤塊一般爲4KB - 64KB,包含一個或者多個扇區。主存和磁盤交換數據時以塊爲基本單位。


每一個磁盤都有一個磁盤控制器來管理一個或多個磁盤。磁盤處理器的作用有:

1. 控制傳動臂,將磁頭定位到一個特定的半徑位置

2. 選擇一個準備讀寫的盤面,定位到特定的扇區

3. 將從所要求的扇區讀取的二進制數據傳送到主存,或者將主存的數據寫回到磁盤的扇區


看一個實際的磁盤的參數,Megatron 747磁盤有下列參數:

1. 8個圓盤,16個盤面

2. 每個盤面有2^16次個磁道

3. 每個磁道平均有256個扇區

4. 每個扇區有4KB個字節


所以它是 16個盤面 * 2^16個磁道 * 256個扇區 * 4KB個字節 = 1TB的大小。一個磁道存放1MB字節。如果一個塊是16KB,那麼1個塊使用4個連續的扇區,一個磁道上有32個塊


磁道的讀寫有3個步驟,即 尋道時間 + 旋轉延遲 + 傳輸時間

1. 磁盤控制器將磁頭組合定位在磁盤塊所在磁道的柱面上所需要的尋道時間

2. 磁盤控制器等待訪問塊的第一個扇區轉到磁頭下,即旋轉延遲

3. 磁盤控制器讀寫數據時,數據所在的扇區和扇區間的空隙經過磁頭,即傳輸時間


尋道時間取決於磁頭到它訪問位置的距離,如果磁頭剛好在要訪問的柱面,那麼尋道時間爲0,但需要1ms的時間來啓動磁頭。磁頭需要10ms的時間來經過所有的磁道,所以尋道時間在 0 - 10ms,平均5ms

磁盤旋轉一圈的時間約爲10ms,因此旋轉延遲是0 - 10ms,平均爲5ms

傳輸時間相對很小,在毫秒一下。

所以讀取磁盤的1個字節的平均延遲是10ms,最大延遲差不多是它的兩倍。


可以很自然地想到提高磁盤讀寫速度方法就是儘量減小尋道時間和旋轉延遲,比如以下方式:

1. 按柱面組織數據,將要一起訪問的塊放在同一個柱面,這樣可以經常避免尋道時間,也可能避免旋轉延遲

2. 將數據分隔存儲在多個相對較小的磁盤而不是放在一個大磁盤,這樣可以讓更多的磁頭組設備分別區訪問磁盤塊,可增加單位時間內的磁盤塊訪問量

3. 鏡像磁盤,把兩個或者更多的數據副本放在不同的磁盤上,一方面保證了數據的冗餘存儲,另一方面也可以讓我們一次訪問多個磁盤塊

4. 把連續的快預加載到主存的緩衝區,這是空間局部性的使用,從緩存原理的角度來加速磁盤訪問


從虛擬內存的角度理解磁盤和主存的數據交換


首先理解一下CPU是如何來向磁盤IO請求數據的。我們知道計算機的各個組件通過總線連接,總線包括數據總線,地址總線,控制總線等。CPU採用內存映射IO的技術來訪問IO設備。虛擬地址空間有專門的地址,稱爲IO端口,來於IO設備通信,當一個設備連接到總線後,它被映射到一個或多個端口。

假設磁盤控制器被映射到0xa0端口,CPU發起IO讀的流程如下:

1. CPU把命令,邏輯塊號,目的虛擬內存地址寫到0xa0端口,發起一個磁盤讀請求

2. 磁盤控制器把邏輯塊號翻譯成對應的扇區位置讀取扇區,由DMA(直接內存訪問,Direct Memery Access)控制器執行磁盤數據到內存的傳輸,不需要CPU的參與

3. 當DMA傳輸結束後,磁盤控制器採用中斷的方式通知CPU讀取完畢


有幾個注意點:

1. CPU只發起讀請求和最後由中斷獲知讀操作結束,其他時間可以執行其他任務,提高了CPU的使用率

2. 內存一般都會有一個緩衝區來於磁盤交互,這實際也是緩存原理的使用,在內存中開闢了一個緩衝區,實際的內存讀寫與緩衝區交互,緩衝區和磁盤交互,這樣提高了內存讀寫的效率

3. 內存和磁盤的傳輸數據以塊爲最小單位,這個也是緩存原理的應用,一次傳輸一個或多個塊。

從虛擬內存的角度來說,虛擬頁和磁盤中的塊映射起來,當虛擬頁被加載到內存的物理頁的時候,就由DMA把虛擬內存對應的磁盤塊加載到內存的對應地址的物理頁中。當物理頁寫回到磁盤時,也是由DMA把數據傳輸到磁盤控制器,由磁盤控制器寫到磁盤塊對應的扇區。內存和磁盤交換數據的時候實際採用了內存的緩衝區來加速磁盤的訪問速度。

緩衝區的目的是適配兩個速度不一致的設備,從磁盤的工作原理我們看到磁盤操作是一個很慢的操作,內存操作相比磁盤操作是一個很快的操作,爲了讓內存對磁盤的讀寫不必等待磁盤操作返回再返回,操作系統設置了內存緩衝區來加速對磁盤的訪問速度。


內存緩衝區是緩存原理的使用,它是磁盤和內存之間傳輸數據的一個重要的組件。後面會單獨寫一篇文章介紹內存緩衝區的原理。這裏簡單說一下,內存緩衝區由緩存塊組成,緩存塊的大小和磁盤塊的大小是一樣的。每個緩存塊都有一個buffer_head數據結構,裏面存儲了這個緩存塊對應的磁盤的deviceId和磁盤塊,這樣相當於把一個緩存塊和一個物理的磁盤塊綁定了。磁盤和內存緩衝區之間交換數據以塊爲基本單位。


有了內存緩衝區,CPU要訪問某個磁盤文件的某些數據,只需要提供該數據所處的磁盤塊號,就可以從內存緩衝區尋找是否已經緩存了該磁盤塊的內容。


另外磁盤還專門設置了一塊交換區swap來存放從內存中交換出來的頁,swap是和操作系統的頁面回收子系統相關的,和內存緩衝區沒有直接關係,後面也會單獨寫一篇介紹磁盤上的交換區swap的機制。


磁盤如何保證數據的可靠性和故障恢復


磁盤保證數據存儲的可靠性主要就是靠冗餘。而冗餘又有很多策略,比如

1. 單塊磁盤的穩定存儲,把扇區按照兩兩結對,比如X和Y成對,每次寫的時候X和Y都要寫同樣的數據,這樣當其中之一出現故障,就可以用另外一塊來恢復。兩個扇區同時出現故障的情況很小

2. 多塊磁盤組成的磁盤陣列RAID,RAID0就是採用冗餘鏡像的方式

3. 軟件保證的冗餘,比如HDFS採用了3份冗餘存儲的策略


磁盤故障通常有幾種

1. 間歇性故障,讀或寫一個扇區的某次嘗試沒有成功,但是經過反覆嘗試又能成功地讀寫

2. 介質損壞,磁盤的一位或多個位永久地損壞了,導致讀不可能讀取某些扇區

3. 寫故障,嘗試寫一個扇區時,即不能正確地寫,也不能檢索先前寫入的扇區,可能是寫的時候供電中斷引起的

4. 磁盤崩潰,整個磁盤永久不可讀


對於間歇性故障,採用奇偶校驗的方式,可以快速地檢查出某次讀寫是否成功。磁盤控制器會通過奇偶校驗的方式來檢查讀寫是否正確,失敗的話會進行重試,如果超過嘗試次數,就返回讀寫失敗


對於磁盤中部分位的損壞,或者寫故障,可以採用上面說的單塊磁盤穩定存儲的方式,把扇區結對存儲,這樣可以降低介質損壞和寫故障的影響


對於整個磁盤的崩潰,可以採用硬件方式的RAID磁盤陣列,或則軟件保證的多個磁盤的冗餘存儲,來應對整個磁盤崩潰的影響,並可以快速回復損壞磁盤的數據


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章