《程序是怎樣跑起來的》讀書筆記——第五章 內存和磁盤的親密關系


1 不讀入內存就無法運行

計算機中主要的存儲部件是內存和磁盤。磁盤中存儲的程序,必 須要加載到內存后才能運行。負責解析和運行程序內容的 CPU,需要通過內部程序計數器來指定內存地址,然后才能讀出程序。

2 磁盤緩存加快了磁盤訪問速度

磁盤緩存指的是把從磁盤中讀出的數據存儲 到內存空間中的方式。這樣一來,當接下來需要讀取同一數據時,就 不用通過實際的磁盤,而是從磁盤緩存中把內容讀出。使用磁盤緩存 可以大大改善磁盤數據的訪問速度(圖 5-2)。

3 虛擬內存把磁盤作為部分內存來使用

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

通過借助虛擬內存,在內存不足時也可以運行程序。例如,在只 剩下 5MB 內存空間的情況下也能運行 10MB 大小的程序。不過,就如 本章開頭所講述的那樣,CPU 只能執行加載到內存中的程序。虛擬內 存雖說是把磁盤作為內存的一部分來使用,但實際上正在運行的程序 部分,在這個時間點上是必須存在在內存中的。也就是說,為了實現 虛擬內存,就必須把實際內存(也可稱為物理內存)的內容,和磁盤上 的虛擬內存的內容進行部分置換(swap),並同時運行程序。

虛擬內存的方法有分頁式和分段式兩種。

Windows采用的是分頁式。該方式是指, 在不考慮程序構造的情況下,把運行的程序按照一定大小的頁(page) 進行分割,並以頁為單位在內存和磁盤間進行置換。
在分頁式中,我 們把磁盤的內容讀出到內存稱為 Page In,把內存的內容寫入磁盤稱為 Page Out

4 節約內存的編程方法

通過借助磁盤虛擬內存就可以解決內存不足的問題。而虛擬內存也確實能避免因內存不足導致的應用無法啟動。 不過,由於使用虛擬內存時發生的 Page In 和 Page Out 往往伴隨着低速的磁盤訪問,因此在這個過程中應用的運行會變得遲鈍起來。

為了從根本上解決內存不足的問題,需要增加內存的容量,或者 盡量把運行的應用文件變小。

把應用文件變 小的編程方法

(1) 通過 DLL 文件實現函數共有

DLL(Dynamic Link Library)文件 ,顧名思義,是在程序運行時可 以動態加載 Library(函數和數據的集合)的文件。此外,還有一個需要 大家注意的地方,那就是多個應用可以共有同一個 DLL 文件。而通過 共有同一個 DLL 文件則可以達到節約內存的效果。


Windows 的操作系統本身也是多個 DLL 文件的集合體。像這樣,之所以要利用多個 DLL 文件,其中一個原因 就是可以節約內存。

(2) 通過調用 _stdcall 來減小程序文件的大小

_stdcall 是 standard call(標准調用)的略稱。

C 語言中,在調用函數后,需要執行棧清理處理指令。 棧清理處理是指,把不需要的數據從接收和傳遞函數的參數時使用的內存 上的棧區域中清理出去。該命令不是程序記述的,而是在程序編譯 時由編譯器自動附加到程序中的。編譯器默認將該處理附加在函數 調用方。



棧清理處理,比起在函數調用方進行,在反復被調用的函數一方進 行時,程序整體要小一些。這時所使用的就是 _stdcall。在函數前加上 _stdcall,就可以把棧清理處理變為在被調用函數一方進行。把代碼清單 5-1 中的 int MyFunc(int a, int b) 部分轉成 int _stdcall MyFunc(int a, int b) 進行再編譯后,和代碼清單 5-2 中 add esp, 8 同樣的處理就會在函數 MyFunc() 一方執行。

5 磁盤的物理結構

磁盤是通過把其物理表面划分成多個空間來使用的。划分的方式 有 扇區方式可變長方式兩種,前者是指將磁盤划分為固定長度的空 間,后者則是指把磁盤划分為長度可變的空間。

扇區方式中,把磁盤 表面分成若干個同心圓的空間就是 磁道 ,把磁道按照固定大小(能存儲 的數據長度相同)划分而成的空間就是 扇區(圖 5-8)。

扇區是對磁盤進行物理讀寫的最小單位。一般 1 個扇區是 512 字節。Windows 在邏輯方面(軟件方面)對 磁盤進行讀寫的單位是扇區整數倍 。根據磁盤容量的不同,1 簇可以 是 512 字節(1 簇 = 1 扇區)、1KB(1 簇 = 2 扇區)、2KB、4KB、8KB、 16KB、32KB(1 簇 = 64 扇區)。所有的文件都會占用 1 簇的整 數倍的磁盤空間。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM