虚拟存储器

本文深入解析虚拟存储器的概念,探讨其如何通过抽象主存实现高效内存管理,包括页表、地址翻译、缺页异常处理及页命中过程。同时,阐述虚拟存储器在简化链接、存储器分配和代码共享等方面的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

虚拟存储器
  • 一个系统中的进程是与其他的进程共享CPU和主存资源。
  • 如果某个进程不小心的写了另一个进程使用的存储器,它可能以某种==完全和逻辑无关==的令人迷惑的方式失败。
  • 为了更有效的管理存储器,对于主存进行抽象 叫做虚拟存储器。
  • 虚拟存储器的三个重要的能力:
    1. 将主存看作是磁盘上地址空间的高速缓存,在主存当中只保存活动区域,根据需要在磁盘和主存之间传输数据,高效使用主存。
    2. 为每个进程提供一致的地址空间,简化存储器的管理。
    3. 保护每个进程的地址空间不被其他的进程破坏。

  • 虚拟存储器是计算机系统的重要的概念之一。
  • 成功的原因之一是他是沉默的自动的工作,不需要程序员的干涉。
  • 主存:组织成一块由M个连续的字节大小的单元组成的数组
  • 每个字节都有一个唯一的物理地址 可以通过物理地址进行寻址
  • ==虚拟寻址==:CPU通过虚拟地址访问主存
  • 虚拟地址在被送到存储器之前先转换为物理地址
  • 将虚拟地址转换为物理地址的任务叫做==地址翻译== CPU芯片上叫做存储器管理单元的专用硬件就是利用放在主存中的查询表来动态的地址翻译。
地址空间
  • 地址空间是一个非负整数地址的有序集合
  • 如果地址空间是连续的就是线性地址空间
  • CPU从N=2的n次方的地址空间当中生成虚拟地址 这个地址空间称为虚拟地址 。
  • 地址空间的大小是由表示最大地址的位数来描述的,现代典型的是32位和64位
  • 物理地址空间:与系统当中的物理存储器的M个字节相对应。
  • 主存当中的每个字节都有一个选自虚拟地址空间的虚拟地址和选自物理地址空间的物理地址。
  • 物理存储器DRAM
  • 物理存储器缓存不命中称为缺页。
  • 缺页异常会调用内核的缺页异常处理程序,该程序会选择一个牺牲页。
  • 在虚拟存储器的习惯说法中,块被称为页
  • 在磁盘和存储器之间传送页的活动叫做交换或者页面调度
  • 页表就是一个页表条目(PTE)的数组。虚拟地址空间中的每个页在页表的一个固定偏移量处都有一个PTE。可以假设PTE由==一个有效位和一个n位地址字段组成==。有效位表明该虚拟页当前==是否被缓存在DRAM中==。如果设置了有效位,地址字段就表示DRAM中相应物理页的起始位置。

image
- ==页命中==: 当CPU读包含在VP2中的虚拟存储器的一个字时,地址翻译硬件将虚拟地址作为一个索引定位PTE2,并从存储器中读取它.==因为有效位为1==,所以地址翻译硬件就知道VP2是缓存在物理存储器中的了。所以,它可以直接使用PTE中的物理存储器地址,构造出这个字的物理地址。
- ==缺页==:DRAM缓存不命中称为缺页。当CPU引用虚拟存储器中的一个字,地址翻译硬件从存储器读取对应PTE发现其有效位为0时,触发缺页异常。
- 该程序会选择一个牺牲页,如果该牺牲页被修改,则先将其拷贝回磁盘。接下来,内核从磁盘==拷贝所缺页到物理存储器==,更新对应PTE,随后返回。当异常处理程序返回时,它会重新启动导致缺页的指令。因为之前所缺页已经被缓存进物理存储器,所以==这次会页命中==。


个人理解:
物理存储器DRAM作为磁盘的高速缓存。
物理存储器的大小是有限的,被划分成一个一个块通常叫做页。
每一个页在物理存储器当中有唯一的标号(物理地址)标识。
虚拟存储器是一个概念上的连续字节的数组每个字节都有一个唯一的虚拟地址。
虚拟存储器分割成虚拟页的大小固定的块进行管理。
物理存储器的页和虚拟页大小一致一一对应。
通过页表将虚拟存储器的页和物理存储器的页对应翻译。
如果虚拟地址对应的页在页表当中有物理地址的映射说明已经被加载到物理存储器直接就可以翻译---称为页命中。
如果虚拟地址对应的页在页表当中没有被标识在物理存储器内存在,说明物理存储器没有加载这一个页。
就需要从物理存储器选择一个牺牲页。
先看牺牲页的内容有没有被修改如果被修改了就需要先将这个页的内容重新写入磁盘。
再将需要的那页加载到这个牺牲页的位置,这样在物理存储器内就有我们需要的页。
这样就可以进行虚拟地址到物理地址的转换。
下回再需要刚才被换出的牺牲页就进行类似的换出换入操作。
所以不命中的开销大,因为不命中导致换入换出的操作效率很低。
  • 局部性。运行过程当中程序可能引用不同的页面的总数可能超过物理存储器的总大小。
  • 但是局部性保证在任意时刻程序往往在一个较小的活动页面结合上工作。
  • 这个集合叫做工作集或者驻集。
  • 在初始开销就是将工作集页面调度到存储器当中接下来对于工作集的引用就是命中的不会产生额外的开销。
  • 工作集小于物理存储器的大小就很好。
  • 如果工作集的大小大于物理存储器 那么将产生颠簸。

  • 操作系统给==每个进程提供了一个独立的页表==。也就是一个独立的虚拟地址空间。
  • 多个虚拟页面可以映射到同一个共享的物理页面上。
  • 虚拟存储器是一个虚拟的在磁盘上的N个连续字节的数组空间。

虚拟存储器简化了链接,加载,代码和数据共享。

简化链接:

  • 独立的地址空间允许每个进程的存储器映像使用相同的基本格式,而不管代码和数据实际存放在物理地址的何处。
  • 在一些情况下需要进程共享代码和数据。每个进程必须调用相同的操作系统内核代码,比如标准库函数printf操作系统通过将不同进程当中适当的虚拟页面映射到相同的物理页面。从而安排多个进程共享这部分代码的一个拷贝而不是在每个进程当中都包括单独的内核和标准库函数的拷贝。
  • 简化存储器分配:虚拟存储器为用户进程提供一个简单的分配额外存储器的机制。

    当一个运行在用户进程中的程序要求额外的堆空间时(malloc)操作系统分配一个适当数字(例如k)个连续的虚拟存储器页面并且将他们映射到物理存储器中任意位置的k个任意的==物理页面==。由于页表工作方式操作系统没有必要分配k个连续的物理存储页面页面可以随机的分散在物理存储器当中。

  • 现代任何计算机系统必须为操作系统提供手段来控制对存储系统的访问控制。

    1. 不允许任何用户进程修它的只读文本段、
    2. 不应该允许它读或者修改任何内核中的代码和数据结构。
    3. 不应该允许它读或者写其他进程的私有存储器
    4. 不允许它修改任何其他进程共享的虚拟页面
  • 每个PTE当中添加==3个许可位==,SUP为表示进程是否必须运行在内核模式下才能访问该页。运行在内核模式中的进程可以访问任何页面,但是运行在用户模式下的进程只允许访问哪些SUP为0的页面。

  • READ位和WRITE位控制对于页面的读和写访问。
  • 如果一条指令违反这条许可 CPU就会触发一个一般保护故障。将控制权传递给一个内核当中的异常处理程序。一般将这种异常报告为==段错误==。

地址翻译
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值