32位操作系統,尋址空間為2^32次方個byte,注意存儲單位是字節byte
即物理內存為4GB
內存分布圖:
虛擬地址轉變成物理地址:
邏輯地址(段表,段偏移量)-> 線性地址(頁表)->物理地址
1. 每個進程的4G內存空間只是虛擬內存空間,每次訪問內存空間的某個地址,都需要把地址翻譯為實際物理內存地址
2. 所有進程共享同一物理內存,每個進程只把自己目前需要的虛擬內存空間映射並存儲到物理內存上。
3. 進程要知道哪些內存地址上的數據在物理內存上,哪些不在,還有在物理內存上的哪里,需要用頁表來記錄
4. 頁表的每一個表項分兩部分,第一部分記錄此頁是否在物理內存上,第二部分記錄物理內存頁的地址(如果在的話)
5. 當進程訪問某個虛擬地址,去看頁表,如果發現對應的數據不在物理內存中,則缺頁異常
6. 缺頁異常的處理過程,就是把進程需要的數據從磁盤上拷貝到物理內存中,如果內存已經滿了,沒有空地方了,那就找一個頁覆蓋,當然如果被覆蓋的頁曾經被修改過,需要將此頁寫回磁盤
(LRU置換頁面算法,將最近最少使用的頁面從內存回寫到磁盤)
共享內存
1)獲取共享內存地址:在內核態空間開辟內存空間,返回該內存區域的唯一標識
2)映射到進程地址空間:映射開辟的kernel空間到用戶態內存空間(虛擬內存)
3)操作空間: 操作用戶態的內存空間
4)關閉映射
5)刪除內核態內存空間