標籤:磁碟
磁碟是一種重要的儲存空間,位於主存結構的下方,是永久儲存的介質。在電腦底層知識拾遺(一)理解虛擬記憶體機制 這篇中說了虛擬記憶體是面向磁碟的,理解磁碟的工作原理對理解電腦的很多概念有很大的協助。尤其是在資料庫和分布式儲存領域,要經常和磁碟打交道。
磁碟這塊主要有幾個部分的概念:
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磁碟陣列,或則軟體保證的多個磁碟的冗餘儲存,來應對整個磁碟崩潰的影響,並可以快速回複損壞磁碟的資料
電腦底層知識拾遺(三)理解磁碟的機制