虛擬儲存器(virtual memory)

2021-10-22 16:20:38 字數 2503 閱讀 7283

許多年以前,當人們還在使用dos或是更古老的作業系統的時候,計算機的記憶體還非常小,一般都是以k為單位進行計算,相應的,當時的程式規模也不大,所以記憶體容量雖然小,但還是可以容納當時的程式。但隨著圖形介面的興起還有使用者需求的不斷增大,應用程式的規模也隨之膨脹起來,終於乙個難題在程式設計師的面前,那就是應用程式太大以至於記憶體容納不下該程式,通常解決的辦法是把程式分割成許多稱為覆蓋塊(overlay)的片段。

覆蓋塊0首先執行,結束時它將呼叫另乙個覆蓋塊。雖然覆蓋塊的交換是由os完成的,但是必須先由程式設計師把程式先進行分割,這是乙個費時費力的工作,而且相當枯燥。人們必須找到更好的辦法從根本上解決這個問題。不久人們找到了乙個辦法,這就是虛擬儲存器(virtual memory)。虛擬儲存器的基本思想是程式,資料,堆疊的總的大小可以超過物理儲存器的大小,作業系統把當前使用的部分保留在記憶體中,而把其他未被使用的部分儲存在磁碟上。

比如對乙個16mb的程式和乙個記憶體只有4mb的機器,作業系統通過選擇,可以決定各個時刻將哪4m的內容保留在記憶體中,並在需要時在記憶體和磁碟間交換程式片段,這樣就可以把這個16m的程式執行在乙個只具有4m記憶體機器上了。而這個16m的程式在執行前不必由程式設計師進行分割。

處理器從快取中取資料,如果快取沒命中,處理器從主存中取資料。如果主存也沒命中,處理器就先要把需要的資料從磁碟中搬運到主存中,再從主存中取資料。如何判斷資料是否在主存中,我們需要頁表和段來告訴我們資料是否在主存中。

當所訪問的資訊不在主存時,則由作業系統而不是程式設計師來安排i/o指令,把資訊從輔存調入主存。從效果上來看,好像為使用者提供了乙個儲存容量比實際主存大得多的儲存器,使用者無需考慮所程式設計序在主存中是否放得下或放在什麼位置等問題,所以稱這種儲存器為虛擬儲存器。

虛擬儲存器只是乙個容量非常大的儲存器的邏輯模型,不是任何實際的物理儲存器。它借助於磁碟等輔助儲存器來擴大主存容量,使之為更大或更多的程式所使用。虛擬儲存器指的是主存-外存層次,它以透明的方式為使用者提供了乙個比實際主存空間大得多的程式位址空間。

類似於cache與主存之間的位址對映會存在乙個叫做「塊」的位址對映單位,頁式虛擬儲存器也有乙個叫做「頁」的位址對映單位。

頁式虛擬儲存器的位址結構:

主存的位址結構:

由於頁的大小的對應的,所以需要處理的就是虛頁號和實頁號的對映關係即可,而處理這種對映關係就需要用到一張叫做「頁表」的表中,頁表中存放的是實頁號裝入位(用來判斷虛擬位址所指向的資料是在主存中還是輔存中,1表示在主存中,0表示在輔存中),如果虛擬位址指向的資料是在主存中,就可以直接把頁表中的實頁號和頁內位址拼接一下得到乙個主存的位址,再到主存中訪問這塊資料即可;如果虛擬位址指向的資料不在主存當中,就需要作業系統把資料從輔存調到主存中,之後再進行如上操作。

那麼如何根據虛頁號找到實頁號在頁表中的位址呢?

硬體部分會有乙個頁表基址暫存器,暫存器中存放的是頁表起始位址,這個起始位址跟虛頁號拼接就會得到乙個頁表位址,這個頁表位址指向的是虛頁號所對應的實頁號在頁表中的位址

(注:這裡需要注意,頁表是存放在主存當中的,所以頁表位址也是主存位址,實頁號+業內位址也是主存位址,而虛擬位址在主存當中是不存在的,只是用來完成主存位址的對映。)

段式虛擬儲存器的對映單位叫「段」

段和頁的區別在於:頁的大小是固定的,主存和虛存都被分成大小相同的頁,而段的大小是不固定的,所以主存和虛存不需要被拆分成大小相等的單位,而是看實際對映到的這一段大小是多少,就在主存劃分這一段大小的空間來儲存資料。

對映的方式於頁表一致:

慢表與快表的關係類似於主存與cache的關係。

標記:虛頁號

頁框號:實頁號

虛擬儲存器

1 虛擬儲存器只是乙個容量非常大的儲存器的邏輯模型,不是任何實際的物理儲存器 2 它借助於磁碟等輔存來擴大主存的容量,使之為更大或更多的程式使用 3 程式的邏輯位址稱為虛擬位址 虛位址 程式的邏輯位址空間稱為虛擬位址空間 4 實體地址 實位址 由cpu位址引腳送出,是用於訪問主存的位址 5 設cpu...

虛擬儲存器

在系統中程序是與其它的程序共享cpu和主存資源的,程序太多就需要太多的儲存器,而且儲存器很容易受到破壞,如果某個程序不小心寫了另乙個程序使用的儲存器,它就會以 完全和程式邏輯無關的令人迷惑的方式失敗。位址空間。特點 1.主存看成是虛擬在磁碟上的位址空間 的快取記憶體,在主存裡只儲存活動區域。2.為每...

虛擬儲存器

1 常規儲存器管理方式的特徵 一次性 即作業在執行前需一次性地全部裝入記憶體。這會導致兩種情況的發生 當作業很大,所要求的記憶體空間超過了記憶體總容量,作業不能全部被裝入記憶體,致使該作業無法執行。在多道程式中,有多個作業要求執行,但由於記憶體容量不足以容納所有這些作業,只能將少數作業裝入記憶體讓它...