操作系统概念(第九章) 虚拟内存

虚拟内存将用户逻辑内存与物理内存分离,允许部分程序在内存中运行,优化了资源使用。按需调页策略仅在需要时调入页,减少了内存需求。页面置换算法如FIFO、LRU和最优置换用于处理内存不足的情况。FIFO选择最先进入内存的页,LRU选择最近最久未使用的页,而最优置换选择未来最长时间不再使用的页。这些算法影响系统性能,好的策略能降低缺页率。
摘要由CSDN通过智能技术生成

背景

第八章所介绍的内存管理算法都是基于一个基本要求:执行指令必须在物理内存中,满足这一要求的第一种方法是整个进程放在内存中。动态载入能帮助减轻这一限制,但是它需要程序员特别小心地做一些额外的工作。

指令必须都在物理内存内的这一限制,似乎是必须和合理的,但也是不幸的,因为这使得程序的大小被限制在物理内存的大小内。事实上,研究实际程序会发现,许多情况下并不需要将整个程序放到内存中。即使在需要完整程序的时候,也并不是同时需要所有的程序。

因此运行一个部分在内存中的程序不仅有利于系统,还有利于用户。

虚拟内存(virtual memory)将用户逻辑内存和物理内存分开。这在现有物理内存有限的情况下,为程序员提供了巨大的虚拟内存。


虚拟地址空间

进程的虚拟地址空间就是进程如何在内存中存放的逻辑(或虚拟)视图。通常,该视图为进程从某一个逻辑地址(如地址0)开始,连续存放。

虚拟地址空间

根据第八章,物理地址可以按页幁来组织,且分配给进程的物理页帧也可能不是连续的。这就需要 内存管理单元(MMU)将逻辑页映射到内存的物理页帧。
如上图显示,运行随着动态内存的分配,堆可向上生长。类似地,还允许随着子程序的不断调用,栈可以向下生长。堆与栈之间的巨大空白空间(或hole)为虚拟地址的一部分,只有在堆与栈生长的时候,才需要实际的物理页。 包括空白的虚拟地址空间成为稀地址空间,采用稀地址空间的优点是:随着程序的执行,栈或者堆段的生长或需要载入动态链接库(或共享对象)时,这些空白可以填充。

除了将逻辑内存与物理内存分开,虚拟内存也允许文件和内存通过共享页而为两个或者多个进程所共享,这样带来了如下的有点:

  • 通过将共享对象映射到虚拟地址空间,系统库可为多个进程所共享。虽然每个进程都认为共享库是其虚拟地址空间的一部分,而共享库所用的物理内存的实际页是为所有进程所共享。通常,库是按制度方式来链接每个进程的空间的。
  • 类似的,虚拟内存允许进程共享内存。两个或者多个进程之间可以通过使用共享内存来相互通信。虚拟内存允许一个进程创建内存区域,以便与其他进程进行共享。共享该内存区域的进程认为它是其虚拟地址空间的一部分,而事实上这部分是共享的。


虚拟地址空间

  • 虚拟内存可允许在用系统调用fork()创建进程期间共享页,从而加快进程的创建。

按需调页

一个执行程序从磁盘载入内存的时候有两种方法。
1. 选择在程序执行时,将整个程序载入到内存中。不过这种方法的问题是可能开始并不需要整个程序在内存中。如有的程序开始时带有一组用户可选的选项。载入整个程序,也就将所有选项的执行代码都载入到内存中,而不管这些选项是否使用。
2. 另一种选择是在需要时才调入相应的页。这种技术称为按需调页(demand paging),常为虚拟内存系统所采用。

按需调页系统看类似于使用交换的分页系统,进程驻留在第二级存储器上(通常为磁盘)。当需要执行进程时,将它换入内存。不过,不是讲整个进程换入内存,而是使用懒惰交换(lazy swapper)。懒惰交换只有在需要页时,才将它调入内存。由于将进程看做是一系列的页,而不是一个大的连续空间,因此使用交换从技术上来讲并不正确。交换程序(swapper)对整个进程进行操作,而调页程序(pager)只是对进程的单个页进行操作。因此, 在讨论有关按需调页时,需要使用调页程序而不是交换程序


虚拟地址空间

基本概念

当换入进程时,调页程序推测在该进程再次换出之前使用到的哪些页,仅仅把需要的页调入内存。从而减少交换时间和所需的物理内存空间。

这种方案需要硬件支持区分哪些页在内存,哪些在磁盘。采用有效/无效位来表示。当页表中,一个条目的该位为有效时,表示该页合法且在内存中;反之,可能非法,也可能合法但不在内存中。

这里写图片描述

如果进程从不试图访问标记为无效的页,那么并没有什么影响,因此,如果推测正确且只调入所有真正需要的页,那么进程就可如同所有页都调入内存一样正常运行。

当进程试图访问这些尚未调入内存的页时,会引起页错误陷阱(page-fault trap)。这种情况的处理方式如下:

  • 1)检查进程的内部页表(通常与PCB一起保存)。以确定该引用是的合法还是非法的地址访问。
  • 2)如果非法,则终止进程;如果引用有效但是尚未调入页面,则现在进行调入。
  • 3)找到一个空闲帧(如,从空闲帧表中选取一个)。
  • 4)调度一个磁盘操作,以便将所需页调入刚分配的帧
  • 5)磁盘读操作完成后,修改进程的内部表和页表,表示该页已在内存中。
  • 6)重新开始因陷阱而中断的指令。

这里写图片描述

例如,block move 问题。

这里写图片描述

MVC指令能够移动256B。

  • 块可能跨越页边界
  • 移动部分字符后出现页错误
  • 如果源和目的块有重叠
  • 源块可能已经被修改

解决方案:
- 试图存取两个块的两端
- 使用临时寄存器保存被覆盖位置的值

按需调页的性能

按需调页对计算机系统的性能有重要影响,下面计算一下关于按需调页内存的有效访问时间(effective access time)。

p(0p1) 为页错误的概率, ma 为内存访问时间:

  • 13
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值