天天看點

作業系統--記憶體學習筆記(2)程序記憶體管理--虛拟記憶體

虛拟記憶體(virtual memory) = CPU + MMU(Memory Management Unit), MMU是一個CPU上的元器件,它将實體位址映射為虛拟位址,這樣CPU可以之别虛拟位址,而不是實際實體位址了。使用MMU的好處有

1、同一個虛拟位址可以指向不同的實體位址;

2、線程之間共享記憶體變得簡單;

當處理器需要通路一塊不在記憶體中的資料數,會産生一個終端,程序處于阻塞狀态,資料載入後,阻塞狀态變為就緒狀态。

硬體及控制結構

Linux核心用struct page結構表示實體頁,flags域用來表示狀态,包括是不是髒的(修改未落地要實體記憶體)、是不是被鎖定等。_count域存放頁的引用計數。該資料結構的意義在于描述實體記憶體本身,而不是描述其中的資料。

作業系統--記憶體學習筆記(2)程式記憶體管理--虛拟記憶體

而硬體通過slab層管理配置設定和釋放資料結構(也有很多第三方工具例如tcmalloc取而代之),它扮演的資料結構緩存層的角色。

MMU實作方式

不同于上面提到的page和slab。MMU其實就是一張位址映射表,以32位位址為例,4G的記憶體大小,也頁表項為4KB(大部分作業系統中,記憶體配置設定的最小單元就是4KB),留下12bits做偏移量,10bits留給根頁表,10bits留給4KB頁表。但這種方法有一個緻命的缺陷,頁表的大小和虛拟位址空間的大小成正比。另一種實作方法是倒排頁表,下圖摘自《作業系統精髓于設計原理》,總的來說分頁和分段是虛拟記憶體技術的兩種方法。

作業系統--記憶體學習筆記(2)程式記憶體管理--虛拟記憶體

剛剛想到一個狠2的問題,MMU需要做這麼多映射,不會爆嗎?--當然不會,又不是每個位址都需要映射,隻需要映射位址頭部就可以了。

分頁表

分頁表用于記錄每頁中虛拟記憶體映射實際記憶體的資訊以及權限等,下圖相信會讓你一目了然

作業系統--記憶體學習筆記(2)程式記憶體管理--虛拟記憶體

是以,總的來說,虛拟記憶體就是一個查詢表,這個查詢表在CPU中實作。

作業系統軟體

  • 虛拟記憶體管理方案要求硬體和軟體的支援
    • 硬體:
      1. 虛拟位址動态換成實體位址
      2. 被通路到的頁不存在記憶體中時,産生一個中斷
    • 軟體:作業系統進行中斷中的響應,與之相關的問題有
      1. 讀取政策:請求時讀取或者預先讀取,使用蔟的方式一次讀取多頁;
      2. 放置政策:決定一個程序駐留的實際地方,對純粹的扥段系統有一些意義,對分頁系統無意義;
      3. 置換政策:當記憶體滿後,必須決定用哪些頁換哪些頁。大多數政策都基于過去的行為來預測将來的行為。基本算法有OPT(基于預見未來,隻存在理論上的可能)、LRU(開銷大,難以實作)、FIFO(FIFO政策實施起來簡單,但是性能差,因為經常推送錯誤==!)、時鐘(和FIIO唯一不同的是使用為為1的頁框會被跳過,同時需要參考是不是通路同時是否被修改來設定置換政策)。另外使用緩沖頁技術可以不必真正地将記憶體置換出去;
      4. 清除政策:結合緩沖頁技術,修改過的程序可以在置換的時候被放置到修改頁中,周期寫;
      5. 加載控制:關注任何給定的時刻,駐留在記憶體中的程序數目;

做了如上總結,部落客有個問題,程序加載時,所有記憶體都會被加載嗎?其實不是的,程序運作時,隻有被調用的記憶體才通過缺頁的方式放置到實體記憶體中,是以往往虛拟記憶體大大小要遠遠大于實際所用到的實體記憶體大小 。

繼續閱讀