磁盘位置_CPT201-磁盘
轉載于:
簡單理解磁盤結構_劉小緒同學的博客-CSDN博客?blog.csdn.net數據庫系統總會涉及到輔助存儲(大多都是磁盤),因為它們能夠存儲大量需要長期保存的數據,因此我們有必要先了解了解磁盤的相關知識。
根據機械原理,存儲器的容量越大其速度就越慢。但是速度越快的存儲器,其單位字節的價格就越貴。現代計算機系統可以包含幾個不同的可以存儲數據的部件,就形成了存儲器的層次結構,但是需要注意的是「虛擬內存」是操作系統與操作系統運用機器硬件的產物,它不是存儲器的層次之一。
磁盤結構
傳統的硬盤盤結構是像下面這個樣子的,它有一個或多個盤片,用于存儲數據。盤片多采用鋁合金材料;中間有一個主軸,所有的盤片都繞著這個主軸轉動。一個組合臂上面有多個磁頭臂,每個磁頭臂上面都有一個磁頭,負責讀寫數據。
磁盤一般有一個或多個盤片。每個盤片可以有兩面,即第一個盤片的正面為0面,反面為 1 面;第二個盤片的正面為 2 面…依次類推。磁頭的編號也和盤面的編號是一樣的,因此有多少個盤面就有多少個磁頭。盤面正視圖如下圖,磁頭的傳動臂只能在盤片的內外磁道之間移動。因此不管開機還是關機,磁頭總是在盤片上面。關機時,磁頭停在盤片上面,抖動容易劃傷盤面造成數據損失,為了避免這樣的情況,所以磁頭都是停留在起停區的,起停區是沒有數據的。
每個盤片的盤面被劃分成多個狹窄的同心圓環,數據就存儲在這樣的同心圓環上面,我們將這樣的圓環稱為磁道 (Track)。每個盤面可以劃分多個磁道,最外圈的磁道是0號磁道,向圓心增長依次為1磁道、2磁道…磁盤的數據存放就是從最外圈開始的。
根據硬盤的規格不同,磁道數可以從幾百到成千上萬不等。每個磁道可以存儲數 Kb 的數據,但是計算機不必要每次都讀寫這么多數據。因此,再把每個磁道劃分為若干個弧段,每個弧段就是一個扇區 (Sector)。扇區是硬盤上存儲的物理單位,現在每個扇區可存儲 512 字節數據已經成了業界的約定。也就是說,即使計算機只需要某一個字節的數據,但是也得把這個 512 個字節的數據全部讀入內存,再選擇所需要的那個字節。
柱面是我們抽象出來的一個邏輯概念,簡單來說就是處于同一個垂直區域的磁道稱為柱面 ,即各盤面上面相同位置磁道的集合。需要注意的是,磁盤讀寫數據是按柱面進行的,磁頭讀寫數據時首先在同一柱面內從 0 磁頭開始進行操作,依次向下在同一柱面的不同盤面(即磁頭上)進行操作,只有在同一柱面所有的磁頭全部讀寫完畢后磁頭才轉移到下一柱面。因為選取磁頭只需通過電子切換即可,而選取柱面則必須通過機械切換。數據的讀寫是按柱面進行的,而不是按盤面進行,所以把數據存到同一個柱面是很有價值的。
磁盤被磁盤控制器所控制(可控制一個或多個),它是一個小處理器,可以完成一些特定的工作。比如將磁頭定位到一個特定的半徑位置;從磁頭所在的柱面選擇一個扇區;讀取數據等。
現代硬盤尋道都是采用CHS(Cylinder Head Sector)的方式,硬盤讀取數據時,讀寫磁頭沿徑向移動,移到要讀取的扇區所在磁道的上方,這段時間稱為尋道時間(seek time)。因讀寫磁頭的起始位置與目標位置之間的距離不同,尋道時間也不同。磁頭到達指定磁道后,然后通過盤片的旋轉,使得要讀取的扇區轉到讀寫磁頭的下方,這段時間稱為旋轉延遲時間(rotational latencytime)。然后再讀寫數據,讀寫數據也需要時間,這段時間稱為傳輸時間(transfer time)。
根據上文的信息,我們可以得出磁盤容量的計算公式為:
硬盤容量 = 盤面數 × 柱面數 × 扇區數 × 512字節筆試題實戰
下面的題目是騰訊某一年校招筆試中的一個題目,題干信息描述為:數據存儲在磁盤上的排列方式會影響I/O服務的性能,一個圓環磁道上有10個物理塊,10個數據記錄R1~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 的扇區對分別稱為左拷貝 XL和右拷貝XR。這樣實際上就是每個扇區的內容都存儲了兩份,操作XL失敗,那么去操作XR就可以了,更何況我們還在每個扇區中有校驗和,把錯誤的概率就大大降低了。
到現在為止,我們討論的都是簡單的故障,但是如果發生了磁盤崩潰,其中的數據被永久破壞。而且數據沒有備份到另一種介質中,對于銀行金融系統這將是巨大的災難,遇到這種情況我們應該怎么辦呢?
數據恢復
應對磁盤故障最簡單的方式就是鏡像磁盤,即我們常說的備份。回憶一下寫畢業論文時的做法,那時候大部分同學還不會用版本控制器,所以基本采用每天備份一次數據,并且在文件名稱中標注日期,以此來達到備份的效果。
第二種方式是使用奇偶塊,比如一個系統中有 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 的最高等級,由于本人水平有限,用文字表達不清楚,就不作介紹了,嘿嘿。
總結
以上是生活随笔為你收集整理的磁盘位置_CPT201-磁盘的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关卡 动画 蓝图 运行_上车喂,建模大神
- 下一篇: 巅峰坦克军团科技干什么的