關於硬碟的一些基礎認識

關於硬碟的一些基礎認識

來自專欄 Changelog

機械硬碟的認識

硬碟的組成

硬碟的物理結構

  • 磁頭
  1. 主要任務完成碟片上數據的讀寫操作,碟片在高速旋轉時,磁頭會飛行在盤面上方,而不是接觸盤面
  2. 每個碟片的兩面都會有一個磁頭, 當然有的硬碟有可能只有一個磁頭,磁頭的編號從0開始
  • 機械臂
  1. 使磁頭部件作徑向移動的裝置,已完成磁軌變換
  • 碟片
  1. 含有磁性的合金碟片,用來存取寫入的數據:每張碟片的容量成為單碟容量,而硬碟的容量就是所有碟片容量的總和;由於單碟容量的限制,通常一個硬碟會含有多張碟片
  2. 碟片的厚度在0.5mm左右,碟片的轉速與碟片大小有關
  3. 每個碟片都會有上下兩面,都可以被利用來存儲數據;能存儲數據的盤面成為有效盤面,每個盤面都會有一個盤面好,其和磁頭編號是相對應的,從0開始編號

碟片的邏輯劃分

  • 扇區
  1. 碟片在轉動時,磁頭在盤面上畫過的一段圓弧,稱扇區,即sector
  2. 扇區並不是連續的,在磁軌上被劃分成一段一段的,從1開始編號
  3. 是硬碟最小的物理存取單位,每個扇區為512byte
  • 磁軌
  1. 磁碟在格式化時被劃分成許多同心圓,這些同心圓叫做磁軌,即track
  2. 磁軌從外向內從0開始編號,盤面的容量越大,包含的磁軌數越多
  3. 磁軌是看不見的,只是盤面上一些被磁化的區域
  • 柱面
  1. 所有盤面上相同編號的磁軌構成的圓柱,稱為柱面,即cylinder
  2. 每個柱面上的磁頭由上到下從0開始編號
  3. 數據的讀寫是按照柱面進行的,而非按照盤面進行
  4. 柱面是分區的最小單位
  5. 柱面是所有碟片表面上到中心主軸的距離相等的磁軌集合

數據的讀寫按柱面進行,即磁頭讀寫數據時首先在同一柱面內從「0」磁頭開始進行操作,依次向下在同一柱面的不同盤面即磁頭上進行操作,只在同一柱面的所有磁頭全部讀寫完畢後磁頭才轉移到下一柱面。

因為選取磁頭只需要通過電子切換即可,而選取柱面則必須通過機械切換。電子切換相當快,比在機械上磁頭向鄰近磁軌移動快的多,所以,數據的讀寫按柱面進行,而不按盤面進行。

一個磁軌寫滿數據後,就在同一柱面的下一個盤面來寫,一個柱面寫滿後,才移到下一個扇區開始寫數據

硬碟容量

硬碟容量由以下技術因素決定:

  • 記錄密度:磁軌一英寸的段中可以放入的位數
  • 磁碟密度:從碟片中心出發半徑為一英寸的段內可以有的磁軌數
  • 面密度: 記錄密度與磁軌密度的乘積

磁碟操作

磁碟用連接到一個機械臂的讀寫頭來讀寫存儲在磁性表面的位

通過沿著半徑軸移動這個傳動比,驅動器可以將讀寫投定位在盤面上的任何磁軌上。這樣的機械運動成為尋道。

一旦讀寫頭定位到了期望的磁軌上,那麼當磁軌上的每個為通過它的下面時,讀寫頭可以感知到這個位的值(讀),也可以修改這個位的值(寫)。

有多個碟片的磁碟針對每個盤面都有一個獨立的讀寫頭,讀寫頭垂直排列,一致行動,在任何時刻,所有的讀寫頭都位於同一個柱面上

磁碟數據訪問時間

磁碟以扇區大小的塊來讀寫數據。對扇區的訪問時間有三個主要的部分:

  • 尋道時間:為了讀取某個目標扇區的內容,機械臂首先將讀寫頭定位到包含目標扇區的磁軌上。移動機械臂所需的時間稱為尋道時間。尋道時間Tseek依賴於讀寫頭以前的位置和機械臂在盤面上移動的速度。現代驅動器中平均尋道時間通常為3~9ms,一次尋道的最大時間可以高達20ms
  • 旋轉時間:一旦讀寫投定位到了期望的磁軌,驅動器等待目標扇區的第一個位旋轉到讀寫頭下,這個步驟的性能依賴於當讀寫頭到達目標扇區時的盤面位置以及磁碟的旋轉速度。在最壞的情況下,讀寫投剛剛錯過了目標扇區,必須等待磁碟轉一整圈

平均旋轉時間是最大旋轉延遲時間的一半

  • 傳送時間: 當目標扇區的第一個位位於讀寫頭下時,驅動器就可以開始讀或者寫該扇區的內容了。一個扇區的傳送時間依賴於旋轉時間和每條磁軌的扇區數目。

固態硬碟的認識

SSD是一種利用Flash晶元或者DRAM晶元作為數據永久存儲的硬碟。

利用DRAM作為永久存儲介質的SSD,又可稱為RAM-Dsk, 其內部使用SDRAM內存條來存儲數據,所以在外部電源斷開後,需要使用電池來維持DRAM中的數據

現在比較常見的SSD為基於Flash介質的SSD

所有類型的ROM和Flash晶元使用一種叫做「浮動門場效應晶體管」的晶體管來保存數據。每個這樣的晶體管叫做一個「cell」,即單元。

Cell

兩種類型

  • Single Level Cell(SLC) :每個Cell可以保存1B的數據
  • Multi Level Cell(MLC)每個Cell可以保存2B的數據

MLC容量是SLC的兩倍,但是成本與SLC大致相當。導致相同容量下的SSD,MLC晶元成本要比SLC晶元低

Cell是利用FG(Floating Gate)中的電勢值來與閾值對比從而判斷其表示1或者0的。

固態硬碟讀寫過程

從Flash晶元讀取數據的過程

  • 位線 將所有Cell串聯起來的導線稱為「位線」
  • 字線 將多個並聯的Cell串中相同位置的Cell水平貫穿起來的導線組稱為「字線」

當需要讀出某個Page時,Flash Controller控制Flash晶元將相應這個Page的字線組電勢置為0,其他所有字線組的電勢則升高到一個值,而這個值又不至於使電子穿過FG絕緣層到達FG

所有Cell串的位線被導通以便外接從位線上提取電勢狀態,而所有的字線電壓被提高的Page其感應線均被斷開導致感應線不能將對應的Cell的電勢傳遞到位線上

所以此時每個Cell串的位線所體現的電勢值與待讀出Page中所有Cell一一對應,再通過電路將每條位線上的電勢值解碼成1或者0從而傳輸到晶元外部,放置與SSD的RAM Buffer中保存,這樣完成了一個Page內容的讀出

SSD的IO最小單位為1個Page

向Flash晶元中寫入數據的過程

Flash晶元要求在修改一個Cell中的位的時候,在修改之前,必須先Erase掉這個Cell。

註:機械磁碟上的「數據」是永遠抹不掉的,因為即使將扇區全部寫入0也算是存放了數字0,也是數據。

Cell帶點表示0,不帶電錶示1,Cell只能帶負電荷,即電子,而不能帶正電荷

這裡的Erase動作其實就是將一大片連續的Cell一下子全部放電,這一片連續的Cell就是一個Block。即每次Erase只能一下檫除一整個Block或者多個Block,將其中所有的Cell變為1狀態

但是卻不能單獨檫除某個或者某段Page,或者單個或多個Cell(這個是造成SSD的致命缺點的一個根本原因)

Erase完成之後,Cell中全為1,此時可以向其中寫入數據,如果遇到待寫入某個Cell的數據位恰好為1的時候,對應這個Cell的電路不做任何動作,其結果依然是1;

如果遇到待寫入某個Cell的數據位為0的時候,則電路將對應Cell中的FG進行充電,Cell狀態從1變為0,完成了寫入

這個寫入0的動作又叫做「Program」,即對這個Cell進行看Program

Flash晶元的通病

  • Erase Before OverWrite

相比機械磁碟,磁碟可以直接用刺頭將對應的區域磁化成任何信號,如果之前保存的數據是1,新數據還是1,則磁頭對1磁化,結果還是1;如果新數據是0,則磁頭對1磁化,結果就變成了0

Flash則不然,如果要向某個Block寫入數據,則不管原來Block中是1還是0,新寫入的數據是1還是0,必須先Erase整個Block為全1,然後才能向Block中寫入新數據。

這種額外Erase操作增加了覆蓋寫的開銷

總的來說是這樣的一種情況:如果僅僅需要更改某個Block中的某個Page,那麼在Erase之前,需要將全部Block中的數據讀入SSD的RAM Buffer,然後Erase整個Block,再將待寫入的新Page中的數據在RAM中覆蓋到Block中對應的Page,然後將整個更新後的Block寫入Flash晶元

這樣加大了寫開銷,形成了大規模的寫懲罰(Write Amplification 寫擴大),小塊隨機寫IO會產生大倍數的寫懲罰

  • Wear Off

隨著FG充放電次數的增多,二氧化硅絕緣層的絕緣能力將遭到損耗,最後逐漸失去絕緣性,無法保證FG中有足夠的電荷。此時,這個Cell就被宣判為損壞,即Wear Off

損壞的Cell將拖累這個Cell所在的整個Page被標記為損壞,因為SSD定址和IO的最小單位為Page。損壞的Page對應的邏輯地址將被重定向映射到其他完好的預留Page,SSD將這些重定向表保存在ROM中,每次加電均被載入RAM以供隨時查詢

寫懲罰大大加速Wear off,因為寫懲罰做了很多無用功,增加了不必要的擦寫

MLC可擦寫的壽命比較低,小於10000次;SLC高一些,十倍於MLC,小於100000。

解決方法

  • 損耗平衡

為了避免同一個Cell被高頻率檫寫,SSD有這樣一個辦法:每次針對某個或者某段邏輯LBA地址(Logical Block Address)的寫都寫到SSD中的Free Space中,即上一次全盤Erase後從未被寫過的Block/Page中,這些Free Space已經被放電,直接寫入即可

若再次遇到針對這個或者這段LBA地址的寫操作,那麼SSD會再次將待寫入的數據重定向寫到Free Space中,而將之前這個邏輯地址佔用的Page標記為「Garbage」,可以回收再利用

等到Block中一定比例的Page都被標記為「Garbage」時,並且存在大批滿足條件的Block,SSD會批量回收這些Block

SSD這樣做就是為了將寫操作平衡到所有可能的Block中,降低單位時間內每個Block的擦寫次數,從而延長Cell的壽命

由於Page的邏輯地址對應的物理地址是不斷被重定向的,所以SSD內部需要微環境一個地址映射表。這種設計是比較複雜的,需要SSD上的CPU具有一定的能力運行對應的演算法程序。這種避免wear off 過快的重定向演算法稱為Wear Leveling,即損耗平衡演算法

  • Wiper

需要了解的是,影響一塊SSD壽命和寫入性能的最終決定因素就是Free Space,而且是存儲介質自身所看到的Free Space而不是文件系統級別的Free Space

但是SSD自身所認識的Free Space永遠只會少於文件系統的Free Space ,並且只會越來越趨於0

需要文件系統來通知SSD自身的Free Space,告訴它哪些邏輯地址現在並未被任何文件或者元數據所佔用,可以被擦除

所有的SSD廠商均會提供一個工具,稱為「Wiper」

操作系統中運行這個工具時,此工具掃描文件系統內不用的邏輯地址,並將這些地址通知給SSD,SSD便可以將對應的Block做擦除並回收到Free Space空間內

  • TRIM指令

TRIM指令可以讓文件系統在刪除某個文件之後實時地通知SSD回收對應的空間

TRIM是ATA指令標準中的一個功能指令,在Linux Kernel 2.6.28中已經囊括,但是並不完善

TRIM可以使SSD起死回生,開啟了TRIM支持的SSD,在操作系統TRIM的支持下,可以成功的將性能提高到相對於SSD初始化使用時候的95%以上

  • Delay Write 和 Combine Write

Delay Write 是一種存儲系統常用的寫IO優化措施。

比如有先後兩個針對同一個地址的IO—–Write1,Write2,先後被控制器收到了,而在Write1尚未被寫入到永久存儲介質之前,恰好Write2進入,此時控制器就可以直接在內存中將Write2覆蓋Write1,在寫入硬碟的時候只需要寫入一次即可

這樣的操作減少了不必要的寫

Combine Write是另一種存儲系統控制器常用的寫IO優化方法。

對於基於機械硬碟的存儲系統,如果控制器在一段時間內收到多個寫IO而這些寫IO的地址在邏輯上市連續的,則可以將這些小的IO合併為針對整體連續地址段的一個大的IO,一次性寫入對應的磁碟,節約了很多SCSI指令周期,提高了效率

由於SSD中的邏輯地址本來就是被雜亂地映射到可能不連續的物理地址上(這樣並不影響性能),所以,SSD控制器可以整合任何地址的小塊寫IO成一個大的寫IO而不必在乎小塊寫IO針對的邏輯地址是否連續

整合之後的大寫IO被直接寫向一個Free的Block中,這樣做大大提高了效率

預留備用空間

SSD為了防止文件系統將數據寫滿的極端情況,SSD自己預留一部分備用空間用於重定向寫

這部分空間並不通告給操作系統,只有SSD自己知道,文件系統永遠也寫不滿SSD的全部實際物理空間

參考:

《深入理解計算機系統》

《大話存儲》

推薦閱讀:

AMD StoreMI技術實測:雞肋?不不不,這絕對是性價比超高的速度與容量兼顧的硬碟解決方案!
硬碟邏輯鎖病毒源代碼分析&恢復方法-HeiBai.Org
火影地獄火X6遊戲本硬碟讀寫速度測試
電腦硬碟低級格式化教程

TAG:硬碟 | 機械硬碟 | 移動硬碟 |