印象系列-磁盤和內存的基本認識

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

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

內存(DRAM )做爲一種易失性存儲器在斷電狀況下是不能保存數據的,這是由於內存自己是經過電容來實現二進制位的存儲,每個位的電容都很是小,只不過內存製造的很是密集因此能夠保存不少位。一個位就是一個bit,每一個位在內存裏面都稱做一個內存單元,總體的構造可簡化成以下圖所示:3d


注意看圖中的網格區域,這是內存單元的編排方式,簡單說就是一個二維矩陣,咱們假設如今有一個內存很是小,它被分割成16個超單元,超單元這東西又包含了8個內存單元,那麼能夠知道這個內存最大可保存16*8=108bit的信息。cdn

那麼如何實現數據的讀寫呢?blog

圖中存儲控制器和內存單元塊中間標明瞭addr的地址線,上面的數字2表示有兩條,兩條地址線在實際過程當中會經過發送0、1信號來標識地址信息。內存

若是想指定內存矩陣某一行某一列的超單元時,存儲控制器就會分兩次對addr線發送電信號。這兩次分別指定了目標超單元的行地址和列地址,好比第一次發送中第一二兩條地址線分別發送了0、1的電信號,那麼就是01的值,指定內存矩陣中的第二行(注意第一行數值是0),隨即第二次發送中第一二條地址線分別發送了一個一、1的電信號,就是11的值,指定第四列的數據,最終就是指定了第一行第四列的超單元。存儲控制器再對這個超單元的數據進行讀寫操做。開發

內存的數據又該如何傳送呢?it

你們可能已經注意到了圖中標示data的雙箭頭,上面的數字8表示有8根數據線,說明該內存每一次讀寫最多能傳遞8bit,也就是一個字節的信息。具體的細節能夠不用作進一步探究,反正咱們只需知道內存的構造中正是經過地址線和數據線鏈接到二維的矩陣單元中實現讀寫操做的。io

上面就是我想分享的關於內存的一些基本印象,這個印象首先對我來講就是,內存在讀寫和存儲過程當中都離不開電。在內存持續的運行當中,我腦海裏就是無數電流在內存芯片快速流動着,你們要知道電的速度但是和光同樣的。class

磁盤(硬盤)做爲一種非易失性存儲器適合資料的長久存儲,要理解長久保存的緣由一樣須要從磁盤構造開始瞭解。

爲了簡化說明,我用光驅來作個示例,咱們知道光驅讀取數據時會有一個激光頭對準光盤,播放光盤的過程當中伴隨着光盤的不斷旋轉。其實磁盤的數據讀取過程就相似這種操做,光盤的盤面經過凹下去的坑的變化記錄二進制信息,激光會對準光盤的某個扇區,旋轉中的光盤帶來了位置的變化,從而激光頭能夠對準光盤盤面的不一樣區域,實現全部數據的讀取。

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


你們能夠對光盤外形的理解轉移到磁盤上去,如上圖,磁盤的盤面可理解爲不少不一樣半徑的磁道一環環組成的,每一個磁道就是空心圓,這個圓又由多個扇區組成,扇區就是磁盤保存數據的最小單位(通常爲512字節),因此一個盤面就包含了不少這樣的扇區。

光盤是經過上面懸浮的激光頭對準着掃描讀取的,磁盤也有這麼個相似的東西,一樣對準着磁盤,以下圖:


磁盤上方有一個傳動臂,傳動臂末端就是讀寫頭(相似於光盤的激光頭),傳動臂可在水平上調整不一樣角度擺動,而磁盤能夠在必定速率下進行旋轉,這兩個特性很是重要,下面會聯繫讀寫過程進行說明。

那麼磁盤的數據讀寫過程是怎樣的呢?

聯繫上文咱們知道內存經過電信號和電流對內存單元進行定位和數據傳送,整個物理過程是電的變化。而磁盤就不同了,若是想讀取磁盤的某個數據,必定要先肯定目標地址(扇區位置),而後讓讀寫頭定位到這個扇區的起始位置處。

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

經過磁盤盤面的構造咱們知道,首先要經過控制傳動臂的角度肯定目標扇區在哪一個磁道上,而後讓磁盤旋轉必定角度,使得最終的目標扇區恰好停在讀寫頭的正下方,這樣的一系列過程咱們稱爲機械運動(因此知道爲何不少人把普通硬盤稱爲機械硬盤了吧?),當磁盤要進行不少讀寫操做時,若是目標數據分佈在盤面不一樣位置的扇區上,那麼這個過程須要傳動臂不斷調整角度,不斷旋轉磁盤,因爲都是機械過程,因此磁盤的讀寫瓶頸就出如今這裏了。

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


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

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

其實分享這個主題,只是想給開發者一個體會,就是對數據存儲成本具有敏感性。如今的計算機CPU已經很強大了,計算速度超越了咱們的通常理解,但在I/O這塊的速度並無大幅提升,如今不少項目的處理瓶頸其實就是出如今這塊。經過文中理解,咱們能認識到頻繁從磁盤操做數據是怎樣的一個物理過程,這個過程能自動在腦海給咱們一種警示:機械運動實在是太慢了。因此後續的不少優化其實都是在減小磁盤I/O,不管技術多麼牛逼,這個主題在很長一段時間都會被拿來討論。

相關文章
相關標籤/搜索