1. 程式人生 > >計算機操作系統(八)---虛擬存儲器

計算機操作系統(八)---虛擬存儲器

block 啟動 align 學習 單位 執行 需要 自由 auto

分頁存儲管理的基本概念

技術分享圖片

圖一

技術分享圖片

圖二

在開始學習的時候一直困惑在虛擬存儲器到底作用是什麽,為什麽要這樣子設計,後來看到了後面的工作流程才明白了為什麽需要這樣子設計.


可以這樣子理解虛擬存儲器作用,就以電腦啟動為例,我的win7 安裝在C盤,準確點時位於硬盤,當我開機的時候,CPU 肯定是調用我硬盤裏的程序去執行(系統安裝在硬盤),那麽但是有個問題,就是我的主存相對於硬盤,存儲的空間很小,這意味著有兩個問題(當然還有其他問題) :

  • 我很冗長的程序加載一部分在主存中執行完後,再一次加載一點點.
  • 同時由於傳輸給CPU的是硬盤上的邏輯地址,我要是把程序放到了主存,意味著地址空間肯定不一樣了.

第一個問題可以很明顯對程序管理的問題,就出現了分頁管理,又操作系統去完成,不再交由程序員完成.自由映射接下來的程序,加載進去的單位稱為一頁.第二問題,可以由頁表實現解決,操作系統為每個進程分配一個頁表,進程執行的程序可以來自不同的頁,也就意味著頁表中對應的的頁可以是不連續的.頁表可以映射邏輯地址空間到物理地址空間.

每個進程的數據都來自於主存,那麽每次的調用會花費時間,有沒有像cache 一樣的東西,不用每次都訪問內存呢?

有,TLB(Translation Lookaside Buffer).將進程中需要常用到的表記錄在TLB中,下次要去主存訪問某個的數據時就像從TLB中找.我們在看看我們要執行的程序到底是怎麽樣的(即虛擬地址空間)?見圖五,我們形成頁時候,是不管這一層放什麽,那一層放什麽,直接把整個程序大小除以一個頁大小就可以得到一共多少頁了,得到的頁再全部加載到主存中.有沒有按照虛擬地址空間各層次放的東西,分層就行加載的呢?

有,就是另外一種虛擬存儲器的實現方式 : 分段式, 即是安裝虛擬空間內程序的類型進行加載,當然分層加載同樣會有一個像頁表一樣的映射表,這個映射叫段表.但是分段式也有缺點:

  • 產生碎片
  • 儲存空間不好管理

虛擬存儲器的另外一種實現方式 : 段頁式, 就是把分頁式 和分段式結合起來,先按各層次分段在分頁,由於分兩次就細化,就會那麽映射表應該就會有兩個,即是說段頁式需要兩級定位處理.詳細的細節見下.


計算機操作系統(八)---虛擬存儲器