虛擬記憶體管理總結
***作業系統為每乙個程序維護著乙個虛擬的位址空間,這個位址空間的大小通常取決於系統的位址線數目,比如在32位系統中,虛擬位址空間的返回就是0×00000000~0xffffffff,大小共4g。通常作業系統會劃分出一部分來專門供核心使用,而不允許使用者程序直接訪問。linux核心占用4g中高位址的1g,即0xc0000000~0xffffffff,windows核心通常占用高位址的2g空間,但也可配置成1g。程序的**、資料以及共享庫等資源終究是要放在物理記憶體中才能被訪問的,作業系統在建立使用者程序時,會為其建立各自獨立的虛擬位址空間,然後將各自的資料段、**段、bss段等對映到這個位址空間,並為其初始化堆、棧等必須的資源。另外,作業系統還將虛擬空間和物理空間都劃分成大小相等的頁,把程序資料所在虛擬位址空間的各個虛擬頁面對映到其真正被載入的物理頁面,這種對映是全相聯方式的,即任何乙個虛頁可以被對映到任何乙個實頁。
作業系統採用虛擬記憶體的方式管理儲存器有很多好處:
第一,虛擬記憶體管理可以控制物理記憶體的訪問許可權。物理記憶體本身是不限制訪問的,任何位址都可以讀寫,而作業系統要求不同的頁面具有不同的訪問許可權,這是利用cpu模式和mmu的記憶體保護機制實現的。例如,**段被唯讀保護起來,防止被錯誤的指令意外改寫,核心位址空間也被保護起來,防止在使用者模式下執行錯誤的指令意外改寫核心資料。這樣,執行錯誤指令或惡意**的破壞能力受到了限制,頂多使當前程序因段錯誤終止,而不會影響整個系統的穩定性。
第二,虛擬記憶體管理最主要的作用是讓每個程序有獨立的位址空間。所謂獨立的位址空間是指,不同程序中的同乙個va被mmu對映到不同的pa,並且在某乙個程序中訪問任何位址都不可能訪問到另外乙個程序的資料,這樣使得任何乙個程序由於執行錯誤指令或惡意**導致的非法記憶體訪問都不會意外改寫其它程序的資料,不會影響其它程序的執行,從而保證整個系統的穩定性。另一方面,每個程序都認為自己獨佔整個虛擬位址空間,這樣鏈結器和載入器的實現會比較容易,不必考慮各程序的位址範圍是否衝突。
第三,方便了共享庫的實現。採用共享庫的目的在於節省記憶體(物理記憶體),一些公用模組在記憶體中可以只儲存乙份,讓各程序共享,而不是各自載入乙份,當然,唯讀的**段可以共享,可寫的資料段就必須各自保留乙份了。採用虛擬記憶體機制後,可以將物理記憶體中所載入的共享庫分別對映到程序各自的位址空間,由於載入位址可能不同,所以共享庫必須實現為位址無關碼(pic)。
第三,va到pa的對映會給分配和釋放記憶體帶來方便,實體地址不連續的幾塊記憶體可以對映成虛擬位址連續的一塊記憶體。比如要用malloc分配一塊很大的記憶體空間,雖然有足夠多的空閒物理記憶體,卻沒有足夠大的連續空閒記憶體,這時就可以分配多個不連續的物理頁面而對映到連續的虛擬位址範圍。
第四,「增加」了程式可以使用的記憶體空間。乙個系統如果同時執行著很多程序,為各程序分配的記憶體之和可能會大於實際可用的物理記憶體,虛擬記憶體管理使得這種情況下各程序仍然能夠正常執行。因為各程序分配的只不過是虛擬記憶體的頁面,這些頁面的資料可以對映到物理頁面,也可以臨時儲存到磁碟上而不占用物理頁面。當所訪問的頁面不在記憶體中時再將其載入進來,無空閒頁面的時候還可能需要採取一定的置換演算法將某個頁面換出。這種機制的可行性得益於偉大的「區域性性原理」。
虛擬記憶體管理
定義 虛擬記憶體是計算機系統記憶體管理的一種技術。它使得應用程式認為它擁有連續的可用的記憶體 乙個連續完整的位址空間 而實際上,它通常是被分隔成多個物理記憶體碎片,還有部分暫時儲存在外部磁碟儲存器上,在需要時進行資料交換。我的理解 程序例項在使用者態並不直接操作物理記憶體位址,實際物理記憶體是可能是...
總結 虛擬記憶體
本文件為面試精華版,如果是初學者,建議從專欄學習 作業系統專欄 這個在我們平時使用電腦特別是windows 系統的時候太常見了。很多時候我們使用點開了很多佔記憶體的軟體,這些軟體占用的記憶體可能已經遠遠超出了我們電腦本身具有的物理記憶體。為什麼可以這樣呢?正是因為虛擬記憶體的存在,通過虛擬記憶體可以...
3 2 虛擬記憶體管理
3.2.1 虛擬記憶體的基本概念 1 傳統儲存管理方式的特徵 各種記憶體管理策略都是為了同時將多個程序保證在記憶體中以便允許多道程式設計。它們都具有以下兩個共同的特徵 1 一次性 作業必須一次性全部裝入記憶體後,方能開始執行。這會導致兩種情況發生 當作業很大,不能全部被裝入記憶體時,將使該作業無法執...