虚拟内存的作用是什么 虚拟内存有什么用

系统中的进程与其他进程共享CPU和主存 。 首先进程多需要的内存也多 , 其次内存易被破坏 , 如进程A不小心写入进程B使用的内存 。 为更有效管理内存且少出错 , 系统提供对主存的抽象概念叫虚拟内存 。 虚拟内存是硬件异常、硬件地址翻译、主存、磁盘文件和内核的完美交互 , 为每个进程提供大的、一致的和私有的地址空间 , 虚拟内存提供三个重要能力:
使用主存更有效率:用 DRAM 作为部分的虚拟地址空间的缓存
简化内存管理:每个进程都有统一的线性地址空间
隔离地址空间:进程间不会相互影响;用户程序不能访问内核信息和代码
1 地址空间物理地址通常应用在“简单”的嵌入式微控制器中(汽车、电梯等) , 内存管理较简单 , 但现代计算机 , 包括其他智能设备如笔记本电脑、智能手机等 , 需要较复杂的内存管理机制 , 因此虚拟地址必不可少 , 它是计算机科学中最伟大的ideas之一 。

虚拟内存的作用是什么  虚拟内存有什么用

文章插图

虚拟内存的作用是什么  虚拟内存有什么用

文章插图

2 虚拟内存作为缓存工具概念上来说 , 虚拟内存就是存储在磁盘上的 N 个连续字节的数组 。 磁盘上数组的内容被缓存在物理内存上(DRAM缓存)) , 其中的每个缓存块(cache block)就称为页(page) , 如下图所示:
虚拟内存的作用是什么  虚拟内存有什么用

文章插图

任何时刻 , 虚拟页都可分为三个部分:
未分配的:VM系统还未分配或创建的页 , 不占用任何磁盘空间
缓存的:已缓存在主存中的已分配的页
未缓存的:未缓存在物理内存中的已分配页
具体看上图:0和3未分配 , 1、4、6被缓存在物理内存 , 2、5、7被分配但未缓存在主存
2.1 DRAM缓存组织和之前的 cache memory类似 , 将访问速度快的作为访问速度慢的缓存 , 利用DRAM比磁盘快一万倍 , 将磁盘数据尽量缓存在DRAM中(同样DRAM比SRAM慢10倍 , 也可将SRAM作为缓存) , 所以需尽可能从 DRAM中拿数据 。 为此需要:
更大的页尺寸(page size):通常是 4KB , Linux”huge pages”是2M到1G
全相联(Fully associative):每一个虚拟页(virual page)可以放在任意的物理页(physical page)中 , 映射函数很复杂 , 不同于缓存 , 无法在硬件中实现 , 置换算法较昂贵
通常使用 Write-back 而非 Write-through 机制
Write-through: 命中后更新缓存 , 同时写入到内存中
Write-back: 直到这个缓存需要被置换出去 , 才写入到内存(需dirty bit表示缓存中数据是否和内存中相同 , 因为可能某时刻内存中对应地址的数据已更新 , 重复写入就会导致原有数据丢失)
2.2 页表页表是一个元素为页表项(PTE, page table entry)的数组 , 页表项把虚拟页映射到物理页上 。 PTE由1个有效位和n个地址字段组成 。 在 DRAM 中 , 每个进程都有自己的页表 , 具体如下:
虚拟内存的作用是什么  虚拟内存有什么用

文章插图

2.2.1 页命中访问的虚拟地址的页在DRAM缓存中 , 则叫页命中 , 命中时由于在 DRAM 中有对应的数据 , 可直接访问 。 不命中时 , 由于DRAM中没有对应数据 , 所以需从磁盘复制到DRAM中 , 具体为:
MMU触发 Page fault异常
将模式升级为内核模式
调用软件页面错误处理程序
Page fault handler选择DRAM中要被置换的page , 并把数据从磁盘复制到DRAM中 , 复制的等待时间称为demand paging
重新执行访问指令 , 这时候就会是page hit
2.2.2 处理页错误