爲何要提出虛擬內存:html
1)物理內存不夠:同時運行的進程太多,須要不少內存,在物理上擴展內存相對有限(內存條都很貴呀),因此提出一種從邏輯上來擴充內存的方法,叫作虛擬內存。算法
2)安全隱患:若是所有的進程都放在物理內存上,那麼進程訪問物理內存的時候極可能會修改到其它進程的內存,甚至修改到內核的內存,這種行爲很危險數組
每個進程都有一個大小一致的、私有的虛擬地址空間,這個地址空間是虛擬的,並不是實際存在的。32位CPU通常有32根地址總線,那麼就一共能夠尋232個地址=也就是4x1024x1024x1024=4G個地址,1個地址對應1字節的存儲單位,因此就是4GB,也就是說每一個進程都有獨立的4GB的虛擬地址空間。緩存
操做系統不是以字節爲單位管理內存的,而是以頁爲單位管理內存,一頁一般爲4KB。安全
1)虛擬地址空間劃分爲多個固定大小的虛擬頁(VP),虛擬頁放在磁盤上ide
2)物理內存被劃分爲多個固定大小的物理頁(PP),物理頁放在物理內存上性能
3)虛擬頁和物理頁的大小是同樣的操作系統
4)要明確的是:磁盤上數據必須先讀入到內存中才能被cpu處理翻譯
1)未映射(分配)的頁:虛擬頁還沒和磁盤文件確立對應關係3d
2)未緩存的頁:虛擬頁和磁盤文件創建了映射,可是磁盤文件尚未緩存到物理內存上
3)緩存的頁:虛擬頁映射到了磁盤文件,而且磁盤文件緩存到物理
頁表是一個數組,常期存放在物理內存中,裏面有各虛擬頁的狀態,是否映射,是否緩存。頁表中每個元素叫作頁表條目PTE。
1)數組的下標,表示虛擬頁號(圖中0、7)
2)數組的元素由一個有效位和一個地址字段組成:
有效位爲0,表示未緩存的頁;有效位爲1,表示緩存的頁
地址字段爲null,表示未映射的頁;爲非null,表示物理頁號或者磁盤地址,未緩存則爲磁盤地址,緩存了則爲物理頁號
進程執行時,CPU訪問虛擬地址時,會有如下狀況:
1)頁命中(CPU訪問圖中的VP2)
CPU把虛擬地址VP2送給MMU(內存管理單元)進行地址翻譯(由虛擬地址獲得物理地址的這一整個過程):首先獲得頁表中PTE2的地址,而後讀取PTE2的內容,有效位爲1,表示VP2是緩存的,再根據地址字段內容得到PP1的物理地址,而後CPU就去訪問這個物理地址,得到了數據
2)缺頁(CPU訪問VP3)
用來選出犧牲頁的算法
選擇之後進程將永不使用的虛擬頁做爲犧牲頁,此算法沒法實現,通常用來評價其餘算法。
淘汰最先緩存在內存中的虛擬頁,實現簡單,性能差,由於顯然不科學,人家最先進入內存不表明人家不被進程常常訪問。
淘汰進程最近一段時間內最長時間未訪問過的虛擬頁,性能好,開銷大;每一個頁都有一個字段,來記錄上次被訪問以來所經歷的時間,頁以鏈表的形式維護,最近最多使用的頁在表頭,最少使用的在表尾,因此每次訪問了內存都要更新這個鏈表,因此開銷大;當發生缺頁時,表尾的頁爲犧牲頁
又稱爲最近未使用算法,性能接近LRU,開銷更小,把全部頁都保存在一個相似時鐘的環形鏈表中,每頁都有一個使用位R,有一個時鐘指針開始時指向最先進入內存的虛擬頁;
1)當某一虛擬頁首次裝入內存,使用位R設爲1;
2)當發生缺頁時,檢查時鐘指針指向的頁的使用位R,R=0則該頁爲犧牲頁,R=1則對改使用位R清0並將指針指向下一位直到找到R=0的頁爲止
1)地址翻譯必須很是快
2)頁表可能會在內存中佔用不少空間
1)TLB(Translation Lookaside Buffer)是一個小的、虛擬尋址的緩存,存着少許虛擬頁和物理頁的對應關係
2)MMU在進行地址翻譯時,先去TLB中匹配,若是TLB中存在,則MMU不用訪問頁表就能獲得翻譯結果
3)若是TLB中不存在,則MMU再去訪問頁表完成翻譯;接着還會再TLB中淘汰一個表項,而後用新找到的頁表條目PTE替代它,這樣若是這一虛擬頁很快再次被訪問時,就能夠從TLB中快速匹配到
4)其實TLB技術就是抓住了進程的這麼一個特色:進程老是對少許的虛擬頁進行屢次的訪問,也就是說這些虛擬頁的頁表條目PTE會被反覆讀取
1)一級頁表在面對巨大的虛擬地址空間時,將會有不少PTE,會佔有較多內存,因此引入多級頁表機制:只有頂級頁表長期在內存中,其他級頁表只有在須要時存在,部分低級還可能存在於磁盤上
2)圖a表示該32位操做系統虛擬尋址採用二級頁表機制,Offset爲12位,則虛擬頁的大小爲4KB,若是採用一級頁表機制則在內存中須要220個PTE來對應
3)若是這是一個須要12MB內存的進程,底端是4MB的正文段,其上面是4MB的數據段,頂端是4MB的棧,中間4GB-12MB是空閒,採用二級頁表機制,頂級頁表有210=1024個PTE,其中PTE0、PTE一、PTE1023分別對應正文段、數據段、棧,其他PTE將不會用到
4)頂級頁表的一個PTE對應一張二級頁表,空的PTE將不產生二級頁表,因此就有3張二級頁表,每張二級頁表都有210=1024個PTE
5)因此在二級頁表機制下內存中一共有210+210x3=212個PTE,相較與以前的220個PTE來將,大大減小