文章來自https://mp.weixin.qq.com/s/sLncbjIe7XLrYbOfZlqLEw, 僅供學習參考。
硬碟這東西想必我們都相當的熟悉,它存放了我們很多學習資料,還經常因為訪問速度慢而被諸多文章拿出來“鞭撻”。
我找了個網站(文末貼連結),這個網站展示了從 1990 開始到 2020 不同介質資料訪問的延遲時間。
我翻了一遍介質自身速度的數量級沒有變化,記憶體訪問延遲從 207ns 到 100ns,硬碟從 19ms 到了 2ms,但是介質之間的訪問速度還是差了幾個數量級。
不過上述我圈出來的是隨機訪問,順序訪問的話不會差這麼多,想要知道為什麼,那就需要了解下硬碟的構造。
當然,我今天提到的硬碟指的是機械硬碟,固態硬碟本文暫不涉及。
之所以寫這篇文章是因為我之前一直對磁軌、柱面、扇區等一些東西存在疑惑,比如:
為什麼會搞出柱面這麼個概念?磁軌到底指的是哪裡?扇區是等分的?.....等等所以今兒咱們來理一理,按照我的習慣我們還是先簡單的看下歷史。
硬碟簡史1956 年 9 月 14 號,世界第一臺磁碟儲存裝置 IBM 305 RAMAC 誕生,這個裝置用碟片來儲存資料,用磁頭來讀寫資料,不過礙於當時的技術,這體積確實有點大,大約有兩個冰箱那麼大,來看下圖就知道了。
中間的歷史我看了看對我們沒啥用,咱們就快進到 1973 年,那年 IBM 推出了一個代號稱為 「溫切斯特」的硬碟。
這種硬碟的特點就是磁頭和磁片裝在一個密閉空間裡,當磁片高速自傳之後磁頭會因為空氣動力而懸浮起來,然後磁頭臂會操作磁頭沿著碟片劃圓弧狀移動。
咱們現在的機械硬碟就是這樣執行的,這麼多年過去了,還是典型的「溫切斯特」結構,也稱為溫盤。
至於為什麼取這個代號,是因為當時研究出來的那個硬碟擁有兩個 30MB 的儲存單元,而「溫切斯特來福槍」的口徑和裝藥也剛好都是 30 ,所以代號就為 「溫切斯特」。
歷史咱們就瞭解到這一步差不多了,接下來看看硬碟的內部結構。
硬碟的結構先來看看硬碟的真實樣子,我就標註了一些重點部位。
我先簡述一下硬碟是怎麼執行的。
通電之後主軸帶動碟片開始旋轉,到達一定轉速之後磁頭就會懸浮在碟片上方,然後磁頭臂就可以控制磁頭做圓弧形的移動,透過碟片的旋轉和磁頭的移動就可能訪問到碟片上任意地方的資料。
這裡可能有人就會有疑問,為什麼要讓磁頭浮起來?
首先磁頭和碟片觸碰的話就會有摩擦,摩擦久了之後肯定會有磨損,磨損了之後資料不就沒了?
其次有摩擦力之後轉速肯定就慢了,那磁碟的訪問速度也就慢了。
所以懸浮很關鍵,而磁頭懸浮的高度比頭髮絲還細,約 0.1微米,如果有灰塵進去可能會導致磁頭和碟片磨損,這也是硬碟需要密封的原因。
那剛啟動的時候磁頭不是和碟片接觸的嗎?
是的,你說的沒錯,所以人們就想了個法子,也就是磁頭停靠點,也就是上面圖中畫的地方。
當通電之後等達到一定轉速磁頭才會移動到碟片上,等斷電之後靠著電容剩餘的電量會把磁頭移到停靠處,這樣每次啟動就不會磨損啦!
還有一種停靠方式是在碟片內圈搞了個不存資料的地方,材質都不一樣,專門給磁頭停靠。
來看下這個影片
大致清晰硬碟是如何執行之後,我們再來深入一下。
這裡我本來想自己畫圖的,但是個人畫畫水平有限,人家畫的太好了...所以就搬來了,哈哈哈。
先來看下盤面。
A 就是磁軌,盤面就是由磁軌這樣的一組同心圓構成,注意是標紅部位,是個環,有橫截面的,有些參考書標記到線上去了....
B 是扇面,C 就是扇區,每個磁軌都會被劃分成一組扇區,每個扇區包含相等數量的資料位,一般為 512 位元組,是硬碟儲存資料最基本的單位。
D 是簇,即多個扇區組成的,像 DOS 就是以簇為單位為檔案分配磁碟空間的。
從圖中看,扇區好像是連續著的,其實不然,扇區之間其實有間隙,這些間隙是用來標識扇區的格式化位的,不會儲存資料。
不知看到這大家是否有點疑惑,每個扇區包含相等的資料位,那明顯距離圓心更近的同心圓扇區看起來能存的資料比最外圍的扇區小很多,那豈不是外圍的資料位要遷就最內部的?
是的。為了讓每個磁軌都有相等的扇區數,外圈磁軌的扇區之間間隔很大,不過以前硬碟的資料儲存密度很低,所以還能接受。
而隨著硬碟儲存密度的上升這樣就造成了極大的浪費,因此就搞了個 zoned-bit recording 技術,目的就是在外圈磁軌上放置比內圈磁軌更多的扇區,看下這個圖就明白了。
具體怎麼實現我就不展開了,這不重要。
重要的是解惑,並不是像有些書上說的,死板的按照最內圈的扇區數來確定所有磁軌的扇區數。
硬碟通常由一個或者多個碟片組成。
例如下圖就有三個碟片,每個碟片有上下兩個盤面,對應的會有六個磁頭。
磁頭號從上到下以 0 開始計數,由磁頭臂帶領著磁頭做圓弧形運動。每個盤面的磁軌也由 0 開始計數,相同編號的磁軌組成的區域稱之為柱面,發揮下想象力應該可以 get 到,我再貼個圖助力一下。
為什麼要有柱面這一術語呢?
因為幾個磁頭其實都是依靠同一個磁頭臂運動的,所以要轉就一起轉,並且都是一個角度。
因此想要資料讀取的快,那麼資料就應該在統一柱面上順序儲存。
比如最上面的盤面的第 1 個磁軌上寫不下了,那繼續寫到背部的第二個盤面上,這樣磁頭臂只要尋道一次即可,讀資料的時候也只要尋道一次即可。
從這裡我們也可以知道如果一個硬碟的碟片越多,速度就越快。
硬碟訪問的時間從上文我們已經知道硬碟是以扇區為基本單位的,所以硬碟的訪問就是要找到對應的扇區。
碟片的表面是磁性的,碟片隨著主軸旋轉而轉動,當要訪問某個扇區的時候首先要轉動磁頭臂找到對應的磁軌,這叫尋道時間。
這時碟片還是在旋轉中的,磁頭可以感知到下方資料位上的值,等旋轉到目標扇區的時候就曉得該讀/寫資料了,這個時間稱為旋轉時間。
所以我們買硬碟的時候會看到 7200RPM、15000RPM 啥的,轉的越快磁碟找到扇區的時間就越短。
最後就是讀取資料的傳送時間了。
所以硬碟資料訪問延遲就是這三個時間相加,而最慢的就是尋道時間,我給下 CSAPP 提供的資料:
總延時=尋道時間+旋轉時間+傳送時間=9ms+4ms+0.02ms=13.02ms
當然不同的硬碟總延時肯定不一樣,反正知道尋道時間最慢就行了。
邏輯磁碟塊從上述的物理結構我們已經知道需要找到盤面,再找到磁軌,最後找到扇區才能讀取資料,有點複雜。
沒必要把這麼不友好的訪問姿勢暴露給作業系統,所以就搞了個邏輯磁碟塊,遮蔽了底層訪問的細節,提供編號 0 、1、2.....n 這樣的邏輯塊序列來對應具體的物理塊。
這樣作業系統要訪問磁碟就很舒服了,不過最終還是要找到對應的扇區的,而磁碟控制器就維護了邏輯塊和實際物理扇區的對映關係。
磁碟控制器屬於硬盤裡面的一個硬體,它會將邏輯塊翻譯成:盤面、磁軌、扇區這麼一個三元組。
至此平時我們說的邏輯塊與硬碟的物理訪問也對應上了。
最後身為普通程式設計師我覺得對硬碟的瞭解到這個地步就差不多了,該知道的都知道了。
巨人的肩膀https://colin-scott.github.io/personal_website/research/interactive_latency.html(各介質延遲的網站)
https://en.wikipedia.org/wiki/Zone_bit_recording
https://en.wikipedia.org/wiki/Hard_disk_drive
https://zh.wikipedia.org/wiki/%E7%A1%AC%E7%9B%98
《深入理解計算機系統》