頁式記憶體管理和寫時拷貝技術

2021-08-10 18:04:05 字數 1920 閱讀 6635

1、 交換的記憶體管理可以解決外部碎片的問題,把程式「倒」在磁碟上,再在記憶體上找到更大的空間將程式「倒」進來。磁碟操作耗時,就會影響效率。

2、 交換所能帶來的空間增長有限,單一程式不能超過物理記憶體空間。

那麼解決的方法?

追其根源,每個程式的大小是不一樣的,這樣記憶體分配空間時就會存在不一致。 只要將虛擬記憶體和物理記憶體都分成大小一樣的部分,我們稱為「頁」,只要按頁進行記憶體分配,就不會出現外部碎片。

程式增長有限是因為乙個程式要全部載入到記憶體中去,才會執行。那麼怎麼解決呢?那不需將所有程式都載入到記憶體,也可以用分頁解決,只將當前需要的頁存放在記憶體中,其他的頁存放在磁碟中,這樣乙個程式占有記憶體和磁碟,空間增長大大增加。分頁後,如果需要更多的空間,那麼就在記憶體中再開闢乙個新頁。不用再在磁碟上倒來倒去了,提高效率。

分頁記憶體管理:

剛才說了交換記憶體管理的缺陷和解決方法「分頁」,分頁

記憶體管理的核心就是把虛擬記憶體和物理記憶體劃分成大小相同的頁面,比如4kb,16kb,32kb,並以頁面作為最小分配單位。物理空間是頁面的整數倍,而且空間分配以頁面為單位,不會出現外部碎片。

同時,乙個虛擬頁面可以存放在任何乙個物理頁面上,空間增長容易解決,可以再分配乙個虛擬頁面存放在另乙個物理頁面上。

乙個程式的虛擬位址由兩部分組成:

頁面號 頁內偏移值

對於32位定址的系統,頁面大小位4kb,頁面號佔20位,頁內偏移值佔12位。

那麼虛擬頁面如何到物理頁面呢?

首先分離虛擬位址中的頁號。32為位中提取出20位。

然後判斷頁表是否有效,是否在記憶體中,是否是作業系統的。

注意:虛擬空間為它的定址空間。

但是一般的程式不可能將這個空間裝滿,在內部有的空間是空的,如果去訪問這部分的空間就是非法的。100k有25個頁,不存在第26個虛擬頁面,但是如果試圖訪問,那麼就是錯誤的。

mmu接收cpu傳送的虛擬位址,並翻譯成實體地址給記憶體。

mmu對虛擬位址的翻譯只是將虛擬頁面號翻譯成物理頁面號,對偏移值不進行任何操作。

mmu是如何查詢呢?通過查頁表,每個程式mmu都為其儲存了乙個頁表,即虛擬頁面到物理頁面的對映。

在頁表中記錄更多的狀態,可以知道乙個頁面是否有效,是否被保護,是否在物理記憶體中。

那麼如何查詢呢?

程式載入過程:

乙個頁面大小為4k

寫時拷貝技術:

建立fork之後,父程序會建立出乙個子程序,這個子程序作為父程序的副本。

可是每次fork出的子程序會將父程序的所有資料都拷貝給自己嗎?

哎呀,子程序就會抱怨了,人家也不完全是爹二代啊,怎麼事事都跟我爹有關,那我娶得媳婦,也不能是我爹的啊,哈哈!!

嗯,我們之前說父子程序不會共享各種資料段,全域性變數區、堆區、棧區。

但是子程序拷貝父程序的資料是這樣的:

只有唯讀許可權,沒有修改的許可權。

如果子程序只是對父程序進行讀取操作,那麼子程序用的就是父程序的資料,因為它們是淺拷貝,指向的是同乙個檔案指標。

那麼如果子程序修改父程序的資料呢?在修改前,子程序只拷貝出需要修改的資料,進行修改,這樣滿足父子程序資料不共享。

修改資料之後:

寫時拷貝技術

cow技術初窺 在linux程式中,fork 會產生乙個和父程序完全相同的子程序,但子程序在此後多會exec系統呼叫,出於效率考慮,linux中引入了 寫時複製 技術,也就是只有程序空間的各段的內容要發生變化時,才會將父程序的內容複製乙份給子程序。那麼子程序的物理空間沒有 怎麼去取指令執行exec系...

寫時拷貝技術

寫時拷貝故名思意 是在寫的時候 即改變字串的時候 才會真正的開闢空間拷貝 深拷貝 如果只是對資料的讀時,只會對資料進行淺拷貝 寫時拷貝技術是通過 引用計數 實現的,在分配空間的時候多分配4個位元組,用來記錄有多少個指標指向塊空間,當有新的指標指向這塊空間時,引用計數加一,當要釋放這塊空間時,引用計數...

寫時拷貝技術

寫時拷貝的主要思想是在複製原來實體的時候,如果複製後的實體不需要進行改變,那麼實際上沒必要進行實體內容的拷貝,只需建立乙個引用指向原來的物理記憶體,直接應用原來的實體內容即可,只有當需要對複製後的實體進行修改的時候才進行內容的拷貝。寫時拷貝技術在很多方面都有應用,典型的有 c 中的寫時拷貝技術 li...