虚拟内存简介
虚拟内存
一 什么是虚拟内存?
1. 为什么要有虚拟内存?
为了更加有效的管理内存并减少出错,现代系统提供了一种对主存的抽象概念,叫做虚拟内存。为每个进程提供了一个私有的地址空间。作用可总结为以下三点:
- 它将主存看作为存储在磁盘上地址空间的告诉缓存,在主存中只保存活动区域。
- 为每个进程提供一致的地址空间,简化了内存管理。
- 保护了每个进程的地址空间不被其他进程破坏。
2. 如何理解虚拟内存概念?
虚拟内存概念分为两部分,一部分是物理内存,还有一部分是位于交换区的磁盘空间,这部分磁盘空间在内存不足时可以作为内存,将活动不频繁的数据放入磁盘中。
3. 虚拟内存和物理内存如何联系?
- 通过cpu上的内存管理单元(MMU),利用存放在主存的查询表来动态翻译内存地址。
- 主存中每个字节都有选自虚拟地址空间的虚拟地址和选自物理地址空间的物理地址。
- 虚拟内存系统将虚拟内存分割为虚拟页,物理内存分割为物理页。
4. DRAM和SRAM
- SRAM:L1 L2
- DRAM:主存
-
SRAM比DRAM快10倍,DRAM比磁盘快十万多倍。
image.png
5. 页表
页表将虚拟页映射到物理页,每次地址翻译硬件将虚拟地址装换为物理地址时都会读取页表。操作系统负责维护页表的内容,以及在磁盘和DRAM之间来回传送页。实际上:操作系统为每个进程提供了一个独立的页表,因而也就是一个独立的虚拟地址空间。
6.缺页
DRAM缓存不命中称之为缺页:当发生缓存不命中时,会触发一个缺页异常,缺页异常调用内核中的缺页异常处理程序,该程序会选择一个牺牲页。
7. 段错误
页表是带许可位的,例如SUP,VP0,VP1,VP2等,其中SUP只能在超级用户模式下访问,用户模式有读VP0和读写VP1的权限,如果一条指令违反了许可条件,那么cpu会触发一个一般保护故障,将控制传递给一个内核中的异常处理程序,linux shell一般将这种异常报告为段错误(segmentation fault)
8. 多级页表
维护64位的虚拟地址空间一张页表肯定是不够用的,所以要用多级页表,也就是在一张页表里面维护的是下一张页表的地址,多级之后会指向实际的物理地址,这个和ip协议的路由寻址有点相似。
二 Linux虚拟内存系统
1. 内存映射
Linux通过将一个虚拟内存区域与一个磁盘上的对象关联起来,以初始化这个虚拟内存区域的内容,这个过程叫做内存映射。
2.交换空间
一旦一个虚拟页面被初始化了,它就在一个由内核维护的专门的交换文件之间换来换去。交换文件也被称为交换空间,或者交换区域。
3. 交换区详解
Linux内核为了提高读写效率与速度,会将文件在内存中进行缓存,这部分内存就是Cache Memory(缓存内存)。即使你的程序运行结束后,Cache Memory也不会自动释放。这就会导致你在Linux系统中程序频繁读写文件后,你会发现可用物理内存变少。当系统的物理内存不够用的时候,就需要将物理内存中的一部分空间释放出来,以供当前运行的程序使用。那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到Swap空间中,等到那些程序要运行时,再从Swap分区中恢复保存的数据到内存中。这样,系统总是在物理内存不够时,才进行Swap交换。
少量使用Swap交换空间是不会影响性能,只有当RAM资源出现瓶颈或者内存泄露,进程异常时导致频繁、大量使用交换分区才会导致严重性能问题。另外使用Swap交换分区频繁,还会引起kswapd0进程(虚拟内存管理中, 负责换页的)耗用大量CPU资源,导致CPU飙升。