磁碟到底是怎樣工作的?一文理解硬碟結構

劉小緒同學發表於2020-12-22

資料庫系統總會涉及到輔助儲存(大多都是磁碟),因為它們能夠儲存大量需要長期儲存的資料,因此我們有必要先了解了解磁碟的相關知識。

根據機械原理,儲存器的容量越大其速度就越慢。但是速度越快的儲存器,其單位位元組的價格就越貴。現代計算機系統可以包含幾個不同的可以儲存資料的部件,就形成了儲存器的層次結構,但是需要注意的是「虛擬記憶體」是作業系統與作業系統運用機器硬體的產物,它不是儲存器的層次之一。

磁碟結構

傳統的硬碟盤結構是像下面這個樣子的,它有一個或多個碟片,用於儲存資料。碟片多采用鋁合金材料;中間有一個主軸,所有的碟片都繞著這個主軸轉動。一個組合臂上面有多個磁頭臂,每個磁頭臂上面都有一個磁頭,負責讀寫資料。

image.png

磁碟一般有一個或多個碟片。每個碟片可以有兩面,即第一個碟片的正面為0面,反面為 1 面;第二個碟片的正面為 2 面......依次類推。磁頭的編號也和盤面的編號是一樣的,因此有多少個盤面就有多少個磁頭。盤面正檢視如下圖,磁頭的傳動臂只能在碟片的內外磁軌之間移動。因此不管開機還是關機,磁頭總是在碟片上面。關機時,磁頭停在碟片上面,抖動容易劃傷盤面造成資料損失,為了避免這樣的情況,所以磁頭都是停留在起停區的,起停區是沒有資料的。

image.png

每個碟片的盤面被劃分成多個狹窄的同心圓環,資料就儲存在這樣的同心圓環上面,我們將這樣的圓環稱為 磁軌 (Track)。每個盤面可以劃分多個磁軌,最外圈的磁軌是0號磁軌,向圓心增長依次為1磁軌、2磁軌......磁碟的資料存放就是從最外圈開始的。

image.png

根據硬碟的規格不同,磁軌數可以從幾百到成千上萬不等。每個磁軌可以儲存數 Kb 的資料,但是計算機不必要每次都讀寫這麼多資料。因此,再把每個磁軌劃分為若干個弧段,每個弧段就是一個 扇區 (Sector)。扇區是硬碟上儲存的物理單位,現在每個扇區可儲存 512 位元組資料已經成了業界的約定。也就是說,即使計算機只需要某一個位元組的資料,但是也得把這個 512 個位元組的資料全部讀入記憶體,再選擇所需要的那個位元組。

image.png

柱面是我們抽象出來的一個邏輯概念,簡單來說就是處於同一個垂直區域的磁軌稱為柱面 ,即各盤面上面相同位置磁軌的集合。需要注意的是,磁碟讀寫資料是按柱面進行的,磁頭讀寫資料時首先在同一柱面內從 0 磁頭開始進行操作,依次向下在同一柱面的不同盤面(即磁頭上)進行操作,只有在同一柱面所有的磁頭全部讀寫完畢後磁頭才轉移到下一柱面。因為選取磁頭只需透過電子切換即可,而選取柱面則必須透過機械切換。資料的讀寫是按柱面進行的,而不是按盤面進行,所以把資料存到同一個柱面是很有價值的。

磁碟被 磁碟控制器所控制(可控制一個或多個),它是一個小處理器,可以完成一些特定的工作。比如將磁頭定位到一個特定的半徑位置;從磁頭所在的柱面選擇一個扇區;讀取資料等。

image.png

現代硬碟尋道都是採用CHS(Cylinder Head Sector)的方式,硬碟讀取資料時,讀寫磁頭沿徑向移動,移到要讀取的扇區所在磁軌的上方,這段時間稱為尋道時間(seek time)。因讀寫磁頭的起始位置與目標位置之間的距離不同,尋道時間也不同。磁頭到達指定磁軌後,然後透過碟片的旋轉,使得要讀取的扇區轉到讀寫磁頭的下方,這段時間稱為旋轉延遲時間(rotational latencytime)。然後再讀寫資料,讀寫資料也需要時間,這段時間稱為傳輸時間(transfer time)。

根據上文的資訊,我們可以得出磁碟容量的計算公式為:

    
    
    
    硬碟容量 = 盤面數 × 柱面數 × 扇區數 × 512位元組

    筆試題實戰

    下面的題目是騰訊某一年校招筆試中的一個題目,題幹資訊描述為:資料儲存在磁碟上的排列方式會影響I/O服務的效能,一個圓環磁軌上有10個物理塊,10個資料記錄R1~R10存放在這個磁軌上,記錄的安排順序如下表所示。

    物理塊 1 2 3 4 5 6 7 8 9 10
    邏輯記錄 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10

    假設磁碟的旋轉速度為20ms,磁碟當前處在R1的開頭處,若系統順序掃描後將資料放入單緩衝區內,處理資料的時間為4ms(然後再讀取下個記錄),則處理這10個記錄的最長時間是多少?

    答案:磁碟會一直朝某個方向旋轉,不會因為處理資料而停止。本題要求順序處理 R1 到 R10,起始位置在 R1,一週是 20ms,共 10 個記錄,所以每個記錄的讀取時間為 2ms。首先讀 R1 並處理 R1,讀 R1 花 2ms,讀好後磁碟處於 R1 的末尾或 R2 的開頭,此時處理 R1,需要 4ms,因為磁碟一直旋轉,所以 R1 處理好了後磁碟已經轉到 R4 的開始了,這時花的時間為 2+4=6ms。這時候要處理 R2,需要等待磁碟從 R5 一直轉到 R2 的開始才行,磁碟轉動不可反向,所以要經過 8*2ms 才能轉到 R1 的末尾,讀取 R2 需要 2ms,再處理 R2 需要 4ms,處理結束後磁碟已經轉到 R5 的開頭了,這時花的時間為 2*8+2+4=22ms。等待磁碟再轉到 R3 又要 8*2ms,加上 R3 自身 2ms 的讀取時間和 4ms 的處理時間,花的時間也為 22ms,此時磁碟已經轉到 R6 的開頭了,寫到這裡,就可以看到規律了,讀取並處理後序記錄都為 22ms,所以總時間為 6+22*9= 204ms

    如何加速對磁碟的訪問

    對於理解資料庫系統系統特別重要的是磁碟被劃分為磁碟塊(或像作業系統一樣稱之為頁),每個塊的大小是 4~64KB。磁碟訪問一個磁碟塊平均要用 10ms,但是這並不表示某一應用程式將資料請求傳送到磁碟控制器後,需要等 10ms 才能得到資料。如果只有一個磁碟,在最壞的情況下,磁碟訪問請求的到達個數超過 10ms 一次,那麼這些請求就會被無限的阻塞,排程延遲將會變的非常大。因此,我們有必要做一些事情來減少磁碟的平均訪問時間。

    按柱面組織資料:前這一點在前文已經提到過了。因為尋道時間佔平均塊訪問時間的一半,如果我們選擇在一個柱面上連續的讀取所有塊,那麼我們只需要考慮一次尋道時間,而忽略其它時間。這樣,從磁碟上讀寫資料的速度就接近於理論上的傳輸速率。

    使用多個磁碟:如果我們使用多個磁碟來替代一個磁碟,只要磁碟控制器、匯流排和記憶體能以 n 倍速率處理資料傳輸,則使用 n 個磁碟的效果近似於 1 個磁碟執行了 n 次操作。因此使用多個磁碟可以提高系統的效能。

    磁碟排程:提高磁碟系統吞吐率的另一個有效方法是讓磁碟控制器在若干個請求中選擇一個來首先執行,排程大量塊請求的一個簡單而有效的方法就是 電梯演算法。回憶一下電梯的執行方式,它並不是嚴格按先來後到的順序為乘客服務,而是從建築物的底層到頂層,然後再返回來。同樣,我們把磁碟看作是在做橫跨磁碟的掃描,從柱面最內圈到最外圈,然後再返回來,正如電梯做垂直運動一樣。

    預取資料:在一些應用中,我們是可以預測從磁碟請求塊的順序的。因此我們就可以在需要這些塊之前就將它們裝入主存。這樣做的好處是我們能較好的排程磁碟,比如採用前文的電梯演算法來減少訪問塊所需要的平均時間。

    磁碟故障

    如果事情都像我們一開始設計的那樣進行,那世界肯定會變得特別無聊。磁碟偶爾也會耍耍小脾氣,甚至是罷工不幹了。比如在讀寫某個扇區一次嘗試沒有成功,但是反覆嘗試後有成功讀寫了,我們稱之為 間歇性故障

    一種更為嚴重的故障形式是,一個或多個二進位制位永久的損壞了,所以不管我們嘗試多少次都不可能成功,這種故障稱之為 介質損壞

    另一種相關的錯誤型別稱之為 寫故障,當我們企圖寫一個扇區時,既不能正確的寫,也不能檢索先前寫入的扇區,發生這種情況的一種可能原因就是在寫過程中斷電了。

    當然肯定最嚴重的就是 磁碟崩潰,這種故障中,整個磁碟都變為永久不可讀,這是多麼可怕的事情。

    既然會出現上面所述的各種大小故障,那麼我們就必須要採取各種措施去應對大大小小的變故,保證系統能正常執行。

    規避故障

    我們嘗試讀一個磁碟塊,但是該磁碟塊的正確內容沒有被傳送到磁碟控制器中,就是一個間歇性故障發生了。那麼問題是控制器如何能判斷傳入的內容是否正確呢?答案就是使用 校驗和,即在每個扇區使用若干個附加位。在讀出時如果我們發現校驗和對資料位不合適,那麼我們就知道有錯誤;如果校驗和正確,磁碟讀取仍然有很小的可能是不正確的,但是我們可以透過增加趣多校驗位來降低讀取不正確發生的機率。

    此處我們使用奇偶校驗來舉例,透過設定一個校驗位使得二進位制集合中 1 的個數總是偶數。比如某個扇區的二進位制位序列是 01101000,那麼就有奇數個 1,所以奇偶位是 1,這個序列加上它後面的奇偶位,就有 011010001;而如果所給的序列是 11101110,那麼奇偶位就是 0。所以每一個加上了奇偶位構成的 9 位序列都有偶數奇偶性。

    儘管校驗和幾乎能正確檢測出介質故障或讀寫故障的存在,但是它卻不能幫助我們糾正錯誤。為了處理這個問題,我們可以在一個或多個磁碟中執行一個被稱為 穩定儲存的策略。通常的思想是,扇區時成對的,每一對代表一個扇區內容 X。我們把代表 X 的扇區對分別稱為左複製 X L和右複製X R。這樣實際上就是每個扇區的內容都儲存了兩份,操作X L失敗,那麼去操作X R就可以了,更何況我們還在每個扇區中有校驗和,把錯誤的機率就大大降低了。

    到現在為止,我們討論的都是簡單的故障,但是如果發生了磁碟崩潰,其中的資料被永久破壞。而且資料沒有備份到另一種介質中,對於銀行金融系統這將是巨大的災難,遇到這種情況我們應該怎麼辦呢?

    資料恢復

    應對磁碟故障最簡單的方式就是映象磁碟,即我們常說的備份。回憶一下寫畢業論文時的做法,那時候大部分同學還不會用版本控制器,所以基本採用每天備份一次資料,並且在檔名稱中標註日期,以此來達到備份的效果。

    第二種方式是使用奇偶塊,比如一個系統中有 3 個磁碟,那麼我們再加一個磁碟作為冗餘盤。在冗餘盤中,第 i 塊由所有資料盤的第 i 塊奇偶校驗位組成。也就是說,所有第 I 塊的第 j 位,包括資料盤和冗餘盤,在它們中間必須有偶數個 1,冗餘盤的作用就是讓這個條件為真。

    我們舉個簡單例子,假設快僅由一個位元組組成,我們有三個資料盤和一個冗餘盤,對應的位序列如下。其中 盤4 為冗餘盤,它的位序列是根據前面三個盤計算出來的。

      
      
      
      盤 1:11110000
      盤 2:10101010
      盤 3:00111000
      盤 4:01100010

      假設現在某個盤崩潰了,那麼我們就能根據上面的序列來恢復資料,只需要讓每一列 1 的個數為偶數就可以了,但是這種冗餘方式也存在很大的不足。

      第一個缺陷是,如果是兩個盤同時崩潰了,那資料也恢復不出來了。第二個問題在於,雖然讀資料只需要一次 I/O 操作即可,但是寫資料時就不一樣了,因為需要根據其他資料盤來計算冗餘盤中的位序列,假設共有 n 個盤,其中一個為冗餘盤,所以每次寫資料時,都需要進行 n+1 次 I/O 操作(讀不被寫入的 n-1 個盤,被重寫資料盤的一次寫,冗餘盤的一次寫),而 I/O操作又是非常耗時的操作,所以這種方法會大大拖慢系統效能。

      另一種方案是沒有明顯的冗餘盤,而是把每個磁碟作為某些塊的冗餘盤來處理。比如現在有 4 個盤,0 號磁碟將作為編號為 4、8、12 等柱面的冗餘,而 1 號磁碟作為編號為 1、5、9 等塊的冗餘......

      一種更為先進的方式使用海明碼來幫助從故障中恢復資料,它在多個磁碟崩潰的情況下也能恢復出資料,也是 RAID 的最高等級,由於本人水平有限,用文字表達不清楚,就不作介紹了,嘿嘿。

      來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31555494/viewspace-2744345/,如需轉載,請註明出處,否則將追究法律責任。

      相關文章