從Linux分頁機制到Linux記憶體管理

2021-06-16 08:28:26 字數 2360 閱讀 6080

要理解linux記憶體管理子系統,先要熟悉一些概念

頁框, 頁幀:傳統上,把記憶體視為連續的位元組,即記憶體為位元組陣列,記憶體單元的編號(位址)可作為位元組陣列的索引。分頁管理時,將若干位元組視為一頁,比如4k bytes 此時,記憶體變成了連續的頁,即記憶體為頁陣列,每一頁物理記憶體叫頁幀,以頁為單位對記憶體進行編號,該編號可作為頁陣列的索引,又稱為頁幀號。頁幀和頁框是乙個東西,英文page frame。頁幀號表示物理記憶體的第幾頁, 頁框表示實實在在的物理記憶體頁。

內碎片, 外碎片:在記憶體管理中,內部碎片是已經被分配出去的的記憶體空間;外部碎片是指還沒有分配出去,但是由於大小太小而無法分配給申請空間的新程序的記憶體空間空閒塊。固定分割槽存在內部碎片,可變式分割槽分配會存在外部碎片;頁式虛擬儲存系統存在內部碎片;段式虛擬儲存系統,存在外部碎片。外部碎片:因為行程持續地被載入與置換,使得可用的記憶體空間被分割成許多不連續的區塊。雖然記憶體所剩空間總和足夠讓新行程執行,卻因為空間不連續,導致程式無法載入執行。內部碎片:發生在以固定長度分割區來進行配置的記憶體中當乙個程式載入到固定大小的分割區時,假如程式小於分割區,則剩餘的空間將無法被使用,稱為內部碎片。利用聚集或分頁可以消除外部碎片。這頁說明了分頁機制為什麼可以消除外碎片,而為什麼有內碎片。因為系統分頁都是以4kb的頁為單位進行分配的。

假設記憶體是連續分配的(也就是程式在物理記憶體上是連續的)

1.程序a進來,向os申請了200的記憶體空間,於是os把0~199分配給a

2.程序b進來,向os申請了5的記憶體空間,os把200~204分配給它

3.程序c進來,向os申請了100的記憶體空間,os把205~304分配給它

4.這個時候程序b執行完了,把200~204還給os

但是很長時間以後,只要系統中的出現的程序的大小》5的話,200~204這段空間都不會被分配出去(只要a和c不退出)。

過了一段更長的時間,記憶體中就會出現許許多多200~204這樣不能被利用的碎片……

而分頁機制讓程式可以在邏輯上連續、物理上離散。也就是說在一段連續的物理記憶體上,可能0~4(這個值取決於頁面的大小)屬於a,而5~9屬於b,10~14屬於c,從而保證任何乙個「記憶體片段」都可以被分配出去。

什麼是虛擬儲存:

虛擬儲存器的思想是程式、資料和堆疊的大小都有可能超過物理記憶體大小,由作業系統把當前使用的放在記憶體,而不需要的放在磁碟。而絕大部分作業系統使用的虛擬儲存器技術就是分頁技術。 在虛擬儲存器中,程式所產生的位址為虛擬位址,虛擬位址構成了虛擬位址空間。(當然了在沒有虛擬儲存器的系統上,程式產生的位址就是實體地址。其實程式並不知道,只是作業系統和處理器知道。下面都是按照使用虛擬儲存器的系統來說)這些虛擬位址通過mmu(記憶體管理單元)對映為實體地址,採用分頁機制的系統,虛擬位址空間以頁面為單位進行劃分,虛擬位址空間會被劃分成多個等大小的頁面。實體地址空間也按頁面為單位進行劃分每一塊成為頁幀,或者頁框。每一虛擬頁面可以隨意對應到物理頁框,也可以對應到磁碟的頁面檔案的上。分頁式管理可以給每個應用程式虛擬的分配4g的記憶體空間;程式執行時物理記憶體不足時可以將不常用的記憶體頁交換到硬碟上,當需要交換到硬碟上的頁時,會觸發處理器的中斷將硬碟上的頁讀到記憶體裡。

buddy演算法是用來做記憶體管理的經典演算法,目的是為了解決記憶體的外碎片。

避免外碎片的方法有兩種

1,利用分頁單元把一組非連續的空閒頁框對映到非連續的線性位址區間。

2. 開發適當的技術來記錄現存的空閒連續頁框塊的情況,以盡量避免為滿足對小塊的請求而把大塊的空閒塊進行分割。

核心選擇第二種避免方法

基於下面三種原因,核心選擇第二種避免方法:1,在某些情況下,連續的頁框確實必要。2,即使連續頁框的分配不是很必要,它在保持核心頁表不變方面所起的作用也是不容忽視的。假如修改頁表,則導致平均訪存次數增加,從而頻繁重新整理tlb。3,通過4m的頁可以訪問大塊連續的物理記憶體,相對於4k頁的使用,tlb未命中率降低,加快平均訪存速度。

buddy演算法將所有空閒頁框分組為10個塊鍊錶,每個塊鍊錶的每個塊元素分別包含1,2,4,8,16,32,64,128,256,512個連續的頁框,每個塊的第乙個頁框的實體地址是該塊大小的整數倍。如,大小為16個頁框的塊,其起始位址是16*2^12(乙個頁框的大小為4k,16個頁框的大小為16*4k,1k=1024=2的10次方,4k=2的12次方)的倍數。  例,假設要請求乙個128個頁框的塊,演算法先檢查128個頁框的鍊錶是否有空閒塊,如果沒有則查256個頁框的鍊錶,有則將256個頁框的塊**兩份,乙份使用,乙份插入128個頁框的鍊錶。如果還沒有,就查512個頁框的鍊錶,有的話就**為128,128,256,乙個128使用,剩餘兩個插入對應鍊錶。如果在512還沒查到,則返回出錯訊號。

**過程相反,核心試圖把大小為b的空閒夥伴合併為乙個大小為2b的單獨快,滿足以下條件的兩個塊稱為夥伴:1,兩個塊具有相同的大小,記做b;2,它們的實體地址是連續的,3,第乙個塊的第乙個頁框的實體地址是2*b*2^12的倍數,該演算法迭代,如果成功合併所釋放的塊,會試圖合併2b的塊來形成更大的塊。

linux分頁機制

在linux分頁機制中有幾個概念需要了解,線性位址,實體地址,頁目錄表,頁表,頁目錄項,頁表項。首先為了防止乙個程序非法跨越到另乙個程序或者乙個程序非法跨越到核心中,linux中使用了線性位址。線性位址是乙個程序執行過程中產生的位址,在32位的系統中其位址空間為0x00000000 0xffffff...

從Windows系統上拷貝檔案到Linux

方法一 使用xshell 簡單 用x shell 傳輸檔案 xshell是非常好用的工具,但是想在window與linux之間傳輸檔案。很簡單,就是在linux中安裝lrzsz,安裝即可使用。注 本機使用系統centos6.3 yum install lrzsz 在xshell輸入命令 rz。彈出對...

Linux的分頁機制

先前我們介紹段機制的時候說到,x86的段機制把程式的邏輯位址轉換成線性位址,這裡要講的分頁機制是把線性位址對映成實體地址,也就說說,x86其實是用了兩套機制把邏輯位址轉換成實體地址的。我們也提到linux核心是怎樣繞過段機制從而讓x86的分段機制看起來不起作用的,我們還說到這樣的處理造成了段的資料保...