虚拟存储器

如果没有虚拟存储器,可能会带来这些问题:
1.所有的进程都共享CPU和主存资源。所以当进程太多,太大,而导致内存无法容纳时,就无法运行该进程。
2.存储器很容易被破坏,当一个程序不小心写了另外一个进程使用的存储器时,那么进程可能就会以一种奇怪的方式而终止。
为了更加有效的管理存储器且少出错,就出现了虚拟存储器。虚拟存储器为每个进程都提供了一个大的,一致的,私有的地址空间
虚拟存储器:将内存看成是一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,并根据需求在磁盘和主存之间来回传送数据,通过这种方式,高效的使用了主存;为每一个进程提供了一致的地址空间,简化了存储器的管理;保护了每个进程的地址空间不被其他进程破坏。
物理地址和虚拟寻址
计算机系统的主存被组织成为一个由M个连续的字节大小的单元组成的数组。每个字节都有一个唯一的物理地址。
这里写图片描述
例如上图:根据虚拟地址,CPU通过生成一个虚拟地址来访问主存,这个虚拟地址被送到存储器之前先转化成适当的物理地址。然后内存读取地址并返回给CPU。

1.虚拟存储器作为缓存的工具

从概念而言,虚拟存储器被组织为放在磁盘上的N个连续的字节大小的单元组成的数组。每个字节都有一个唯一的虚拟地址,这个唯一的虚拟地址是作为到数组的索引的。磁盘上数组的内容被缓存在内存中。
页表(是一个数据结构):将虚拟页映射到物理页。每次地址翻译硬件将一个虚拟地址转换为物理地址时,都会读取页表。操作系统负责维护页表的内容,以及在磁盘与内存之间来回传送页。
这里写图片描述
如上图展示了一个页表的基本组织结构。我们看到,页表就是一个数组。页表中的每一项都是由一个有效位和一个n位字段组成的。有效位表明了该虚拟页当前是否被缓存在物理存储器中。如果设置了有效位,那么有效位后面的地址字段就表示物理存储器中相应的物理页的位置,那么那个相应的物理页也存储了该虚拟页(例如图中红色的线段)。如果没有设置有效位,那么表示有一个空地址还没有被分配(例如图中表述null的地方)。否则,这个地址就指向磁盘上的虚拟页的起始位置(例如图中的蓝色线段)。
缺页:在物理内存中找不到的称为缺页。结合上面的图片,例如,当CPU需要VP3时,发现物理存储器中没有。此时,地址翻译就会从页表中发现VP3的有效位为0,那么就会触发一个缺页异常。缺页异常会调用内核中的相关的处理程序,该程序会在物理存储器中选择一个牺牲页,或许就会把VP4给牺牲掉换为VP3(这儿涉及到了调度算法),VP4就会重新回到磁盘中,而VP3也就存在了物理存储器中。当异常处理的程序返回时,它会重新启动之前的指令,该指令就会把虚拟地址重新发送到地址翻译硬件中。可是,此时VP3已经存在物理存储器中了。
但是,当其中缺页的调度算法不合理时,存储器就可能在不停的将页面进行换进换出,那么就会出现抖动(颠簸)的现象。
缺页的调度算法的介绍:
1.最佳置换算法.
缺点:缺页率低;优点:在实际操作中该算法无法实现.所以可以用它来衡量其他算法.
下面模拟实现置换的过程:
这里写图片描述
2.先进先出页面置换算法.(FIFO)
缺点:缺页率高;优点:算法简单,容易实现.
模拟实现:
这里写图片描述
3.最近最久未使用算法.(Least Recently Used)
缺点:对计算机的硬件要求比较高;优点:接近最佳算法.
模拟算法实现:
这里写图片描述

2.虚拟存储器作为存储器管理的工具

在操作系统中,为每个页表都提供了一个单独的页表,也就是每个进程都有一个虚拟地址空间。如下图所示:
这里写图片描述
在上图中,我们发现,不同的进程中有一部分指向了相同的物理存储器。我们知道,一般情况下,每个进程都有它自己私有的代码,数据,堆以及栈区域,是不和其他的进程共享的。通过页表可以映射到相应的物理存储器。但是,有些情况下需要共享代码和数据的。例如:每个进程都要调用相同的系统内核代码,而每个C程序也会调用标准系统库中的程序。此时,操作系统就会通过将不同进程中适当的虚拟页面映射到相同的物理页面,从而安排多个进程共享这部分代码,而不是在每个进程中都包含。

3.虚拟存储器作为存储器的保护工具

在现在的计算机系统中会提供一些手段来控制对存储器的访问。例如:

  1. 不允许一个用户进程修改它的只读区域,不允许用户进程读或修改任何内核中的代码和数据结构。
  2. 不允许用户进程读或者写其他进程的私有存储器。
  3. 不允许用户进程修改与其他进程共享的虚拟页面。
    为了避免以上的状况,操作系统就会在进程的页表中添加一些许可位。例如,添加读/写的许可位,当某条指令违反了这些条件时,CPU就会触发保护故障,将其传递给内核中的异常处理程序。Unix shell中将这种异常报告为:"段错误(segmentation fault)";
    这里写图片描述

Linux虚拟存储器

一个进程维护一个单独的虚拟地址空间。如下图所示:
这里写图片描述
区域:一个区域就是已经存在着的虚拟存储器的连续组块,例如上图中每一个框框。每个存在的虚拟页都保存在某个区域中,不属于某个区域的虚拟页是不存在的,并且不能被进程引用。
内核在系统中为每个进程维护了一个数据结构——task_struct。task_struct也叫做PCB(进程控制块)。其中,在task_struct中有一个mm_struct,它描述了虚拟存储器当前的状态。它的里面包含两个重要的字段:pgb和mmap.而mmap又指向vm_area_struct链表.而每个vm_area_struct都描述了当前虚拟地址空间的一个区域.
这里写图片描述
如上图所示.

  • vm_start:指向这块区域的起始位置.
  • vm_end:指向这块区域的结束位置.
  • vm_port:描述这块区域内包含所有页面的读写许可权.
  • vm_flags:描述这块区域内的页面是否与其他进程共享,还是私有等等.
  • vm_next:指向链表中的下一个区域结构.

    Linux缺页异常处理:
    假设MMU在试图翻译某个虚拟地址D时,触发了一个缺页.就会调用内核中的缺页处理程序,其执行的步骤如下:

    1. 虚拟地址D是合法地址吗?D存在某个区域中吗?所以此时缺页处理程序就会把D地址和虚拟存储器中的每一个区域的vm_start 和vm_end进行比较,如果不存在,就会触发一个段错误.这个错误码为:1.
    2. 若D合法,那么就会试图访问存储器,此时就会判断是否合法?比如,进程是否具有读写这个区域的权利?如果不合法,就会返回错误码为2.
    3. 判断上面两个都合法,此时,内核就知道这个缺页是因为对合法的虚拟地址进行合法的操作造成的.此时,它就会通过合适的算法选择一个牺牲页面进行交换.当缺页处理
      程序返回时,CPU重启缺页的指令,这条指令再次发到MMU,那么,就不会产生缺页中断了.
      这里写图片描述
      以上这篇博客都是从<深入理解计算机操作系统>的虚拟存储器的章节中所学到的.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值