虚拟内存总结

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/i_chaoren/article/details/85320497

本文主要参考《深入理解计算机系统》《现代操作系统》两本经典书籍。

 虚拟内存的基本思想每个进程拥有自己的地址空间,这个空间被分割为多个块,每个块称作一页。每一页有连续的地址范围。这些页被映射到物理内存,但并不是所有的页都必须在内存中才能运行程序。当程序引用到一部分在物理内存中的地址空间时,由硬件立刻执行必要的映射。当程序引用到一部分不在物理内存中的地址空间时,由操作系统负责将缺失的部分装入物理内存并重新执行失败的指令。 ----《现代操作系统》    

 虚拟内存的三个重要功能第一,它在主存中自动缓存最近使用的存放磁盘上的虚拟地址空间的内容。第二,虚拟内存简化了内存管理,进而又简化了连接、在进程间共享数据、进程的内存分配以及程序加载。最后,虚拟内存通过在每条页表条目中加入保护位,从而简化了内存保护。  ----《深入理解计算机系统》

     功能一 虚拟内存作为缓存的工具

    1)概念上而言虚拟内存被组织为一个由存放在磁盘上的N个连续的字节大小的单元组成的数组每字节都有一个唯一的虚拟地址,作为到数组的索引。磁盘上数组的内容被缓存在主存中。

    2)页表存放在物理内存中的数据结构,将虚拟页映射到物理页。 下图展示了一个有8个虚拟页和4个屋里页的系统的页表。四个虚拟页(VP1、VP2、VP4和VP7)当前被缓存在DRAM中。两个页(VP0和VP5)还未被分配,而剩下的页(VP3和VP6)已经被分配了,但是当前还是未被缓存

    3)缺页DRAM缓存不命中称为缺页。触发一个缺页异常,缺页异常调用内核中的缺页异常处理程序,该程序会选择一个牺牲页(如有必要,将写回牺牲页),内核从磁盘中复制对应页到内存中,并更新页表,随后返回。然后继续执行。下图表示了缺页前后的页表变化。

    交换/页面调度在磁盘和内存之间传送页的活动。页从磁盘换入(或者页面调入)DRAM和从DRAM换出(或者页面调出)磁盘。

    按需页面调度一直等待,直到最后时刻,也就是当有不命中发生时,才换入页面的策略。

    4) 分配页面下图展示了当操作系统分配一个新的虚拟内存页时对我们示例页表的影响,例如,调用malloc的结果。在这个示例中,VP5的分配过程是在磁盘上创建空间并更新PTE5,使它指向磁盘上这个新创建的页面。

    5) 虚拟内存的效率尽管在整个运行过程中程序引用的不同页面的总数可能超出物理内存总的大小,但是局部性原则保证了在任意时刻,程序将趋向于在一个较小的活动页面集合上工作,这个集合叫做工作集或者常驻集合在初始开销,也就是将工作集页面调度到内存中之后,接下来对这个工作集的引用将导致命中,而不会产生额外的磁盘流量。只要我们的程序具有较好的时间局部性,虚拟内存就能工作的相当好。 《深入理解计算机系统》

        局部性原理一个程序倾向于引用邻近于其他最近引用过的数据项,或者最近引用过的数据项本身的这种倾向性。

    功能二 虚拟内存作为内存管理的工具

        操作系统为每个进程提供了一个独立的页表,因而也就是一个独立的虚拟地址空间。下图展示了基本思想。注意,多个虚拟页面可以映射到同一个共享页面上。

    功能三 虚拟内存作为内存保护的工具

        通过在PTE上添加一些额外的许可位来控制对一个虚拟页面内容的访问,下图展示了大致的思想。

    在这个示例中,每个PTE 中已经添加了三个许可位。 SUP位表示进程是否必须运行在内核(超级用户)模式下才能访问该页。 运行在内核模式中的进程可以访问任何页面, 但是运行在用户模式中的进程只允许访问那些SUP为0的页面。 READ位和WRITE 位控制对页面的读和写访问。 例如, 如果进程i运行在用户模式下, 那么它有读VPO和读写VP1的权限。然而,不允许它访问VP2。

    如果一条指令违反了这些许可条件,那么CPU就触发一个一般保护故障,将控制传递给一个内核中的异常处理程序。 Linux shell一般将这种异常报告为 “段错误(segmentation fault)”。

猜你喜欢

转载自blog.csdn.net/i_chaoren/article/details/85320497