01|虚拟内存:为什么可用内存会远超物理内存?
物理内存
- 深入了解
- 翻译
- 解释
- 总结
虚拟内存是计算机系统中的重要概念,通过将物理内存和磁盘空间结合起来,使得可用内存远超过物理内存的大小。虚拟内存的运行原理基于程序的局部性原理,使得每个进程实际需要的物理内存很少。虚拟内存的实现原理是通过将虚拟地址映射到物理地址,实现了内存地址空间的隔离和扩展。了解虚拟内存的原理有助于程序员更好地理解计算机底层知识,提高对内存相关错误的分析能力。页面映射的过程由CPU的内存管理单元自动完成,但依赖于操作系统设置的页表。页面的换入换出涉及页面换入换出的调度问题,需要精心设计页面的调度算法。 虚拟内存是软硬件一体化设计的典型代表,解决了直接操作物理内存的系统无法支持多进程的问题。其核心特点包括每个进程有自己的页表,实现了进程间地址空间的隔离,以及PTE中的标记属性比特提供更好的内存访问安全性。此外,虚拟内存还充分利用CPU提供的机制完成重要任务,如fork借用写保护实现写时复制。X86架构的CPU将这种工作模式称为保护模式,与实模式形成对比。Linux操作系统为每个进程在/proc目录下创建一个目录,通过查看该目录下的文件可以了解进程的内存使用情况。 总之,虚拟内存在计算机系统中扮演着重要角色,为多进程环境下的内存管理提供了解决方案,同时也为程序员提供了更深入的底层知识理解和错误分析能力。
《编程高手必学的内存知识》,新⼈⾸单¥59
全部留言(56)
- 最新
- 精选
- niucheng后面的面试题目中,服务程序内部使用的数据存储格式,尽可能使用数组类型、或者压缩列表这类内存紧凑的数据结构,因为数组对CPU告诉缓存支持更友好,缓存命中率会更高,这样会提高数据访问速度?如果使用链式或者树形的数据结构来存储数据,会不会更容易触发缺页中断?
作者回复: 不能一概而论哈。数据结构的时间复杂度的损失不是缺页中断能够弥补的。举个例子,使用二叉搜索树查找数据,假设数据总量是1’000’000,时间复杂度是O(log n),所以查找的效率是平均20次查找。但数组从0开始向后找,时间复杂度是O(n),所以查找次数的平均值是500'000。虽然二叉树大概率每次访问子结点都会出现缓存不命中的情况,但这种损失与时间复杂度的优势相比,完全微不足道。所以讨论缓存应该是在算法和数据结构已经做到最优的情况下,再去扣它。而不是为了缓存命中而使用更差的数据结构。
2021-11-07221 - 郑童文请问老师,每个进程的页表是保存在操作系统所占的内存地址空间还是该进程自己的地址空间?进程切换将对页表产生什么影响?关于每个进程的堆和栈的起始和终止地址又是保存在哪儿的呢? 谢谢!
作者回复: 你思考得非常深入! 1. 所有进程的页表都是关键数据,只有内核才有权限修改,所以页表都是存在内核空间的。每个进程的管理结构里(也在内核空间)都会记录自己的页表。 2. 进程切换时会把目标进程的页表起始地址送进cr3寄存器,这样目标进程页表就可以起作用了。显然这个也只能在内核里才能做。 3. 我们后面的课程会详细地回答这个问题。
2021-10-27521 - 压根就是咯为什么虚拟内存远超物理内存,却能正常映射存储,没太看懂?
作者回复: 举一个形象点的例子:你把物理内存页看成酒店房间,把虚拟内存页看成旅客。虽然旅客人数远多于酒店房间,但是因为旅客不是同一天入住。所以我们就可以通过调度来实现旅客和房间的动态映射了。从外界看起来,就是酒店用了100个房间在100天里满足了一万个旅客入住。
2021-11-02219 - MetMan海老师,请教既然有虚拟内存机制,为何程序仍然可能出现out of memory运行错误,是因为物理内存不够了,但能利用局部性原理在物理内存中只放入一定数据不超出限制吗
作者回复: 因为虚拟地址也有耗尽的可能呀。物理内存不够了,可以把不活跃页面往磁盘的swap区域放,但swap区域也有不够用的可能,这就是物理内存耗尽的情况。3G的用户空间,一次性要申请4G的空间,虚拟地址就不够用了。所以说,虚拟地址只是编织了一个很大地址的假象,其物理空间该耗尽的还是会耗尽。所以要记住不管什么时候,能释放的内存尽量释放总是一个好习惯。
2021-10-269 - dog_brother老师好,每个进程都有页目录表和页表,每个 CPU 都有一个页目录基址寄存器。我的问题是,页目录基址寄存器可以保存多少个页目录基址呀?
作者回复: 是的。每个进程都有自己的页表。进程有自己的进程控制块,这是一个结构体,它里面记录了进程的页目录表的地址。当进程切换的时候,就会把目标进程的页目录表送到cr3寄存器。所以在任一时刻,只有一个进程页表是活跃的。
2021-12-038 - 牧野<无论一个进程占用的内存资源有多大,在任一时刻,它需要的物理内存都是很少的> 这句话没看懂,进程程序本身不就在内存中吗
作者回复: 不是,程序是按需加载的。尚未用到的和已经用不到了的,就会被换出去。虚拟内存可以帮你做出一个假象:你感觉虚拟内存空间随时可以访问,但真实数据可能不在物理内存里,你需要的时候才重新做虚拟内存到物理内存的映射。
2021-10-2626 - Linuxer有两个问题请教: 1. 不同进程页表起始地址存哪呢? 2. 一个物理页面分配给了一个进程,另一个进程怎么掌握这个信息呢?
作者回复: 1. 每个进程都有一个管理结构,在linux中就是task_struct,它会记录页表的起始地址:pgdir,然后每次进程切换时都会把目标的页表起始地址送入CR3寄存器。 2. 进程自己是不知道的,但是内核知道。内核管理着全部的物理内存,哪一块分配给谁,它是非常清楚的。用于管理物理内存的结构叫做mem_map,如果有兴趣的话可以自己查一下。
2021-11-0225 - 奕虚拟地址空间往往与机器字宽有关系 ----------------- 为什么要有这一层关系呢?
作者回复: 因为虚拟地址是程序员要打交道的地址。程序员操作寄存器,寄存器的位宽能放32位的指针,这就表示能表示的范围是0到4G。也就是32位机器上,最大能表示的地址是4G。这不就是位宽决定了空间大小么?
2021-10-2825 - D“CPU 运算的数据都是存储在主存里的。”, 这句话不是太准确啊,CPU 不是直接从主存拿数据啊,中间还有寄存器,高速缓存啊。
作者回复: 你说得非常对。我们会在第14课详细地介绍存储体系结构,就把这个问题说清楚了。在这之前,我们不会引入这些概念,是为了让大家关注虚拟地址这个概念就好了,过多的概念会给大家造成困扰。在必要的时刻我们肯定会细化修正概念的,就像从相对论的角度看,牛顿力学的表述也有很多不严谨的地方。学习的过程就是从不全面到全面的过程。非常感谢!
2021-10-2744 - 小北语速稍微快了点
作者回复: 后边的已经在慢慢调整了:)
2021-10-2624