虛擬存儲器

爲了更加有效地管理存儲器並且少出錯,現在系統提供了一種對主存的出想概念,叫做虛擬存儲器。虛擬存儲器是硬件異常、硬件地址翻譯、主存、磁盤文件和內核文件的完美交互。它爲每個進程提供了一個大的、一致的、私有地址空間,通過一個很清晰的機制,虛擬存儲器提供了三個重要的能力:它將主存看成是一個存儲在磁盤上的地址空間的高速緩存,在主存中只保存活動區域,並根據需要在磁盤和主存之間來回傳送數據,通過這種方式,它高效地使用了主存;它爲每個進程提供了一致的地址空間,從而簡化了存儲器管理理;;它保護了每個進程的地址空間不被其他進程破壞。


概念上而言,虛擬存儲器被組織爲一個由存放在磁盤上的N個連續的字節大小的單元組成的數組。每字節都有一個惟一的虛擬地址,這個惟一的虛擬地址是作爲到數組的索引的。磁盤上數組的內容被存放在主存中。和存儲器層次結構中其他緩存一樣,磁盤(較低層)上的數據被分割成塊,這些塊作爲磁盤和主存(較高層)之間的傳輸單元,VM系統通過將虛擬存儲器分割爲成爲虛擬頁(virtual page VP)的大小固定的塊,來處理這個問題。每個虛擬頁的到小爲P字節,類似的,物理存儲器也被分割爲物理頁,大小也爲P字節。


虛擬頁面的集合都分爲三個不相交的子集:

1.未分配的:VM系統還未分配(或者創建)的頁。未分配的塊沒有任何數據和它們相關聯,因此也就不佔用任何磁盤空間

2.緩存的:當前緩存在物理存儲器中的已分配頁

3.未緩存的:沒有緩存在物理存儲器中的已分配頁




頁表

同任何緩存一樣,虛擬存儲器系統必須有某種方法判斷一個虛擬頁是否存放在DRAM中的某個地方。如果是,系統還必須確定這個虛擬頁存放在哪個物理頁中。如果不命中,系統必須判斷這個虛擬頁存放在磁盤的哪個位置,在物理存儲器中選擇一個犧牲頁,並將虛擬頁從磁盤中拷貝到DRAM中,替換這個犧牲頁

這些功能是由許多軟硬件聯合提供的,包括:操作系統軟件,MMU(存儲器管理單元)中的地址翻譯硬件,和一個存放在物理存儲器中叫做頁表(page table)的數據結構。頁表將虛擬頁映射到物理頁。每次地址翻譯硬件將一個虛擬地址轉換爲物理地址時,都會讀取頁表,操作系統負責維護頁表的內容。以及在磁盤與DRAM之間來回傳送頁

頁命中


Linux系統爲每個進程維持了一個單獨的虛擬地址空間

簡化鏈接       獨立的地址空間允許每個進程爲它的存儲器映像使用相同的基本格式,而不管代碼和數據實際存放在物理存儲器的何處

簡化共享       獨立地址空間爲操作系統提供了一個管理用戶進程和操作系統自身之間共享的一致機制。

簡化存儲器分配      虛擬存儲器爲向用戶進程提供一個簡單的分配額外存儲器的機制

簡化加載       虛擬存儲器也使加載可執行文件和已共享目標文件到存儲器更容易



動態存儲器分配

雖然可以使用mmap與munmap函數來創建和刪除虛擬存儲器的區域,但是大多數C程序還是會在運行時需要額外虛擬存儲器時,使用一種動態存儲器分配器

顯式分配器:要求應用顯式地釋放任何已分配的塊   malloc free

隱式分配器:要求分配器檢測何時一個已分配塊不再被程序使用,然後就釋放這個塊。隱式分配器也叫做垃圾收集器。例如Java等高級語言中的實現



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章