計算機|內存與磁盤

1、磁盤的物理結構

 

講了這麼多磁盤和內存的關係,那磁盤又是什麼樣的?

 

磁盤是通過把其物理表面劃分成多個空間來使用的,劃分方式有扇區方式和可變長方式。

 

扇區方式就是把磁盤劃分爲固定長度的空間,可變長方式把磁盤劃分爲長度可變的空間。一般Windows計算機用前者,把磁盤表面分成若干同心圓的空間(磁道),磁道按固定大小(能存儲的空間)劃分成的空間就是扇區。

 

 

以前Windows中使用的磁盤,一個扇區512B,現在大了,一個扇區4K。但一個扇區一個扇區地讀太慢了,你的電腦再怎麼256G該有吧,256GB÷4KB=64M,電腦內有6400萬個扇區,按扇區讀取的話,那你的硬盤真的是飛快地轉。

 

實際上Windows在磁盤中進行讀寫的單位是扇區的整數倍簇。1簇可以是4K/8K/16K等等。磁盤越大,簇越大。

2、程序運行於內存

 

編過程序的人都知道,程序保存在存儲設備中,通過有序地讀出來實現運行,這一機制稱爲存儲程序方式

 

計算機內的主要存儲部件是內存和磁盤。磁盤中存儲的程序必須加載到內存後才能運行,這是因爲,負責解析和運行程序的CPU需要通過內部程序計數器(就是那個只有一個的寄存器)來指定內存地址,然後才能讀出程序。即使CPU能運行磁盤內的程序,由於磁盤讀取速度慢,程序的運行速度還是會降低。(你見過在你GB/TB級別磁盤上直接運行程序的CPU嗎/霧)

 

講CPU的推送鏈接:計算機|程序&CPU

 

總之,CPU、內存、磁盤的關係如下:

 

 

在這個大前提下,內存和磁盤存在着很多親密的關係,下面慢慢說。

 

3、磁盤緩存

 

衆所周知,計算機讀取數據時,速度比較:寄存器>內存>磁盤。計算機早期爲了加速數據的讀取,採用了磁盤緩存的方式。

 

磁盤緩存指的是把磁盤中讀出的數據存儲到內存空間的方式。這樣,如果我們還需要讀取同一數據,就不需要通過實際的磁盤,直接從磁盤緩存中讀取數據。效果:大大改善磁盤數據的訪問速度。

 

 

這種把低速設備的數據保存在高速設備在,需要時直接將其從高速設備中讀出的方法也常用在Web瀏覽器中使用。Web瀏覽器通過網絡獲取遠程Web服務器的數據並將其顯示出來,因此遇到較大的文件時,就會卡掉,花費不少時間。於是Web瀏覽器就可以把獲取的數據暫時保存在磁盤中,再次打開網站時調用磁盤中的數據,實現將低速的網絡數據保存到相對高速的磁盤中。

 

同樣的,這種東西就可以解釋你電腦磁盤爲啥越來越小。很多軟件也用緩存的思想存儲數據,加速軟件體驗,但整體上電腦跑數據越來越慢。因此,安裝軟件時,能不裝C盤就不要裝C盤。(不信在「我的電腦上」搜TEMP,一大堆文件和文件夾/狗頭)

 

4、虛擬內存

 

虛擬內存指把磁盤的一部分作爲假想的內存來使用,與磁盤緩存(虛假的內存)相對,是虛假的內存。

 

藉助虛擬內存,在內存不足時也可以運行程序,如只剩下5M的內存時也可以運行10M的程序。不過,CPU依然只能執行加載到內存中的程序,所以,虛擬內存雖然是把磁盤作爲內存的一部分使用,但實際運行的程序部分必須存在在內存中,即爲了實現虛擬內存,必須把實際內存(真正的內存)上的內容和磁盤上的虛擬內存(虛假的內存)進行置換並同時運行程序

 

5、DLL文件

 

以上,說的都是合理利用甚至可以說是巧用內存的方式,但是卻不能從根本上解決內存過小而產生的問題。比如你一個8G的內存自然運行不了10G的程序吧。

 

一般來說,解決問題的方式有兩種,盡人事,聽天命。天命就是擴大內存,內存一大,啥都好說,就跟錢能解決的事都不叫事一樣。盡人事,則是儘量減少程序的大小。天命那是你有沒有錢買大內存的事,盡人事纔是計算機科學家該考慮的。

 

DLL文件,全名Dynamic Link Library文件,是在程序運行時可以動態加載Library(函數和數據的集合,就是調包)的文件。在windows操作系統中經常看到這些文件。(想起了以前看見想刪又不敢刪的我)

 

DLL文件有個特點,就是多個應用可以共有同一個DLL文件,從而節省內存使用。比如應用A和應用B都要運行相同的函數F,一般來說,同時運行這兩個應用,內存就要加載2次應用F,但是如果這個函數是獨立的DLL文件而不是執行文件EXE文件,那麼內存就只需要加載1次DLL文件就可以了。這樣一來,內存的利用效率就會高很多。

 

 

 

同樣的,DLL還有個優點,如果以後我要修改函數了,只需要升級DLL文件即可,而不同每個應用單獨升級。

 

簡單來說,就是模塊化思想,所有的代碼只出現一次,至於多次使用,調用就完事了。

 

6、_stdcall

 

這是C裏面減小程序文件的方法。

 

之前內存篇提到,內存中有棧儲存函數調用,用後進先出的方式達到正確調用。注意到,後進先出,這裏函數的調用指令終究要出棧,涉及到一個棧清理的問題。

 

內存篇:計算機|內存

 

在C裏面,調用函數後,會自動執行棧清理指令。棧清理處理定義上講,是把不需要的數據從「接收和傳遞函數的參數時使用的內存上的」棧區域中清理出去。這個部分是編譯器自動附加到程序中的。

 

在同一個程序中,同樣的函數可能會被反覆調用,這時棧清理的內容也是一樣的,就會導致這個函數在棧內反覆去世。而內存作爲刀斧手就會覺得好麻煩啊,爲了給函數和內存一個痛快,在函數前加上_stdcall就會讓這個默認的清理過程不進行,節省內存空間。(這裏節省的是多個清理過程的機器代碼,但是調用代碼還是不能節省的)

 

 

 

貼一下涉及到的之前的文章

CPU篇:計算機|程序&CPU

內存篇:計算機|內存

 


碼文不易,ballball關注了,給大家表演debug了

 

發佈了19 篇原創文章 · 獲贊 4 · 訪問量 2612
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章