在本章,我們稍微涉及一些硬體和作業系統層面的事情。
計算機是由硬體和軟體組成的, 而所有軟體的唯一目標就是盡可能最大化的利用下層硬體能夠提供的特性,完成上層的功能。
所以才會有人說,硬體是骨頭,軟體是血肉,骨頭決定生物的形態,軟體決定生物的神態。不過,依然請放心,我們不會討論複雜的東西, 作為乙個軟體工程師,也沒有人會要求我們去寫乙個磁碟儲存器的硬體驅動**~ 在這裡,我們只討論那些為了後面我們理解軟體儲存而鎖需要掌握的硬體知識。
好了,直入主題 ,硬碟
=== 硬碟構造介紹===
所謂的資料儲存,就是把一串很普通的由0和1組成的位元組流按照他原來的順序寫入到一種介質裡面去。那麼自然而然,使用電驅動的磁鐵小針快速的改變可磁化介質從而記錄下這些資料就必然是一種很好的選擇。
磁碟的先祖其實就是磁帶機,相信閱讀本文的讀者應該都使用過錄音機的(95後無辜的看著我。。。)
從很小的用來聽**的卡片式磁帶機到很大的用來存資料的磁帶卷兒,其實樣子一直都是這樣的(笑)。
在使用的過程中,一般是由乙個小電機帶著這個磁帶向著乙個方向轉動,然後有乙個磁頭以很近的距離來讀取磁場的微妙變化,從而能夠讀取到上面記錄的資料的。
這裡就出現了磁碟中所需要用到的第乙個關鍵的元件,電機,他的主要作用在於給予帶動含磁介質向著乙個固定的方向轉動,從而可以保證資料能夠被「順序」的讀出和讀入。
然而,當我們嘗試把這種磁技術應用於計算機的時候,就立刻發現了乙個很重要的問題需要解決:
在計算機的應用場景中,資料的讀取可能不完全是順序的,有可能先讀一下開始位置的資料,然後又讀一下結果位置的資料,最後又需要讀中間位置的資料。並且,這種讀取的跳躍過程是無法提前**的。
因此就有乙個問題急需要解決,如何能夠讓磁介質支援隨機訪問。
讓我們回想一下磁介質寫入和讀取過程中需要的關鍵元件: 1. 磁介質。2.磁頭。3.步進電機。
而隨機訪問則需要能夠讓磁頭與磁介質的特定區段進行接觸,從而才能讀取到對應的資料。
那麼,一種選擇是讓介質移動到指定位置,磁頭不動。一種是讓磁頭移動到介質的位置上。
明顯的,把儲存介質移動起來的控制難度要遠遠大於讓磁頭移動。
所以,計算機需要的新的磁儲存模型就出現了:
磁碟使用步進電機保持勻速運動,然後讓磁頭移動來讀取或寫入資料!
不過,雖然磁頭移動已經是裡面最輕量的玩意兒了,但他仍然需要乙個電機帶動磁頭在磁碟上做尋道操作。
=== 硬碟塊與原子操作 ===
然後我們再來看另外乙個問題,如果你每次寫入只寫乙個bit,那麼因為磁碟在高速旋轉,有大量的資料傳遞性工作,導致磁碟需要頻繁的等待新的命令,這樣會造成磁碟效率非常低下。因此,一次寫一批資料就成了合理的選擇,所以磁碟一般是按照磁碟塊的方式來組織資料的。
常用的塊大小是512byte 。但因為磁碟的磁頭一次只能寫乙個bit,所以依然會面臨斷電了資料寫一半兒怎麼辦的問題。。
如果告訴你寫成功了,那一定是寫成功了。那失敗怎麼辦? 好問題,我們來分析一下:
一台計算機,其實只有三個狀態,要麼給電機器運轉,要麼正常關機,要麼異常關機。在正常運轉狀態和正常關機狀態的時候,作業系統都可以保證資料的所有操作都是原子的,因為只需要在關機hook上做完該做的事情,同時不允許有新的請求進來就可以了。
只有異常關機的狀態略微有點麻煩,首先,因為無論計算機是正常關機還是異常斷點的關機,這台計算機在下次給電啟動之前都是不可能服務的,所以就算是有個磁碟塊只寫了一半兒也沒什麼問題。 所以問題就轉化成,能否在下次啟動並能提供讀寫服務之前,先把那些寫了一半的資料塊刪掉?(因為沒有給請求方反饋過成功,所以這些未完成的塊本來就不應該存在)
那下一步如何做就很容易可以想到了。在每次開機的時候判斷一下是否是一次正常的關機,如果不是正常關機,那麼將那些未被標記為完整寫入的塊全部刪掉。
嗯 ,這個模式也是貫穿單機有狀態儲存保證資料一致性的主要方法,可以復用到單機所有需要原子性操作的地方哦~
=== 讀寫iops與讀寫吞吐量(mbps) 與 延遲的關係 ===
這個概念我估計大部分人都會搞混,包括我在內。
所以我也把目前我的理解給到大家 首先
先來界定什麼叫做一次io . 簡單來說,一次io就是應用層發起一次寫入或查詢的請求
那麼這個請求對應到磁碟上面來說呢就是以下幾個操作的集合:
1. 磁頭移動到這次請求所對應的磁軌
2. 等待硬碟旋轉到資料所在的位置
3. 讀取資料
自然的,如果想增加磁碟的iops數,就需要讓磁碟在一秒內盡可能多的完成使用者的請求,那麼最理想狀態下應該是: 減少磁頭的移動,減少硬碟轉到資料所在位置的時間,減少一次請求所要讀寫的資料塊個數。
不過這是個理想狀態,因為請求無法**,所以一般來說也只能是追求盡可能減少隨機尋道時間(因為這個是幾個iops的引數中影響最大的乙個)。
這個指標是面向小資料隨機或順序讀寫應用時候比較看重,比如資料庫。
再來看吞吐量(mb per second)
這個指標是磁碟相對比較擅長的指標,他衡量的是資料在單位時間內傳出+傳入這塊磁碟的總數量。
所以如果想增加磁碟的吞吐量指標,就需要讓磁碟在一秒內盡可能多的寫入或讀出資料,那麼最理想的狀態下應該是: 減少磁頭的移動,減少磁碟轉到資料所在位置的時間,增加一次請求所需要讀寫的資料塊的個數。
比如,如果使用者只有乙個請求,並且這個請求是要求順序的將1t的資料寫入到磁碟內。這種情況就能發揮出磁碟吞吐量的極限了。 延遲
基本上來說,延遲和iops是個正比例關係。
為什麼這麼說呢? 原因是更大延遲可以允許計算機做這麼一件事,批量處理:
就好比100個旅客要從北京坐飛機到杭州,飛機是個稀缺資源,我們假定北京飛杭州要1個小時。
那麼如果一架飛機上只有乙個旅客,那麼要飛100次才能夠把這批旅客運到目的地,運送100個旅客的總時間是 100個小時, 每小時運送旅客數是100/ 100 = 1 ,而如果要是讓先來的旅客等一等,等到100人都做上飛機以後再起飛呢?那麼每小時運送的旅客數就是 100/ 乘客的等待時間+ 1 / 1 約等於100
這樣略微增加延遲就可以提公升整體的tps 量了。 不過需要注意的是,這個提公升是有上限的,當每架飛機都坐滿了人的時候,那麼飛機的運力就是最終瓶頸,其他乘客只能等待。
所以乙個常見的延遲與請求數的圖示往往是這樣的:
請求數超過伐值後,就只剩下排隊了,系統的運力不可能再有提公升了。
==== 小結 ===
總結一下磁碟的優勢和劣勢:
優勢:技術比較成熟,因此**相對較低
順序讀寫因為不涉及到大量的機械尋道,所以吞吐量只和磁碟轉速正相關。
劣勢:只要操作需要大量尋道,畢竟尋道是個機械操作,那麼磁碟的iops和吞吐量會立刻下降很多。
讀取和寫入是按照塊來進行的,一般塊的大小是512 bytes,所以一次操作必須一次性的寫入這個數量的資料。
資料的儲存介質 磁碟的硬體特性
在本章,我們稍微涉及一些硬體和作業系統層面的事情。計算機是由硬體和軟體組成的,而所有軟體的唯一目標就是盡可能最大化的利用下層硬體能夠提供的特性,完成上層的功能。所以才會有人說,硬體是骨頭,軟體是血肉,骨頭決定生物的形態,軟體決定生物的神態。不過,依然請放心,我們不會討論複雜的東西,作為乙個軟體工程師...
ROM,RAM,FLASH等儲存介質的區別介紹。
ram random access memory 隨機訪問儲存器,也叫主存,是與cpu直接交換資料的內部儲存器。它可以隨時讀寫 重新整理時除外 而且速度很快,通常作為作業系統或其他正在執行中的程式的臨時資料儲存介質。ram工作時可以隨時從任何乙個指定的位址寫入 存入 或讀出 取出 資訊。它與rom的...
資料是如何儲存在磁碟的
我們腦子裡理解資料的儲存就是 乙個庫裡面有一些表,表裡面有很多字段,然後有很多行資料 但其實這只是我們的邏輯概念,資料在磁碟物理儲存方式可不是這樣的。mysql在伺服器上是以乙個資料夾的形式出現的,你建立了test資料庫,那麼在磁碟上就會出現test的目錄,而建立的那些表,其實都是有乙個表空間的概念...