操作系统-虚拟内存

有关操作系统的设计,都是在解决一个问题,即:如果让计算机高效安全的运行多道程序。

本文要解决哪些问题

  1. 为何虚拟地址可以起到这样的作用:512M内存的机器,可跑1G大小的游戏?
  2. 虚拟内存技术体现了哪些设计原则?

虚拟内存简介

虚拟内存有哪些能力?

  1. 给所有进程提供一致的地址空间,每个进程都认为自己是在独占使用单机系统的存储资源—如何实现呢?为何能有这种效果
  2. 保护每个进程的地址空间不被其他进程破坏,隔离了进程的地址访问。
  3. 虚拟内存把主存作为磁盘的高速缓存,在主存和磁盘之间根据需要来回传送数据,高效的使用了主存。
  4. 虚拟内存技术就是建立了内存-外存的两级存储器的结构

技术背景-为什么要用虚拟内存技术

  1. DRAM(内存)的容量比较小,程序大小的增长速度要比DRAM内存容量的增长速度快的多
  2. 既然磁盘的容量可以那么大,那么为什么不能把磁盘当成一部分内存来用呢 — 这其实就是虚拟内存

设计原则

局部性原理:包括快表、页告诉缓存以及虚拟内存技术其中都有局部性原理的影子。

局部性原理之一:时间局部性—因为程序中的循环操作

  • 如果某条执行被执行,那么不久后该指令还可能被执行。
  • 如果某个数据被访问,那么不久后该数据还可能被访问。

局部性原理之二:空间局部性—因为顺序执行和顺序存储

  • 一旦程序访问了某个存储单元,那么不久后,其附近的存储单元也将被访问。

这里其实可以想到:基于局部性原理去写程序,去组织变量、数据结构会对程序的运行速度有帮助的。

虚拟内存的定义和特征

问题1:我有一个游戏:game.exe其大小是1GB,当双击它时,操作系统会将exe文件载入内存,但是呢,我现在只有512M的内存,怎么办呢?

  1. 基于局部性原理,在程序装入时,可以将程序的一部分装入,其余留在外存,先启动程序,让程序先跑着,执行阶段发现访问的信息不在,比如第一关怪物的image,那么再将image载入内存即可。
  2. 只有上面一条还不够好,如果OS还能将暂时不用的内容换到外存上,比如第一关时加载了某个怪物的image,打到第二关完全可以把这个image换到外存上,以便留出空间去加载第二关怪物的image。

问题2:为什么叫虚拟内存呢?

  1. 我刚才运行1G的游戏时,那1G的内存真实存在吗?不存在,只存在512M,所以叫虚拟咯。
  2. 能运行1G游戏的原因是以下几个功能的支持:部分装入、请求调入和置换

问题3:虚拟内存有哪些特征?

  1. 多次性,无需在作业运行时一次性将程序全部装入内存,而是允许被分成多次调入。
  2. 对换性,无需作业运行时一直常驻内存,而是允许在作业运行过程中,进行换进和换出。
  3. 虚拟性,是指从逻辑上扩充内存的容量,使用户所看到的内存容量远大于实际的内存容量。
    所以呢,我的1G游戏能跑在512M的机器上。

虚拟内存技术的实现

问题1:优化一次效率,如何实现上述的部分装入,换进换出才能更高效呢?

  1. 首先考虑一种方法:每次换入都替换地址空间的开头内容,比如我要调入20M的数据,直接覆盖掉内存中的前20M数据,这样实现是否ok呢?
    这样实现存在的问题是:内存中的后半部分会一直处于空闲状态,无法利用,那么如果将其利用起来呢?

  2. 考虑第二种方法:第一种方法效率不高的原因是采用连续的替换规则,如果能采用一种离散的替换规则,即每次不一定非得从头替换,我可以充分考虑内存中的数据分配信息,从而离散地进行分配。

问题2:需要的哪些技术支持?

  1. 一定容量的内外存,选取外存中多大的空间作为内存的缓存是有讲究的,在linux下是swap区,在windows下是:操作系统-虚拟内存
  2. 页表机制,哪些页在内存哪些不在,需要查表决定。
  3. 中断机构:当需要访问的部分未调入内存,则产生中断,让中断服务程序去调入相关部分
  4. 地址变换机构:实现逻辑地址到物理地址的转换。

问题3:有哪些方式可实现上述功能?

  1. 请求分页存储管理
  2. 请求分段存储管理
  3. 请求段页式存储管理

问题4:有了以上理解你能解释这个问题吗?当电脑内存慢的时候,电脑卡的要死,点一下要反应半天。

  1. 首先虚拟地址是拿磁盘的一部分当内存来用,即将内存当作磁盘的缓存,内存快小,磁盘慢大
  2. 内存满的时候只能拿磁盘上的交换区来用,但是呢磁盘慢,比内存慢好几个数量级,内存越满,越不好调度,用的虚拟内存即磁盘越多,那速度就越慢了
  3. 归根结底,这个问题的解答在两点:内存小、磁盘慢
  4. 怎么解决呢?最好的解决方法是扩内存条,加大虚拟内存空间治标不治本,效果不好,再者说现在内存容量8G、16G不是问题,虚拟内存作用在变小,但是不建议关闭,因为有些程序是专门利用了虚拟内存技术来写的。

请求分页管理方式实现虚拟内存

  1. 为了支持虚拟存储器功能而增加了请求调页和页面置换功能。
  2. 在请求分页系统中,只要求将当前需要的一部分页面装入内存,便可以启动作业运行。在作业执行过程中,当所要访问的页面不在内存时,再通过调页功能将其调入,同时还可以通过置换功能将暂时不用的页面换出到外存上,以便腾出内存空间。
  3. 为了实现请求分页,系统必须提供一定的硬件支持。除了需要一定容量的内存及外存的计算机系统,还需要有页表机制、缺页中断机构和地址变换机构。

页表机制

操作系统-虚拟内存

增加的四个字段说明如下:

  • 状态位P:用于指示该页是否已调入内存,供程序访问时参考。
  • 访问字段A:用于记录本页在一段时间内被访问的次数,或记录本页最近己有多长时间未被访问,供置换算法换出页面时参考。
  • 修改位M:标识该页在调入内存后是否被修改过。
  • 外存地址:用于指出该页在外存上的地址,通常是物理块号,供调入该页时参考。

缺页中断机构

系统中,所要访问的页面不存在时,便产生一个缺页中断,请求OS调入。
缺页中断与普通中断一样,要经过保存CPU现场,分析终端原因,转入中断处理程序,恢复CPU等几个步骤,但是有不同点:

  • 在指令执行期间产生和处理中断信号,而非一条指令执行完成后,属于内部中断
  • 一条指令执行期间,可能产生多个缺页中断。

地址变换机构

操作系统-虚拟内存
其中快表是另外一种机制,目前可不深究

至此,虚拟内存技术已经大致了解,其内部还存在很多内容,比如页面置换算法、页面分配策略等。

相关文章:

  • 2021-05-03
  • 2021-11-11
  • 2021-06-12
  • 2021-10-19
  • 2021-12-11
  • 2021-10-26
  • 2021-10-07
  • 2021-08-16
猜你喜欢
  • 2021-10-07
  • 2021-10-26
  • 2021-09-05
  • 2021-07-20
  • 2021-12-22
  • 2021-11-03
  • 2021-10-12
相关资源
相似解决方案