自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

我們一起聊聊磁盤原理,你懂了嗎?

存儲(chǔ) 數(shù)據(jù)管理
開(kāi)發(fā)中用的最多的數(shù)據(jù)庫(kù) MySQL,其數(shù)據(jù)是持久化到磁盤中的;Redis 的持久化數(shù)據(jù)是落到磁盤的;Zookeeper 內(nèi)存中的數(shù)據(jù)、事務(wù)日志、快照會(huì)持久化到磁盤;像 RocketMQ 這種消息隊(duì)列也會(huì)將收到的 Message 持久化到磁盤,Kafka 當(dāng)然也不例外。

磁盤這玩意兒,即使不作為一個(gè)開(kāi)發(fā)人員我們也會(huì)經(jīng)常跟它打交道。比如你家里的臺(tái)式機(jī),或者拿來(lái)辦公的電腦,再比如你裝個(gè)操作系統(tǒng),會(huì)涉及到對(duì)磁盤進(jìn)行分區(qū)。

而作為開(kāi)發(fā)人員,自然更加需要關(guān)注磁盤。

平時(shí)你開(kāi)發(fā)的代碼會(huì)暫存在磁盤上;開(kāi)發(fā)中用的最多的數(shù)據(jù)庫(kù) MySQL,其數(shù)據(jù)是持久化到磁盤中的;Redis 的持久化數(shù)據(jù)是落到磁盤的;Zookeeper 內(nèi)存中的數(shù)據(jù)、事務(wù)日志、快照會(huì)持久化到磁盤;像 RocketMQ 這種消息隊(duì)列也會(huì)將收到的 Message 持久化到磁盤,Kafka 當(dāng)然也不例外;

可以說(shuō),磁盤和我們的開(kāi)發(fā)息息相關(guān)。但可能在平時(shí)的開(kāi)發(fā)中,很多人會(huì)忽略掉磁盤的存在,因?yàn)殡m然息息相關(guān),但很遺憾,不是直接相關(guān)。因?yàn)樯厦嫣岬降乃械暮痛疟P相關(guān)的內(nèi)容,都已經(jīng)由工具幫我們做了,甚至包括你的代碼。

這種感覺(jué)就好像,魚(yú)(可能)不怎么注意水,我們平時(shí)不太會(huì)注意氧氣。

我們可能聽(tīng)過(guò),磁盤 IO 慢,為什么?我們可能聽(tīng)過(guò),磁盤順序 IO 會(huì)快些,為什么?我們可能聽(tīng)過(guò)磁盤的順序 IO 甚至比內(nèi)存隨機(jī) IO 要快,為什么?

可能這些問(wèn)題,我們都不一定能做個(gè)清晰的解釋,這也是為什么我想聊聊磁盤。

磁盤分類

首先,按照原理來(lái)分,磁盤可以分為三類:

  • 機(jī)械硬盤(HDD)
  • 固態(tài)硬盤(SSD)
  • 混合硬盤(SSHD)

本篇文章的重點(diǎn)會(huì)放在 HDD 上。

場(chǎng)景切入

首先還是通過(guò)一個(gè)很簡(jiǎn)單的場(chǎng)景來(lái)切入,如下:

圖片

你在你的電腦上創(chuàng)建了個(gè)文件,然后寫了點(diǎn)東西進(jìn)去。然后你 N 天后打開(kāi)電腦,看到這個(gè)文件還在(廢話)。這實(shí)際上就是數(shù)據(jù)被持久化進(jìn)了磁盤,下次需要文件時(shí)再?gòu)拇疟P中取出來(lái)。

這個(gè)存、取的過(guò)程其實(shí)對(duì)我們完全無(wú)感知的,我們就知道裝機(jī)的時(shí)候安了一塊硬盤,其他的啥也不知道。

磁盤結(jié)構(gòu)

那磁盤里究竟長(zhǎng)啥樣呢?它是怎么樣把文件存儲(chǔ)起來(lái)的?以什么樣的方式存儲(chǔ)的?帶著這樣的問(wèn)題來(lái)看一個(gè)圖:

圖片

圖片來(lái)自 wikipedia

結(jié)合上面的結(jié)構(gòu)圖可以看出來(lái),現(xiàn)代主流的磁盤設(shè)計(jì)就是在一個(gè) Spindle(主軸)上,有一些 platter(盤片),然后盤片會(huì)繞著主軸旋轉(zhuǎn),然后讀數(shù)據(jù)、寫數(shù)據(jù)則由讀寫磁頭來(lái)實(shí)現(xiàn),讀寫磁頭會(huì)安裝在磁頭臂上,磁頭臂可以轉(zhuǎn)動(dòng),覆蓋到盤片的所有的半徑,再搭配主軸的旋轉(zhuǎn),從而使磁頭可以獲取到盤片上任何一個(gè)扇區(qū)的數(shù)據(jù)。

那你可能會(huì)好奇了,這個(gè)盤片到底要怎么做、怎么設(shè)計(jì)才能把上文提到的文件給存儲(chǔ)下來(lái)呢?

要知道,現(xiàn)在的磁盤盤片大多都是由非磁性材料,通常是鋁合金、玻璃或者陶瓷制成的,你的印象中,他們能夠拿來(lái)存儲(chǔ)文件嗎(再次手動(dòng)狗頭)

既然提到了非磁性,那么答案肯定就跟磁性有點(diǎn)關(guān)系...

盤片構(gòu)造

沒(méi)錯(cuò),盤片的兩個(gè)面會(huì)被涂上一層薄薄的磁性材料,有多薄呢?大概是 10-20 納米,然后外面給包了層碳來(lái)作為保護(hù),這層薄薄的磁性材料就是存儲(chǔ)數(shù)據(jù)的關(guān)鍵

圖片

磁性材料

一個(gè)磁盤一般都會(huì)有多個(gè)盤片,并且剛剛提到的磁性材料盤片的兩個(gè)面都有。換句話說(shuō),盤片的兩個(gè)面都能用于存儲(chǔ)、讀取數(shù)據(jù)。

現(xiàn)在我們知道了,數(shù)據(jù)其實(shí)是存在磁性材料上的,那這里再思考一個(gè)問(wèn)題:「磁盤怎么知道,數(shù)據(jù)該存在哪塊磁性材料上?讀取的時(shí)候又該從哪塊材料上讀?讀多少?」

這個(gè)道理其實(shí)跟我們的地圖是類似的,舉個(gè)例子,中國(guó)這么大,我們要如何清晰、準(zhǔn)確的描述某一個(gè)地方呢?這個(gè)答案其實(shí)大家都知道,那就是分層分級(jí)。

舉個(gè)例子,網(wǎng)購(gòu)讓你填的收貨地址就是這樣,比如「四川省-成都市-xx區(qū)-xx街道-x棟x號(hào)-xxxx室」,這樣的分層邏輯能夠很直觀的表示一個(gè)特定、具體的位置,而不用說(shuō)大概那一塊,先往中國(guó)西南走、走到城市之后繼續(xù)往西走,大概走多久之后,再往南走,運(yùn)氣好的你就能找到那個(gè)地址了(再次手動(dòng)狗頭)。

盤片上也是做了類似的事情,先看個(gè)圖:

圖片

盤片的構(gòu)造

中間的黑點(diǎn)就是主軸,以主軸為圓心劃分了多個(gè)磁道(為了方便理解圖中只給出了 3 個(gè)磁道),每個(gè)磁道上又劃分出了多個(gè)區(qū)域,每個(gè)區(qū)域叫做扇區(qū),并且每個(gè)扇區(qū)的大小是固定的 512 字節(jié)。讀取數(shù)據(jù)的時(shí)候,只需要通過(guò)這個(gè)劃分就能夠知道數(shù)據(jù)在哪個(gè)磁道、哪個(gè)扇區(qū)了。

但是通過(guò)上圖還是能看出一個(gè)問(wèn)題:那就是不同的磁道扇區(qū)數(shù)是相同的,扇區(qū)所在的磁道半徑約大,則扇區(qū)的面積就越大。但無(wú)論面積比靠?jī)?nèi)磁道的扇區(qū)大多少,按照設(shè)計(jì)、規(guī)定只能存儲(chǔ) 512 字節(jié)的數(shù)據(jù),這樣一來(lái)會(huì)浪費(fèi)大量的存儲(chǔ)空間。

為了優(yōu)化這個(gè)問(wèn)題,就有了 ZBR 技術(shù)方案。

ZBR,全稱 Zone Bit Recording,用來(lái)解決傳統(tǒng)盤片的磁道扇區(qū)存儲(chǔ)空間浪費(fèi)的問(wèn)題。它是怎么做的呢?說(shuō)起來(lái)也很簡(jiǎn)單,越靠外圈磁道的扇區(qū)由于面積會(huì)更大,所以 ZBR 會(huì)放置更多的扇區(qū),從而將空間利用起來(lái)。

轉(zhuǎn)換成圖形可能就是這樣:

圖片

盤片的ZBR

不同的磁道扇區(qū)數(shù)量不同了,外圈磁道上面的扇區(qū)會(huì)更多些,從而充分的利用空間,提升磁盤的總?cè)萘俊?/p>

存儲(chǔ)原理

好,繼續(xù)深入問(wèn)題盤片存儲(chǔ)相關(guān)的問(wèn)題。

我們知道從宏觀上來(lái)看,計(jì)算機(jī)并不會(huì)管你是誰(shuí),到它這都是 0101010101。那么當(dāng)讀取文件的時(shí)候,它是如何從這層磁性材料中識(shí)別出來(lái) 0101010101,然后還原成我們能看懂的文件的?

前面我們知道盤片上劃分了磁道、扇區(qū),相應(yīng)的磁性材料也同理?,F(xiàn)代磁盤就是通過(guò)磁化盤片兩面的磁性材料來(lái)記錄數(shù)據(jù)的,磁性材料序列的改變則代表了對(duì)應(yīng)的二進(jìn)制 0、1。

圖片

磁性序列原理

可以看到,兩個(gè)磁性 Region 的序列方向不同,則標(biāo)記為 R(Reverse),相同則標(biāo)記為 N(No Reverse),當(dāng)讀取的時(shí)候,如果探測(cè)到序列是 RR,則對(duì)應(yīng) 1,而如果是 NR,則對(duì)應(yīng) 0(或許這就是為什么它叫磁盤吧,再再次手動(dòng)狗頭)

所以,我們常說(shuō)的寫磁盤并不是說(shuō)讀寫磁頭在盤片上刻?hào)|西,而是改變磁性材料的序列,并且讀寫磁頭和盤片沒(méi)有直接接觸,他們有個(gè)大概 10 nm 的距離。

并且,從上述現(xiàn)狀我們可以簡(jiǎn)單推導(dǎo),既然讀寫磁盤都是靠讀取盤片上的磁性序列,并且盤片的兩個(gè)面都能用于存儲(chǔ)數(shù)據(jù),那么必然盤片的每個(gè)面都有磁頭。

磁盤性能

了解完一些簡(jiǎn)單的原理之后,我們終于可以來(lái)了解磁盤性能相關(guān)的問(wèn)題了,我們會(huì)深入的分析為什么磁盤 IO 是個(gè)非常昂貴的操作。

現(xiàn)在思考一個(gè)問(wèn)題,我們要查詢數(shù)據(jù),底層會(huì)怎么做?是不是會(huì):

將磁頭移動(dòng)到目標(biāo)文件所在的磁道

此時(shí)盤片正被主軸帶著旋轉(zhuǎn),磁頭需要等待對(duì)應(yīng)的扇區(qū)旋轉(zhuǎn)到磁頭這才能讀取數(shù)據(jù)

對(duì)應(yīng)扇區(qū)到了之后,就需要等待讀取數(shù)據(jù)&傳輸

總結(jié)一下,磁盤的 IO 請(qǐng)求耗時(shí)主要由三部分組成:

  • 磁頭尋道時(shí)間:這個(gè)延遲一般在 3-15 ms
  • 盤片旋轉(zhuǎn)延遲:這個(gè)取決于主軸旋轉(zhuǎn)的速度,隨著速度的不同大概在 2-4 ms
  • 數(shù)據(jù)傳輸時(shí)間:這里平均只用 3 微秒,跟上面兩個(gè)比起來(lái)這里的耗時(shí)可以忽略不計(jì)

這里提到了旋轉(zhuǎn)的問(wèn)題,在盤片旋轉(zhuǎn)延遲這里,盤片旋轉(zhuǎn)越快,則對(duì)應(yīng)扇區(qū)移動(dòng)到磁頭的速度也會(huì)越快。

現(xiàn)代磁盤的旋轉(zhuǎn)速度在 5400 或者 7200 RPM(Revolutions Per Minute)不等,當(dāng)然也有一些高性能的服務(wù)器轉(zhuǎn)速會(huì)達(dá)到 1500 RPM。

盤片旋轉(zhuǎn)延遲的確和轉(zhuǎn)速相關(guān),因?yàn)檗D(zhuǎn)速越快,對(duì)應(yīng)扇區(qū)移動(dòng)到磁頭的位置就越快。但并不是轉(zhuǎn)速越快越好,因?yàn)檗D(zhuǎn)速越高,發(fā)熱約嚴(yán)重,磁盤的壽命也就越短。

下面給個(gè)不同的轉(zhuǎn)速下對(duì)應(yīng)的旋轉(zhuǎn)延遲的參考:

旋轉(zhuǎn)速度(單位 RPM)

平均旋轉(zhuǎn)延遲(單位毫秒)

4800

6.25

5400

5.55

7200

4.16

10000

3

15000

2

(以上數(shù)據(jù)來(lái)自 wikipedia)

可能你看到幾毫秒覺(jué)得還好,并不是那么慢,但是跟內(nèi)存的速度一對(duì)比你就能立馬明白。內(nèi)存的隨機(jī)讀大概在幾百納秒,假設(shè)內(nèi)存的速度是 200 ns、磁盤的速度是 2ms(按上表中轉(zhuǎn)速最高的延遲來(lái)算),差了 10000 倍,也就是 4 個(gè)數(shù)量級(jí)。

到這里,我想我們也能理解為什么磁盤的順序讀寫能夠與內(nèi)存隨機(jī)讀一戰(zhàn)了。因?yàn)榇疟P順序讀寫幾乎把前兩個(gè)最耗時(shí)的操作給干掉了,磁頭已經(jīng)移動(dòng)到了對(duì)應(yīng)的磁道, 也找到了對(duì)應(yīng)的扇區(qū),直接寫就完事了。

好了, 關(guān)于磁盤的原理就簡(jiǎn)單介紹到這里。

責(zé)任編輯:武曉燕 來(lái)源: SH的全棧筆記
相關(guān)推薦

2023-10-31 14:04:17

Rust類型編譯器

2023-11-13 18:36:04

知識(shí)抽取NER

2023-06-07 14:07:00

架構(gòu)

2024-04-07 08:23:01

JS隔離JavaScript

2023-04-13 08:40:12

MySQL服務(wù)器SELECT

2022-04-01 08:48:45

JavaPythonRuby

2025-01-07 09:07:36

接口屬性路徑

2025-04-11 00:05:49

RPC底層分布式

2022-06-06 07:58:52

勒索軟件惡意軟件解密

2021-08-27 07:06:10

IOJava抽象

2024-02-20 21:34:16

循環(huán)GolangGo

2023-08-04 08:20:56

DockerfileDocker工具

2022-05-24 08:21:16

數(shù)據(jù)安全API

2023-08-10 08:28:46

網(wǎng)絡(luò)編程通信

2023-09-10 21:42:31

2023-06-30 08:18:51

敏捷開(kāi)發(fā)模式

2023-04-03 06:57:38

DataNode工具命令行

2023-04-26 22:52:19

視覺(jué)人臉檢測(cè)人臉對(duì)齊

2023-11-07 08:13:53

分布式網(wǎng)絡(luò)

2025-01-06 09:26:49

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)