印象系列-磁碟和記憶體的基本認識

Zerui發表於2017-10-21

如果問起記憶體和磁碟的區別,我相信大部分開發者都會列舉一二。事實確實這樣,最近在團隊的一次內部分享上,四五位同學說出了不同的答案:記憶體儲存速度快、磁碟容量大、磁碟可儲存長久資料、磁碟體積比較大~

當然了,這都是對的,但任何問題應該拋開表象探究背後原因,當我問到為何大部分計算機的磁碟容量都很大、為何磁碟的儲存速度就是慢、為何磁碟可儲存長久資料,甚至,為何磁碟的體積就是非得那麼大呢?不是每個人都能清楚地說出原因,甚至對這兩種儲存器並不敏感,不知從哪個角度解答!儘管大部分人平時在開發過程折騰著機器都會涉及到這兩樣東西,下面來分享下我的一些理解,希望在整體上能體會到一些細節和特性。

記憶體(DRAM )作為一種易失性儲存器在斷電情況下是不能儲存資料的,這是因為記憶體本身是通過電容來實現二進位制位的儲存,每一個位的電容都非常小,只不過記憶體製造的非常密集所以可以儲存很多位。一個位就是一個bit,每個位在記憶體裡面都稱作一個記憶體單元,整體的構造可簡化成如下圖所示:

印象系列-磁碟和記憶體的基本認識

注意看圖中的網格區域,這是記憶體單元的編排方式,簡單說就是一個二維矩陣,我們假設現在有一個記憶體非常小,它被分割成16個超單元,超單元這東西又包含了8個記憶體單元,那麼可以知道這個記憶體最大可儲存16*8=108bit的資訊。

那麼如何實現資料的讀寫呢?

圖中儲存控制器和記憶體單元塊中間標明瞭addr的地址線,上面的數字2表示有兩條,兩條地址線在實際過程中會通過傳送0、1訊號來標識地址資訊。

如果想指定記憶體矩陣某一行某一列的超單元時,儲存控制器就會分兩次對addr線傳送電訊號。這兩次分別指定了目標超單元的行地址和列地址,比如第一次傳送中第一二兩條地址線分別傳送了0、1的電訊號,那麼就是01的值,指定記憶體矩陣中的第二行(注意第一行數值是0),隨即第二次傳送中第一二條地址線分別傳送了一個1、1的電訊號,就是11的值,指定第四列的資料,最終就是指定了第一行第四列的超單元。儲存控制器再對這個超單元的資料進行讀寫操作。

記憶體的資料又該如何傳送呢?

大家可能已經注意到了圖中標示data的雙箭頭,上面的數字8表示有8根資料線,說明該記憶體每一次讀寫最多能傳遞8bit,也就是一個位元組的資訊。具體的細節可以不用做進一步探究,反正我們只需知道記憶體的構造中正是通過地址線和資料線連線到二維的矩陣單元中實現讀寫操作的。

上面就是我想分享的關於記憶體的一些基本印象,這個印象首先對我來說就是,記憶體在讀寫和儲存過程中都離不開電。在記憶體持續的執行當中,我腦海裡就是無數電流在記憶體晶片快速流動著,大家要知道電的速度可是和光一樣的。

磁碟(硬碟)作為一種非易失性儲存器適合資料的長久儲存,要理解長久儲存的原因同樣需要從磁碟構造開始瞭解。

為了簡化說明,我用光碟機來做個示例,我們知道光碟機讀取資料時會有一個鐳射頭對準光碟,播放光碟的過程中伴隨著光碟的不斷旋轉。其實磁碟的資料讀取過程就類似這種操作,光碟的盤面通過凹下去的坑的變化記錄二進位制資訊,鐳射會對準光碟的某個扇區,旋轉中的光碟帶來了位置的變化,從而鐳射頭可以對準光碟盤面的不同區域,實現所有資料的讀取。

在這裡,必須理解扇區、磁軌的概念,下圖是磁碟的一個盤面,可輔助各位建立磁碟的第一印象:

印象系列-磁碟和記憶體的基本認識

大家可以對光碟外形的理解轉移到磁碟上去,如上圖,磁碟的盤面可理解為很多不同半徑的磁軌一環環組成的,每個磁軌就是空心圓,這個圓又由多個扇區組成,扇區就是磁碟儲存資料的最小單位(一般為512位元組),所以一個盤面就包含了很多這樣的扇區。

光碟是通過上面懸浮的鐳射頭對準著掃描讀取的,磁碟也有這麼個類似的東西,同樣對準著磁碟,如下圖:

印象系列-磁碟和記憶體的基本認識

磁碟上方有一個傳動臂,傳動臂末端就是讀寫頭(類似於光碟的鐳射頭),傳動臂可在水平上調整不同角度擺動,而磁碟可以在一定速率下進行旋轉,這兩個特性非常重要,下面會聯絡讀寫過程進行說明。

那麼磁碟的資料讀寫過程是怎樣的呢?

聯絡上文我們知道記憶體通過電訊號和電流對記憶體單元進行定位和資料傳送,整個物理過程是電的變化。而磁碟就不一樣了,如果想讀取磁碟的某個資料,一定要先確定目標地址(扇區位置),然後讓讀寫頭定位到這個扇區的起始位置處。

注意了,讀寫頭如何定位到目標扇區的位置呢?

通過磁碟盤面的構造我們知道,首先要通過控制傳動臂的角度確定目標扇區在哪個磁軌上,然後讓磁碟旋轉一定角度,使得最終的目標扇區剛好停在讀寫頭的正下方,這樣的一系列過程我們稱為機械運動(所以知道為什麼很多人把普通硬碟稱為機械硬碟了吧?),當磁碟要進行很多讀寫操作時,如果目標資料分佈在盤面不同位置的扇區上,那麼這個過程需要傳動臂不斷調整角度,不斷旋轉磁碟,由於都是機械過程,所以磁碟的讀寫瓶頸就出現在這裡了。

在實際的磁碟中往往不止一個碟片,而是多個碟片在垂直角度上疊加的,如下圖:

印象系列-磁碟和記憶體的基本認識

每個碟片都有兩個盤面,對應都配有讀寫頭,但這不妨礙我們只針對一個盤面來理解磁碟的讀寫過程。

好了,上面就是本次分享的對記憶體和磁碟的構造的基本理解,有了這麼個印象我相信回到文中開頭的幾個問題,或許能給出更根本的解釋。比如,記憶體儲存速度快是因為這個過程是電傳輸的過程,電的速度很快,而磁碟的讀取是機械過程,本身具有很大的限制;磁碟容量大是因為磁碟通過磁性材料儲存資料,適合長久儲存資料,同時也決定了製造成本更低,在當前環境下相對經濟,而記憶體成本較高,適合作為資料快取記憶體的角色。磁碟體積較大是由磁碟的構造方式決定的,有多個盤面還有傳動臂,需要做機械運動,再精細的磁碟也有一定的空間要求。

其實分享這個主題,只是想給開發者一個體會,就是對資料儲存成本具備敏感性。現在的計算機CPU已經很強大了,計算速度超越了我們的一般理解,但在I/O這塊的速度並沒有大幅提高,現在很多專案的處理瓶頸其實就是出現在這塊。通過文中理解,我們能認識到頻繁從磁碟運算元據是怎樣的一個物理過程,這個過程能自動在腦海給我們一種警示:機械運動實在是太慢了。所以後續的很多優化其實都是在減少磁碟I/O,無論技術多麼牛逼,這個主題在很長一段時間都會被拿來討論。





相關文章