1. 程式人生 > >[轉載]硬盤的存儲原理和內部架構

[轉載]硬盤的存儲原理和內部架構

基礎上 主從 按順序 之間 公式 擴展 cluster 過程 512字節

本來想寫個文件系統的專題,結果發現對硬盤的內部架構和存儲原理還是比較模糊,因為不了解“一點”硬盤的存儲原理對文件系統的認識老是感覺鏡花水月,不踏實。經過搜集整理資料就由了本文的問世。借用Bean_lee兄一句話:成果和榮耀歸於前輩。

首先,讓我們看一下硬盤的發展史:

  • 1956年9月13日,IBM的IBM 350 RAMAC(Random Access Method of Accounting and Control)是現代硬盤的雛形,整個硬盤需要50個直徑為24英寸表面塗有磁漿的盤片,它相當於兩個冰箱的體積,不過其存儲容量只有5MB。
  • 1971年,IBM開始采用一種名叫Merlin的技術生產硬盤,這種技術據稱能使硬盤頭更好地在盤片上索引。
  • 1973年,IBM 3340問世,主流采用采用紅色。這個大家夥每平方英寸存儲1.7MB的數據,在當時已經創了一個紀錄。許多公司共享這些系統,需要時按照時間和存儲空間租用它。租賃價值為7.81美元每兆,這個價格比當時汽油的價格還貴38%。它擁有“溫徹斯特”這個綽號,也就是我們現在所熟知的“溫氏架構”。來源於它兩個30MB的存儲單元,恰好是當時出名的“溫徹斯特來福槍”的口徑和填彈量。至此,硬盤的基本架構被確立。
  • 1979年,IBM發明了Thin Film磁頭,使硬盤的數據定位更加準確,因此使得硬盤的密度大幅提升。
  • 1980年,兩位前IBM員工創立的公司開發出5.25英寸規格的5MB硬盤,這是首款面向臺式機的產品,而該公司正是希捷公司(Seagate)公司。
  • 1982年,日立發布了全球首款容量超過1GB的硬盤。這就是容量為1.2GB的H-8598硬盤。這塊硬盤擁有10片14英寸盤片,兩個讀寫磁頭。
  • 1980年代末,IBM推出MR(Magneto Resistive磁阻)技術令磁頭靈敏度大大提升,使盤片的存儲密度較之前的20Mbpsi(bit/每平方英寸)提高了數十倍,該技術為硬盤容量的巨大提升奠定了基礎。1991年,IBM應用該技術推出了首款3.5英寸的1GB硬盤。
  • 1970年到1991年,硬盤碟片的存儲密度以每年25%~30%的速度增長;從1991年開始增長到60%~80%;至今,速度提升到100%甚至是200%。從1997年開始的驚人速度提升得益於IBM的GMR(Giant Magneto Resistive,巨磁阻)技術,它使磁頭靈敏度進一步提升,進而提高了存儲密度。
  • 1993年,康諾(Conner Peripherals)推出了CP30344硬盤容量是340MB。
  • 1995年,為了配合Intel的LX芯片組,昆騰與Intel攜手發布UDMA 33接口—EIDE標準將原來接口數據傳輸率從16.6MB/s提升到了33MB/s。同年,希捷開發出液態軸承(FDB,Fluid Dynamic Bearing)馬達。所謂的FDB就是指將陀螺儀上的技術引進到硬盤生產中,用厚度相當於頭發直徑十分之一的油膜取代金屬軸承,減輕了硬盤噪音與發熱量。
  • 1996年,希捷收購康諾(Conner Peripherals)
  • 1998年2月,UDMA 66規格面世。
  • 2000年10月,邁拓(Maxtor)收購昆騰。
  • 2003年1月,日立宣布完成20.5億美元的收購IBM硬盤事業部計劃,並成立日立環球存儲科技公司(Hitachi Global StorageTechnologies, Hitachi GST)。
  • 2005年日立環儲和希捷都宣布了將開始大量采用磁盤垂直寫入技術(perpendicular recording),該原理是將平行於盤片的磁場方向改變為垂直(90度),更充分地利用的存儲空間。
  • 2005年12月21日,希捷宣布收購邁拓(Maxtor)。
  • 2007年1月,日立環球存儲科技宣布將會發售全球首只1Terabyte的硬盤,比原先的預定時間遲了一年多。硬盤的售價為399美元,平均每美分可以購得27.5MB硬盤空間。
  • 2011年3月,西部數據以43億美元的價格,收購日立環球存儲科技。
  • 2011年4月,希捷宣布與三星強化策略夥伴關系。

從硬盤問世至今已經過了56個年頭,不管是容量、體積還是生產工藝都較之前有了重大革新和改進,但一直都保持了“溫氏”的架構(固態硬盤除外,它不是我們今天的主角)。經過封裝後的硬盤,對我們一般呈現出如下的樣子: 背面: 打開後蓋:

硬盤主要由盤體、控制電路板和接口部件組成。盤體就是一個密封,封裝了多個盤片的腔體;控制電路包含硬盤BIOS,主控芯片和硬盤緩存等單元;接口部件包含電源、數據接口主從跳線等。

硬盤的盤片一般采用合金材料,多數為鋁合金(IBM曾經開發過玻璃材質的盤片,好像現在有些廠家也生產玻璃材質的盤片,但不多見),盤面上塗著磁性材料,厚度一般在0.5mm左右。有些硬盤只裝一張盤片,有些則有多張。硬盤盤片安裝在主軸電機的轉軸上,在主軸電機的帶動下作高速旋轉。每張盤片的容量稱為單碟容量,而一塊硬盤的總容量就是所有盤片容量的總和。早期硬盤由於單碟容量低,所以盤片較多。現代的硬盤盤片一般只有少數幾片。 盤片上的記錄密度很大,而且盤片工作時會高速旋轉,為保證其工作的穩定,數據保存的長久,所以硬片都是密封在硬盤內部。不可自行拆卸硬盤,在普通環境下空氣中的灰塵、指紋、頭發絲等細小雜質都會對硬盤造成永久損害。一個被大卸八塊的硬盤如下:

接下來我們了解一下硬盤的盤面,柱面,磁道和扇區的概念。

盤面

硬盤一般會有一個或多個盤片,每個盤片可以有兩個面(Side),即第1個盤片的正面稱為0面,反面稱為1面;第2個盤片的正面稱為2面,反面稱為3面...依次類推。每個盤面對應一個磁頭(head)用於讀寫數據。第一個盤面的正面的磁頭稱為0磁頭,背面稱為1磁頭;第二個盤片正面的磁頭稱為2磁頭,背面稱為3磁頭,以此類推。盤面數和磁頭數是相等的。

一張單面的盤片需要一個磁頭,雙面的盤片則需要兩個磁頭。硬盤采用高精度、輕型磁頭驅動和定位系統。這種系統能使磁頭在盤面上快速移動,讀寫硬盤時,磁頭依靠磁盤的高速旋轉引起的空氣動力效應懸浮在盤面上,與盤面的距離不到1微米(約為頭發直徑的百分之一),可以在極短的時間內精確定位到計算機指令指定的磁道上。

早期由於定位系統限制,磁頭傳動臂只能在盤片的內外磁道之間移動。因此,不管開機還是關機,磁頭總在盤片上。所不同的是,關機時磁頭停留在盤片啟停區,開機時磁頭“飛行”在磁盤片上方。

磁道

每個盤片的每個盤面被劃分成多個狹窄的同心圓環,數據就是存儲在這樣的同心圓環上,我們將這樣的圓環稱為磁道(Track),每個盤面可以劃分多個磁道。關機時磁頭停留在硬盤的著陸區(Landing Zone),這個著陸區以前是位於離盤心最近的區域,不存放任何數據。在後期的硬盤工藝中有些硬盤生產廠商將這個區域被移動到了盤片的外面,如下所示:

在每個盤面的最外圈,離盤心最遠的地方是“0”磁道,向盤心方向依次增長為1磁道,2磁道,等等。硬盤數據的存放就是從最外圈開始。

扇區

根據硬盤規格的不同,磁道數可以從幾百到成千上萬不等。每個磁道上可以存儲數KB的數據,但計算機並不需要一次讀寫這麽多數據。在這一這基礎上,又把每個磁道劃分成若幹弧段,每段稱為一個扇區(Sector)。扇區是硬盤上存儲的物理單位,每個扇區可存儲128×2N次方(N=0,1,2,3)字節的數據。從DOS時代起,每扇區是128×22=512字節,現在已經成了業界不成文的規定,也沒有哪個硬盤廠商試圖去改變這種約定。也就是說即使計算機只需要硬盤上存儲的某個字節,也須一次把這個字節所在的扇區中的全部512字節讀入內存,再選擇所需的那個字節。扇區的編號是從1開始,而不是0,這一點需要註意。另外,硬盤在劃分扇區時,和軟盤是有一定區別的。軟盤的一個磁道中,扇區號一般依次編排,如1號,2號,3號...以此類推。但在硬盤磁道中,扇區號是按照某個間隔跳躍著編排。比如,2號扇區並不是1號扇區後的按順序的第一個而是第八個,3號扇區又是2號扇區後的按順序的第八個,依此類推,這個“八”稱為交叉因子。

這個交叉因子的來歷有必要詳述一下,我們知道,數據讀取經常需要按順序讀取一系列相鄰的扇區(邏輯數據相鄰)。如對磁道扇區按物理順序進行編號,很有可能出現當磁頭讀取完第一個扇區後,由於盤片轉速過快來不及讀取下一個扇區,(要知道物理相鄰扇區位置距離是極小的),必須等待轉完一圈,這極大浪費了時間。所以就用交叉來解決這個問題。增加了交叉因子後的扇區編號一般是下面這個樣子:

柱面

柱面其實是我們抽象出來的一個邏輯概念,前面說過,離盤心最遠的磁道為0磁道,依此往裏為1磁道,2磁道,3磁道....,不同面上相同磁道編號則組成了一個圓柱面,即所稱的柱面(Cylinder)。這裏要註意,硬盤數據的讀寫是按柱面進行,即磁頭讀寫數據時首先在同一柱面內從0磁頭開始進行操作,依次向下在同一柱面的不同盤面(即磁頭上)進行操作,只有在同一柱面所有的磁頭全部讀寫完畢後磁頭才轉移到下一柱面,因為選取磁頭只需通過電子切換即可,而選取柱面則必須通過機械切換。電子切換比從在機械上磁頭向鄰近磁道移動快得多。因此,數據的讀寫按柱面進行,而不按盤面進行。 讀寫數據都是按照這種方式進行,盡可能提高了硬盤讀寫效率。

物理相鄰的若幹個扇區稱為了一個簇。操作系統讀寫磁盤的基本單位是扇區,而文件系統的基本單位是簇(Cluster)。在Windows下,隨便找個幾字節的文件,在其上面點擊鼠標右鍵選擇屬性,看看實際大小與占用空間兩項內容,如大小:15 字節 (15 字節), 占用空間:4.00 KB (4,096 字節)。這裏的占用空間就是你機器分區的簇大小,因為再小的文件都會占用空間,邏輯基本單位是4K,所以都會占用4K。 簇一般有這幾類大小 4K,8K,16K,32K,64K等。簇越大存儲性能越好,但空間浪費嚴重。簇越小性能相對越低,但空間利用率高。NTFS格式的文件系統簇的大小為4K。

硬盤讀寫數據的過程

現代硬盤尋道都是采用CHS(Cylinder Head Sector)的方式,硬盤讀取數據時,讀寫磁頭沿徑向移動,移到要讀取的扇區所在磁道的上方,這段時間稱為尋道時間(seek time)。因讀寫磁頭的起始位置與目標位置之間的距離不同,尋道時間也不同。目前硬盤一般為2到30毫秒,平均約為9毫秒。磁頭到達指定磁道後,然後通過盤片的旋轉,使得要讀取的扇區轉到讀寫磁頭的下方,這段時間稱為旋轉延遲時間(rotational latencytime)。

一個7200(轉/每分鐘)的硬盤,每旋轉一周所需時間為60×1000÷7200=8.33毫秒,則平均旋轉延遲時間為8.33÷2=4.17毫秒(平均情況下,需要旋轉半圈)。平均尋道時間和平均選裝延遲稱為平均存取時間。

所以,最後看一下硬盤的容量計算公式:

硬盤容量=盤面數×柱面數×扇區數×512字節

MBR中,它是存在於硬盤的0柱面,0磁頭,1扇區裏,占512字節的空間。這512字節裏包含了主引導程序Bootloader和磁盤分區表DPT。其中Bootloader占446字節,分區表占64字節,一個分區要占用16字節,64字節的分區表只能被劃分4個分區,這也就是目前我們的硬盤最多只能支持4個分區記錄的原因。

即,如果你將硬盤分成4個主分區的話,必須確保所有的磁盤空間都被使用了(這不是廢話麽),一般情況下我們都是劃分一個主分區加一個擴展分區,然後在擴展分區裏再繼續劃分邏輯分區。當然,邏輯分區表也需要分區表,它是存在於擴展分區的第一個扇區裏,所以邏輯分區的個數最多也只能有512/16=32個,並不是想分多少個邏輯分區都可以。

註意,我們所說的擴展分區也是要占用分區表項的。例如,如果我們的硬盤只劃分一個主分區和一個邏輯分區,此時的分區表的排列如下:

Device Boot Start End Blocks Id System

/dev/sda1 * 1 19 152586 83 Linux

/dev/sda2 20 2569 20482875 83 Extended

/dev/sda5 2570 19457 4128705 82 Linux

主分區為1號分區,擴展分區占用了2號分區,3和4號擴展分區被預留了下來,邏輯分區從5開始編號依次遞增,這裏我們只劃分了一個邏輯分區。

[轉載]硬盤的存儲原理和內部架構