1. 程式人生 > >五、虛擬記憶體

五、虛擬記憶體

虛擬記憶體

起因:程式規模的增長速度遠遠大於儲存器容量的增長速度。

理想中的儲存器:容量更大、速度更快、價格更便宜的非易失性儲存器 。

實際中的儲存器:


對於記憶體的非易失性儲存還做不到。

計算機系統時常出現記憶體空間不夠用:

覆蓋(overlay):應用程式手動把需要的指令和資料儲存在記憶體中,只把需要的指令和資料儲存在記憶體中。

交換(swapping):作業系統自動把暫時不能執行的程式儲存到外存中,把整個程式匯入匯出開銷太大

虛擬儲存:在有限容量的記憶體中,以頁為單位自動裝入更多更大的程式。

覆蓋技術:

目標:在較小的可用記憶體中執行較大的程式,常用於多道程式系統,與分割槽儲存管理配合使用。    背景:早期,DOS,硬體只有640kb的記憶體,軟體幾十k,大的上兆。

方法:依據程式邏輯結構,將程式劃分為若干功能相對獨立的模組;將不會同時執行的模組共享同一塊記憶體區域

  • 必要部分(常用功能)的程式碼和資料常駐記憶體
  • 可選部分(不常用功能)放在其他程式模組中,只在需要用到時裝入記憶體

  • 不存在呼叫關係的模組可相互覆蓋,共用同一塊記憶體區域


B和C不會同時執行,不具有呼叫關係,分在一個區。同理D、E和F也一樣。

缺點:1.增加程式設計困難:需程式設計師劃分功能模組,並確定模組間的覆蓋關係,增加了程式設計的複雜度;

          2.增加執行時間,從外存裝入覆蓋模組,時間換空間

交換技術:

背景:UNIX,讓OS管理而不是程式設計師管理,以執行的程式為單位。

目標:多道程式在記憶體中時,讓正在執行的程式或需要執行的程式有更多的記憶體資源。

方法:可將暫時不能執行的程式送到外存以獲得空閒記憶體空間,作業系統在記憶體管理單元MMU幫助下把一個程序的整個地址空間的內容儲存到外存中(換出swap out),而將外存中的某個程序的地址空間讀入到記憶體中(換入swap in)。其大小為整個程式的地址空間(比較大,幾十幾百個頁,開銷大)。


何時交換? 

硬碟操作很慢,一動系統就要等,所以要當記憶體空間確實不夠,或者有不夠的危險時換出

交換區的大小? 

極端下是記憶體中只留一個程式,其餘都在交換區。交換區必須夠大以存放所有使用者程序的所有記憶體映像的拷貝;必須能對這些記憶體映像直接存取

程式換入時重定位:再次換入的記憶體地址一定要在原來位置上嗎? 

不一定,可能已被佔用,,實體地址變化了,要正確定址,需要動態地址對映,建立好頁表,虛擬地址一樣,實體地址不一樣。

覆蓋、交換的比較: 目標一樣,使得大的程式或者更多的程式跑在有限的空間內。採取技術不一樣

  • 覆蓋是發生在一個執行中的程式內部沒有呼叫關係的模組之間,代價是程式設計師手動指定和劃分邏輯覆蓋結構;
  • 交換髮生在記憶體中程式與管理程式或OS之間,以程序作為交換的單位,需要把程序的整個地址空間都換進換出,對程式設計師是透明的,減輕程式設計師負擔,開銷相對較大。

虛擬記憶體:

目標:

  • 像覆蓋技術那樣,不是把程式的所有內容都放在記憶體中,因而能夠執行比當前的空閒記憶體空間還要大的程式,但做的更好,由作業系統來完成,無需程式設計師干涉。
  • 像交換技術那樣,能夠實現程序在記憶體和外村之間的交換,因而獲得更多的空閒記憶體空間,但做的更好,只對程序的部分內容在記憶體與外存之間進行交換。

程式的區域性性原理(principle of locality):指程式在執行過程的一個較短時期,所執行的指令的地址,指令的運算元地址,分別侷限於一定區域。表現為:

  • 時間區域性性:一條指令的一次執行和下次執行,一個數據的一次訪問和下次訪問都在較短時間內;
  • 空間區域性性:當前指令和鄰近的幾條指令,當前訪問的資料和鄰近的幾個資料都集中在一個較小區域內。

程式的區域性性原理表明,從理論上虛擬儲存技術是能夠實現的。

eg:

程式設計對缺頁率的影響: 一個二維陣列a[i][j],C預設的先行後列排列法,每一行放在一個頁面中。 

for(j=0;j<1024;j++){
   for(i=0;i<1024;i++){
        a[i][j]=0;
    }
 }
乙是i在外迴圈,j在內迴圈。頁面大小4k,分配給每個程序的物理頁面數為1. 

甲方法產生1024*1024次缺頁中斷;乙方法則僅1024次。

注意:一頁是4K。

虛存技術:可以在頁式或者段式記憶體管理的基礎上實現

  • 在裝入程式時,不必將其全部裝入記憶體中,只把當前需要執行的部分頁或段裝入記憶體,就可以開始執行; 
  • 在程式執行的過程中,如果需要執行的指令或資料不在記憶體上時(缺頁、缺段異常),由處理器通知作業系統,若有空餘空間則將相應的頁面或段調入記憶體,繼續執行; 
  • 另一方面,os將記憶體中暫時不用的頁、段調出記憶體儲存在外存上以騰出空閒空間存放將要裝入的程式以及將要調入的頁面或段。
虛存技術基本特徵:
  • 大的使用者空間:記憶體可以小,硬碟必須足夠。提供給使用者的虛擬空間=實體記憶體+硬碟。
  • 部分交換:swap in /swap out 是對部分虛擬地址空間進行的
  • 不連續:實體記憶體分配的不連續,虛擬空間使用的不連續(某些資料被換出,OS解決內外存)

虛擬技術——虛擬頁式記憶體管理


  • 大部分虛擬儲存系統多采用虛擬頁式儲存管理技術,即在頁式儲存管理的基礎上,增加了請求調頁和頁面置換功能
  • 基本思路:當一個使用者程式要調入記憶體執行時,不是將該程式的所有頁面都裝入記憶體,只裝入部分頁面即可啟動程式。在執行程式的過程中,如果要發現要執行的程式和資料不在記憶體即頁表某項invalid,則會丟擲異常,向系統發出缺頁中斷請求,OS根據產生異常的地址找到對應在外存中的頁面調入,使得繼續執行。

頁表表項:

  • 駐留位:表示該頁是在記憶體還是外存,為1,該頁在記憶體;0,在外存,如果訪問該頁表項,會導致缺頁中斷;
  • 保護位:表示允許對該頁做何種型別的訪問,如只讀,可讀寫,可執行;
  • 修改位:表示此頁在記憶體中是否被修改過。當系統回收物理頁面時據此決定是不是把內容寫回外存;修改位的使用提高置換功能的效率。
  • 訪問位:如果該頁被訪問過(讀、寫)設1,用於頁面置換演算法。儘量置換沒有被訪問的頁。

缺頁異常(缺頁中斷)的處理流程:


在何處儲存未被對映的頁? 

  • 能簡單地識別在二級儲存器中的頁;
  • 交換空間(磁碟/檔案):特殊格式,用於儲存未被對映的頁面

後備儲存(backing store),二級儲存 

  • 資料:一個虛擬地址空間的頁面可以被對映到一個(在二級儲存中)檔案的某個位置; 
  • 程式碼段:對映到可執行二進位制檔案; 
  • 動態載入的共享庫程式段:對映到動態呼叫的庫檔案 
  • 其他段:(動態產生的資料,是沒與檔案直接對應的記憶體內容→硬碟上專門開一個區swap file)可能被對映到交換檔案(swap file)

虛擬記憶體效能 

開銷決定於p,當p小時開銷小,所以程式必須有區域性性特點




相關推薦

虛擬記憶體

虛擬記憶體起因:程式規模的增長速度遠遠大於儲存器容量的增長速度。理想中的儲存器:容量更大、速度更快、價格更便宜的非易失性儲存器 。實際中的儲存器:對於記憶體的非易失性儲存還做不到。計算機系統時常出現記憶

淺析實體記憶體虛擬記憶體和程序的地址空間

   ●在一個系統中,程序是和其他程序共享CPU和主存資源。但是共享資源會造成一些不可避免的問題,例如由於儲存器不夠而         程序無法執行,亦或是儲存器被外來的惡意程序破壞等。 早期的記憶體管理機制:  分派方式

實體記憶體虛擬記憶體交換區不同角度的理解

2011年12月01日 10:41:56 amyeric 閱讀數:3615 標籤: windowslinuxos彙編磁碟程式設計 更多 個人分類: 作業系統 1、應用中的概念。 實體記憶體,在應用中,自然是顧名思義,物理上,真實的插在板子上的記憶體是多大就是多大

記憶體虛擬記憶體的佈局

       記憶體是計算機中重要的部件之一,它是與CPU進行溝通的橋樑。計算機中所有程式的執行都是在記憶體中進行的,因此記憶體的效能對計算機的影響非常大。記憶體(Memory)也被稱為記憶體儲器,其作用是用於暫時存放CPU中的運算資料,以及與硬碟等外部儲存器交換的資料。只要

【java】記憶體對映檔案虛擬記憶體RandomAccessFile類

Windows提供了3種進行記憶體管理的方法:  • 虛擬記憶體,最適合用來管理大型物件或結構陣列。  • 記憶體對映檔案,最適合用來管理大型資料流(通常來自檔案)以及在單個計算機上執行的多個程序之間共享資料。  • 記憶體堆疊,最適合用來管理大量的小物件。 1.什麼是

實體地址虛擬地址邏輯地址線性地址虛擬記憶體

1.實體地址 用於記憶體晶片級的單元定址,與處理器和CPU連線的地址匯流排相對應。 在實地址模式(因為真實模式沒有分段或分頁機制,Cpu不進行自動地址轉換)下,程式設計師操作的就是實體地址,所謂的實

程序虛擬記憶體概念與擴充套件

程序 作業系統程序相關概念 關鍵名詞 process:一個正在執行程式的例項,包括程式計數器、暫存器、變數的當前值。 critical region:對共享記憶體進行訪問的程式片段 semaphore:可以同時操作共享記憶體的數目 mutex:兩

作業系統的記憶體分頁管理虛擬記憶體介紹

今天這篇關於作業系統的方面的技術文章,我們繼續為各位朋友們講解關於作業系統的記憶體方面的內容。今天 我們主要為各位朋友們講解記憶體分頁管理、虛擬記憶體介紹。傳統儲存管理方式的特徵上一節所討論的各種記憶體管理策略都是為了同時將多個程序儲存在記憶體中以便允許多道程式設計。它們都

虛擬記憶體 頁面置換

現代需要執行的程式往往大到記憶體無法容納,而且必須能夠支援多個程式同時執行,及時記憶體可以滿足其中一個單獨的程式的要求,但總體來看仍然超出了記憶體大小。而交換技術由於磁碟速度的限制,也不是一個非常好的方法。 在早起計算時代(20世紀60年代)採用的方法:把程式分割成許多片段

關於Class物件類載入機制虛擬機器執行時記憶體佈局的全面解析和推測

簡介: 本文是對Java的類載入機制,Class物件,反射原理等相關概念的理解、驗證和Java虛擬機器中記憶體佈局的一些推測。本文重點講述瞭如何理解Class物件以及Class物件的作用。 歡迎探討,如有錯誤敬請指正 如需轉載,請註明出處 http://www.cnblogs.com/nul

Java記憶體區域(堆區虛擬機器棧本地方法棧程式計數器和方法區)和GC機制

目錄 Java垃圾回收概況 Java記憶體區域 Java物件的訪問方式 Java記憶體分配機制 Java GC機制 垃圾收集器 Java垃圾回收概況   Java GC(Garbage Collection,垃圾收集,垃圾回收)機制,是Java與C

℃江的觀後感 -- Java 虛擬機器的方法區直接記憶體和執行時常量池

方法區 我們知道方法區,當然是和方法有關,Java虛擬機器的作用就兩個,儲存、運算。其實我們叫其方法區,說明和儲存東西有關,但是存什麼呢?這塊儲存的是虛擬機器載入的類資訊,常亮,靜態變數和有個就是即使編譯後的程式碼等資料。方法區一般在hotspot被稱為永久代

python學習筆記:記憶體管理

變數和記憶體管理的 細節, 包括: 變數無須事先宣告 變數無須指定型別 程式設計師不用關心記憶體管理 變數名會被“回收” del 語句能夠直接釋放資源 1、變數定義 變數只有被建立和賦值後才能被使用 2、動態型別 還要注意一點,Python 中不但變數名無需事

C++虛擬函式虛繼承物件記憶體模型

虛擬函式的工作原理      虛擬函式的實現要求物件攜帶額外的資訊,這些資訊用於在執行時確定該物件應該呼叫哪一個虛擬函式。典型情況下,這一資訊具有一種被稱為 vptr(virtual table pointer,虛擬函式表指標)的指標的形式。vptr 指向一個被稱為 vtb

Windows虛擬記憶體的使用(

 VirtualQuery的使用 VirtualQuery函式可以查詢本程序地址空間中記憶體區域的詳細情況(區域大小,區域內容等資訊) 函式原型:DWORD VirtualQuery(LPVOID lpAddress,PMEMORY_BASIC_INFORMATION

《Windows核心程式設計》筆記-虛擬記憶體記憶體

1、 32位系統支援的最大地址空間4GB(2^32),為何是4GB而不是4Gb呢?因為最小儲存單元是Byte(這個是由系統決定,有些系統可能不一樣)。 由上可知:記憶體條容量大於4GB時,32位系統可能會浪費記憶體。記憶體條小於4GB時,32位系統支援的最大定址空間由記憶體

linux記憶體管理---實體地址線性地址虛擬地址邏輯地址之間的轉換

CPU的頁式記憶體管理單元,負責把一個線性地址,最終翻譯為一個實體地址。從管理和效率的角度出發,線性地址被分為以固定長度為單位的組,稱為頁(page),例如一個32位的機器,線性地址最大可為4G,可以用4KB為一個頁來劃分,這頁,整個線性地址就被劃分為一個tatol_page[2^20]的大陣列,共有2的20

3作業系統記憶體管理——段頁式(虛擬記憶體

注:參考哈工大李治軍老師公開課。本小節需要之前分段與分頁為基礎 對使用者而言,分段是對記憶體的有效使用;而對於計算機而言,分頁可以提高記憶體的使用效率。作業系統需要滿足兩個方面的需求,所以就採取了段頁相結合的方式來管理記憶體。 對於使用者而言,當用戶發出一個邏輯地址,

java-記憶體管理(程式計數器虛擬機器棧本地方法棧方法區)和常量池

java記憶體管理 1. 執行時資料區域 Java虛擬機器在執行Java程式的過程中會把它所管理的記憶體劃分為若干個不同的資料區域。這些區域都有各自的用途,建立以及銷燬時間,有的區域隨著虛擬機器程序的啟動而存在,有些區域則是依賴使用者執行緒的啟動和結

JVM(2)——HotSpot虛擬機器:物件建立物件記憶體佈局物件的訪問定位

物件的建立 步驟1:檢查。虛擬機器遇到一條new指令時,首先將去檢查這個指令的引數是否能在常量池中定位到一個類的符號引用,並且檢查這個符號引用代表的類是否已被載入、解析和初始化過。如果沒有,那必須先執行相應的類載入過程。 步驟2:分記憶體。在類載入檢查通過後