記憶體分段 記憶體分頁 虛擬記憶體

2021-10-07 17:24:57 字數 921 閱讀 3978

程式通過鏈結器,多個檔案合併成乙個最終可執行檔案。可執行程式載入後占用的記憶體空間應該是連續的,因為執行指令的時候,程式計數器是順序地一條一條指令執行下去。這也就意味著,這一條條指令需要連續地儲存在一起。

我們電腦肯定是要執行好多個程式的,在記憶體裡面肯定占用多個連續的分段,但是假如其中乙個程式退出,假如又來了乙個程式小於剩餘的空間,但是又沒有連續的空間可以放下,顯然這個程式無法執行。

舉個列子:假如記憶體100k,我已經執行了4個20k的程式,記憶體分配這樣:程式1(20k)、2(20k)、3(20k)、4(20k)、剩餘20k,程式3退出後,剩餘40k,但是剩餘2個20k連續的分段,如程式5是30k,顯然無法執行了,這就是記憶體碎片。

上面的問題是如何解決的?假如我們把程式4向前移動20k記憶體的距離,將會剩下一段40k的連續記憶體,程式5就可以執行了。 哈哈,這就是記憶體交換。

他是如何做的?先把程式4寫到硬碟上,然後硬碟上再寫到移動位置的記憶體上,我們都知道linux系統上有乙個swap記憶體交換區吧,它就幹這個的。

但是由於io效能的問題,比記憶體的讀寫慢好多倍,導致了機器的卡頓。

由於記憶體交換導致了機器的卡頓,如果我們把每次交換的容量減少吶,這樣效能將會有極大的提公升,於是我們把連續的記憶體進行分頁,分成許多個幾k的頁,提出交換速度。

我們把程式分成好多頁,並把分頁資訊,存放在虛擬記憶體中(硬碟上),通常分頁大小和物理記憶體分頁大小一樣,如果程式需要執行的**頁在記憶體中便會執行,如果不在會觸發缺頁,回到虛擬記憶體中找到缺頁,載入到記憶體去執行。設計乙個好的頁面置換演算法至關重要。

在linux下,我們通常只設定成4kb。

由於記憶體空間都是預先劃分好的,也就沒有了不能使用的碎片,而只有被釋放出來的很多4kb的頁。

理論上計算機可以執行無數的程式,並不受限於記憶體大小。通過記憶體分頁+虛擬記憶體+記憶體交換組合,我們最終得到了乙個讓程式不需要考慮實際的物理記憶體位址、大小和當前分配空間的解決方案。

記憶體分配 記憶體分段 記憶體分頁 虛擬記憶體

記憶體應容納作業系統和各種使用者程序,因此應該盡可能有效地分配記憶體。通常,我們需要將多個程序同時放在記憶體中。因此我們需要考慮,如何為輸入佇列中需要調入記憶體的程序分配記憶體空間。在採用連續記憶體分配時,每個程序位於乙個連續的記憶體區域,與包含下乙個程序的記憶體相連。1.最為簡單的記憶體分配方法之...

虛擬記憶體 分頁機制

1.2 分頁 1.3 頁表 1.4 加速分頁過程 1.5 針對大記憶體的頁表 虛擬記憶體的基本思想 每個程式都有自己的位址空間,這個空間被分割成多個塊,每乙個塊被稱作一頁或頁面。每一頁有連續的位址範圍。這些頁被對映到物理記憶體,但並不是所有的頁都必須在記憶體中才能執行程式。當程式引用到一部分在物理記...

記憶體管理 物理記憶體 虛擬記憶體

記憶體管理 物理記憶體 pc上有三條匯流排,分別是資料匯流排 位址匯流排和控制匯流排。32位的cpu的定址能力為4gb 2 32 個位元組。使用者最多 可以使用4gb的真實的物理記憶體。記憶體管理 虛擬記憶體 windows的所有程式 包括ring0層和ring3層的程式 可以操作的都是虛擬記憶體。...