虛擬內存

2021-12-31 紅客突擊隊

收錄於話題 #深入理解計算機系統 10個

紅客突擊隊

虛擬內存前言

繼續閱讀《深入理解計算機系統》這本經典書籍
本節是第九章
虛擬內存

虛擬內存為每個進程提供一個大的、一致的、私有的地址空間

將主存看成一個存儲在磁碟上的地址空間的高速緩存

為每個進程提供一致的地址空間

保護每個進程的地址空間不被其他進程破壞

1、物理和虛擬尋址

物理尋址是CPU訪問內存最自然的方式

現在都是用虛擬尋址
內存管理單元(MMU)利用存放在主存中的查詢表動態翻譯虛擬地址
主要有以下幾點考慮

2、地址空間

地址空間:非負整數地址的有序集合
線性地址空間:整數連續
虛擬地址空間:CPU從一個N=2^n個地址的地址空間中生成虛擬地址
物理地址空間:對應物理內存的M個字節

3、虛擬內存作為緩存的工具

虛擬內存就是存儲在磁碟上的 N 個連續字節的數組
這個數組的部分內容,會緩存在 DRAM 中
在 DRAM 中的每個緩存塊(cache block)就稱為頁(page)

類似緩存,我們需要儘可能從DRAM讀取數據:

更大的頁尺寸(page size):通常是 4KB,有的時候可以達到 4MB

全相聯(Fully associative):每一個虛擬頁(virual page)可以放在任意的物理頁(physical page)中,沒有限制。

映射函數非常複雜,所以沒有辦法用硬體實現,通常使用 Write-back 而非 Write-through 機制

做法:頁表


那查詢時

看起來效率似乎不高
但局部性原則使得程序趨向於在一個較小的活動頁面集合上工作

4、虛擬內存作為內存管理的工具

如前所說
每個進程都有自己的虛擬地址空間
映射如下

一個好處是
如果兩個進程間有共享的數據,那麼直接指向同一個物理頁即可
且有以下幾點

5、虛擬內存作為內存保護的工具

頁表中的每個條目的高位部分是表示權限的位
MMU 可以通過檢查這些位來進行權限控制(讀、寫、執行)

6、地址翻譯

一些符號

一個例子

通過虛擬地址找到頁表(page table)中對應的條目

檢查有效位(valid bit),是否需要觸發頁錯誤(page fault)

然後根據頁表中的物理頁編號(physical page number)找到內存中的對應地址

最後把虛擬頁偏移(virtual page offset)和前面的實際地址拼起來,就是最終的物理地址了


如果是命中


如果是缺頁


想要更快
直接在 MMU 進行一部分的工作
有了Translation Lookaside Buffer(TLB)
VPN + VPO 就是虛擬地址
分成三部分,分別用於匹配標籤、確定集合
如果 TLB 中有對應的記錄,那麼直接返回對應頁表項(PTE)即可
如果沒有的話,就要從緩存/內存中獲取,並更新 TLB 的對應集合

多級頁表
因為往往虛擬地址的位數比物理內存的位數要大得多
所以保存頁表項(PTE) 所需要的空間也是一個問題
故採用多級頁表

7、動態內存分配

動態內存分配器會管理一個虛擬內存區域,稱為堆(heap)
分配器以塊為單位來維護堆,可以進行分配或釋放
有兩種類型的分配器:

關於malloc和free的調用

分配器有以下限制

在這些約束下,分配器試圖實現吞吐率最大化和內存使用率最大化
造成堆利用率低的主要原因是碎片 of course

8、垃圾收集

垃圾收集器

一種動態內存分配器

自動釋放程序不再需要的已分配塊

將內存視為一張有向可達圖,釋放不可達節點

9、內存相關錯誤

1、間接引用壞指針
一個例子如下

錯誤的寫為

2、讀未初始化的內存

3、允許棧緩衝區溢出

必須用fgets函數限制輸入串的大小

4、假設指針和他們指向的對象大小相同

5、錯位錯誤

6、引用指針而不是它所指的對象

7、誤解指針運算

8、引用不存在的變量

9、引用空閒堆塊中的數據

10、內存洩漏

結語

主要了解虛擬內存是怎麼一回事兒
它的一些功能與作用
略過了動態內存分配的一些詳細操作

相關焦點

  • 虛擬內存精粹
    導言 虛擬內存是當今計算機系統中最重要的抽象概念之一,它的提出是為了更加有效地管理內存並且降低內存出錯的概率。虛擬內存影響著計算機的方方面面,包括硬體設計、文件系統、共享對象和進程/線程調度等等,每一個致力於編寫高效且出錯概率低的程序的程式設計師都應該深入學習虛擬內存。
  • 虛擬內存怎麼設置最好?Win10系統虛擬內存設置圖文教程
    今天我們給大家來說一說虛擬內存。很多人可能對這個虛擬內存不太清楚,虛擬內存簡單說來就是當電腦的物理內存不夠時,會調用虛擬內存來充當內存使用,使我們電腦能夠正常運轉,對個別軟體也會起到一定的輔助作用。今天我們來簡單說說怎麼設置它。       一般來說,系統自動分配的虛擬內存比較少,所以建議自行設置虛擬內存。
  • 內存足夠大,是否還需要設置虛擬內存?
    這種情況下,很多人就有疑問了,如果我的電腦內存足夠大,還需要設置虛擬內存嗎?也有人對於系統虛擬內存設置多少合適有所疑問。下面,快啟動帶大家來了解一下虛擬內存的相關知識。 首先,我們來了解一下什麼是虛擬內存。
  • Win7電腦提示虛擬內存不足怎麼辦?Win7電腦虛擬內存不足解決方法
    我們在使用電腦的過程中,難免會遇到大大小小的問題,比如打開某個軟體或者遊戲之後,出現了電腦虛擬內存不足的問題,那麼Win7電腦提示虛擬內存不足怎麼辦?下面裝機之家分享一下Win7電腦虛擬內存不足解決方法,具體解決方法如下,來看看吧!
  • Linux添加SWAP 交換內存虛擬內存的方法
    LinuxSWAP交換內存/虛擬內存的方法。有些人會問了,這個教程有什麼用,現在內存一般都是4G起步。我想說,如果你需求用不到4G,你用1G內存就夠,看了我的教程,你可能去找一個512MB的。這樣會性價比更高,又能達到原有的目的。豈不是美滋滋?什麼是SWAP?
  • 為什麼 Linux 作業系統需要虛擬內存?
    memory)都是稀缺資源,所有運行在當前作業系統的進程會共享系統中的 CPU 和內存資源,作業系統會使用 CPU 調度器分配 CPU 時間[^1]並引入虛擬內存系統以管理物理內存,本文會分析作業系統為什麼需要虛擬內存。
  • 電腦-虛擬內存設置多少合適?
    電腦在運行時,偶爾會出現提示「虛擬內存不足,請增加你的虛擬內存」信息,虛擬內存是什麼?怎樣增大虛擬內存?下面我就給大家說一下如何設置!
  • win7虛擬內存怎麼設置最好?
    虛擬內存可以彌補系統內存的不足,相當於把硬碟的一部分空間拿來當內存用。
  • 虛擬內存是什麼?有什麼用?
    那麼良許就和大家來討論下計算機的內存如果不夠用了, 虛擬內存技術的應用,虛擬內存的出現,讓機器內存不夠的情況得到部分解決,大家需要注意的是有些資料也將虛擬內存稱之為交換內存。1.討論虛擬內存前的熱身我們需要知道的是計算機對內存分為物理內存與虛擬內存(注意虛擬內存和虛擬地址空間的區別)。物理內存就是計算機的實際內存大小,由 RAM 晶片組成的。虛擬內存則是虛擬出來的、使用磁碟代替內存。2.
  • 《關於電腦內存過小增大虛擬內存的解決方案》
    【解決方案】電腦在使用過程中,若打開的文件過多,可能會由於你的電腦原來設置的虛擬內存過小,而造成死機,或者電腦會彈出你的電腦『虛擬內存過小
  • win10系統如何設置虛擬內存,看這裡!
    當我們的電腦安裝了win10系統之後,下載了各式各樣的軟體,玩大型遊戲的時候有時候會出現內存不足,這時候我們可以使用虛擬內存,虛擬內存他可以彌補我們系統自身內存不足,就約等於把硬碟中的一部分空間拿過來當內存使用,那我們要怎麼設置win10系統的虛擬內存呢?今天小編就給大家分享一下設置步驟。
  • 如何正確設置虛擬內存,提高電腦運行速度
    虛擬內存又叫虛擬存儲器(Virtual Memory)。
  • 巧妙使用Windows虛擬內存功能,0成本讓你的系統性能火速提升
    虛擬內存是為了彌補物理內存的不足,可以使你的處理器交互數據更快,不僅是WIN10需要虛擬內存,所有的系統幾乎都需要虛擬內存。由於硬碟的空間很大,所以微軟Windows作業系統就將後備「倉庫」的地址選在硬碟上,這個後備「倉庫」就是虛擬內存。在默認情況下,虛擬內存是以名為Pagefile.sys的交換文件保存在硬碟的系統分區中,默認在C盤。三、 如何查看電腦端的虛擬內存信息1、按住Win+R組合快捷鍵,調出運行窗口,輸入CMD命令。
  • vmstat:一個標準的報告虛擬內存統計工具
    RAM 代表「隨機訪問內存Random Access Memory」,是一種計算機數據存儲,它會存儲經常使用的程序來提升系統性能。什麼是虛擬內存?虛擬內存是一種內存管理方式,計算機通過臨時將最近未使用的程序數據從 RAM 轉移到硬碟,以平衡或管理內存的短缺。什麼是 vmstat?
  • iOS Memory 內存詳解:從作業系統內存管理、iOS 系統內存到app 內存管理
    虛擬內存最大的意義就是保護了進程的地址空間,使得進程之間不能夠越權進行互相地幹擾。對於每個進程來說,作業系統通過虛擬內存進行"欺騙",進程只能夠操作被分配的虛擬內存的部分。與此同時,進程可見的虛擬內存是一個連續的地址空間,這樣也方便了程式設計師對內存進行管理。
  • Linux 內存管理初探
    段的基地址(Base Address):在線性地址空間中段的起始地址段的界限(Limit):在虛擬地址空間中,段內可以使用的最大偏移量2) 分段實現但這種方法不支持 x86 架構, 只支持 ARM, PowerPC 等非 x86 架構在 start_kernel 中 mem_init 函數之前調用 alloc_boot_mem 函數預分配大塊內存, 需要重新編譯內核vmalloc 函數,內核代碼使用它來分配在虛擬內存中連續但在物理內存中不一定連續的內存5、夥伴系統——反碎片機制
  • Linux kernel內存管理的基本概念
    但MMU使能之後、Kernel的內存管理機制ready之前,Kernel看到的是虛擬地址,此時需要一些簡單且有效的機制,建立虛擬內存到物理內存的映射(可以是部分的映射,但要能夠滿足kenrel此時的需要)。⬛ 管理內存看到內存之後,下一步就是將它們管理起來。
  • 一文搞定 Linux 共享內存原理
    ,這是因為不同進程相同的虛擬內存地址會映射到不同的物理內存地址上。參數 shmaddr 是要關聯的虛擬內存地址,如果傳入0,表示由系統自動選擇合適的虛擬內存地址。參數 shmflg 若指定了 SHM_RDONLY 位,則以只讀方式連接此段,否則以讀寫方式連接此段。函數調用成功返回一個可用的指針(虛擬內存地址),出錯返回-1。3. 取消關聯共享內存當一個進程不需要共享內存的時候,就需要取消共享內存與虛擬內存地址的關聯。
  • JVM內存管理-垃圾回收與內存分配
    缺點:效率低,標記清除後會產生大量不連續的內存,可能會導致以後程序程序運行過程中需要分配較大對象時,無法找到足夠的連續內存而不得不提前觸發另一次垃圾收集動作。它將可用內存按容量劃分為大小相等的兩塊,每次只使用其中的一塊。當這一塊的內存用完了,就將還存活著的對象複製到另外一塊上面,然後再把已使用過的內存空間一次清理掉。
  • 一文搞定:Linux 共享內存原理
    ,這是因為不同進程相同的虛擬內存地址會映射到不同的物理內存地址上。參數 shmaddr 是要關聯的虛擬內存地址,如果傳入0,表示由系統自動選擇合適的虛擬內存地址。參數 shmflg 若指定了 SHM_RDONLY 位,則以只讀方式連接此段,否則以讀寫方式連接此段。函數調用成功返回一個可用的指針(虛擬內存地址),出錯返回-1。3. 取消關聯共享內存當一個進程不需要共享內存的時候,就需要取消共享內存與虛擬內存地址的關聯。