虚拟内存简介

2020-04-12  本文已影响0人  飞翃荷兰人

虚拟内存

一 什么是虚拟内存?

1. 为什么要有虚拟内存?

为了更加有效的管理内存并减少出错,现代系统提供了一种对主存的抽象概念,叫做虚拟内存。为每个进程提供了一个私有的地址空间。作用可总结为以下三点:

  1. 它将主存看作为存储在磁盘上地址空间的告诉缓存,在主存中只保存活动区域。
  2. 为每个进程提供一致的地址空间,简化了内存管理。
  3. 保护了每个进程的地址空间不被其他进程破坏。
2. 如何理解虚拟内存概念?

虚拟内存概念分为两部分,一部分是物理内存,还有一部分是位于交换区的磁盘空间,这部分磁盘空间在内存不足时可以作为内存,将活动不频繁的数据放入磁盘中。

3. 虚拟内存和物理内存如何联系?
4. DRAM和SRAM
5. 页表

页表将虚拟页映射到物理页,每次地址翻译硬件将虚拟地址装换为物理地址时都会读取页表。操作系统负责维护页表的内容,以及在磁盘和DRAM之间来回传送页。实际上:操作系统为每个进程提供了一个独立的页表,因而也就是一个独立的虚拟地址空间。

image.png
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飙升。

上一篇 下一篇

猜你喜欢

热点阅读