zoukankan      html  css  js  c++  java
  • 第九章 虚拟存储器

    第九章 虚拟存储器

    概述:一个系统中的进程是与其他进程共享CPU和主存资源的。

    三个重要的能力

    • 它将主存看成是一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,并根据需要在磁盘和主存之间来回传送数据,通过这种方式,高效的使用了主存
    • 它为每个进程提供了一致的地址空间,从而简化了存储器管理
    • 它保护了每个进程的地址空间不被其他进程破坏

    理解虚拟存储器的原因

    • 虚拟存储器是中心的
    • 虚拟存储器是强大的
    • 虚拟存储器是危险的

    9.1 物理和虚拟寻址

    计算机系统的主存被组织成一个由M个连续的字节大小的单元组成的数组。每字节都有一个惟一的物理地址(physical address,PA)。第一个字节地址是0,接下来的字节地址为1

    早期的PC使用物理寻址,而且诸如数字信号处理器,嵌入式微控制器以及Cray超级计算机这样的系统仍然继续使用这种寻址方式。而为通用计算机设计师的现代处理器使用的是虚拟寻址

    CPU芯片上叫做存储器管理单元

    9.2地址空间

    地址空间为非负整数地址的有序集合:{0,1,2,...}

    如果地址是连续的,则称为线性地址空间。如果计算机有n位地址总线,在一个带有虚拟存储器的系统中,CPU从一个有N = 2n个地址的地址空间中生成虚拟地址,这个地址称为虚拟地址空间:{0,1,2,...,N-1}
    物理地址空间,与物理存储器的M个字节相对应:{0,1,2,...M-1}
    M不要求是2的幂。

    9.3虚拟存储器作为缓存的工具

    概念上言,虚拟存储器被组织为一个由存放在磁盘上的N个连续的字节大小的单元组成的数组。
    每字节都有一个惟一的虚拟地址,这个惟一的虚拟地址是作为到数组的索引的。磁盘上数组的内容被缓存到主存中。和存储器层次结构中其他缓存一样,磁盘(较低层)上的数据被分成块,这些块作为磁盘和主存(较高层)之间的传输单元。VM系统通过将虚拟存储器分割成称为虚拟页(virtual page,VP)的大小固定的块,来处理这个问题。

    在任意时刻,虚拟页面的集合都分为三个不相交的子集:

    • 未分配的:VM系统还未分配或创建的页。未分配的块没有任何数据与它们相关联,因此也就不占用任何磁盘空间。
    • 缓冲存:当前缓存在物理存储器中的已分配页。
    • 未缓存的:没有缓存在物理存储器中的已分配页。

    9.3.2页表

    存放在物理存储器一个数据结构,叫做页表(page table)。页表将虚拟页映射到物理页。
    页表就是一个PTE(page table entry,页表条目)的数组。虚拟地址空间中的每个页在页表中的一个固定偏移量处都有一个PTE。

    9.3.3页命中

    9.3.4缺页

    定义:DRAM缓存不命中称为缺页

    9.3.5分配页面

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

    • 简化链接
    • 简化共享
    • 简化存储器分配
    • 简化加载

    9.6地址翻译

    是一个N元素的虚拟地址空间(VAS)中的元素和一个M元素的物理地址空间(PAS)中元素之间的映射。

    CPU中的一个控制寄存器,叫做页表基址寄存器(page table base register,PTBR)指向当前页表。N位的虚拟地址包含两个部分:一个p位的VPO(virtual page offset,虚拟页面偏移)和一个n-p位的VPN(virtual page number)。MMU利用VPN来选择适当的PTE。如VPN0选择PTE0。因为物理和虚拟页面都是p字节的,所以PPO(physical page offset物理页面偏移)和VPO是相同的,所以,将页表条目中PPN(physical page number,物理页号)和虚拟地址中的VPO串联起来,就是相应的物理地址。

    结合高速缓存和虚拟存储器来看

    首先,在既使用SRAM高速缓存又使用虚拟存储器的系统中,大多数系统选择物理寻址
    主要思路是地址翻译发生在高速缓存之前

    页表目录可以缓存,就像其他的数据字一样利用TLB加速地址翻译

    TLB:翻译后备缓冲器,是一个小的、虚拟存储的缓存,其中每一行都保存着一个由单个PTE组成的块

    9.7LINUX案例实例

    Linux虚拟存储器

    9.8存储器映射

    Linux通过将一个虚拟存储器区域与一个磁盘上的对象(object)关联起来,以初始化这个虚拟存储器区域的内容,这个过程称为存储器映射(memory mapping)。

    虚拟存储器区域可以映射到两种类型的对象:

    • unix文件系统中的普通文件:一个区域可以映射到一个普通磁盘文件的连续部分。
    • 匿名文件:一个区域也可以映射到一个匿名文件,匿名文件是由内核创建的,包含的全是二进制零。
      一旦一个虚拟页面被初始化了,它就在一个由内核维护的专门的交换文件(swap file)间换来换去。

    共享对象

    一个对象可以被映射到虚拟存储器的一个区域,要么作为共享对象,或作为私有对象。
    

    9.9动态存储器分配

    需要额外的虚拟存储器时,使用一种动态存储器分配器(dynamic memory allocator)。一个动态存储器分配器维护着一个进程的虚拟存储器区域,称为堆(heap)。在大多数的unix系统中,堆是一个请求二进制0的区域;对于每个进程,内核维护着一个变量brk,它指向堆的顶部。

    心得与体会

    这是本学期最后一次强制发博客的内容,内容很多,也很难,虽然在操作系统中学过虚拟存储的一些皮毛,但是相对于深入理解计算机系统中涉及的内容,那就是小巫见大巫了。书本不仅从原理上讲解了虚拟存储器。而且更多的是讲一些细节上的东西,所以看起来非常吃力。但是最后看完时觉得有非常大的成就感。我觉得通过这门课学到的不仅仅是一门知识,更重要的是一种对学习的态度,以及学习的方法,希望这种习惯能延续到我以后的学习中去。

    参考资料

  • 相关阅读:
    event与WaitForSingleObject、MsgWaitForMultipleObjects等
    vc不包含MFC就不打印内存泄露?
    使用visual leak detector(vld)查找内存泄露
    C#里面中将字符串转为变量名
    如何编写nopCommerce插件
    object成员,不见了!
    NopCommerce 定制系列(一):增加 Sha256+Base64 加密
    c#中的二维数组与锯齿数组
    待搞清楚
    NopCommerce 2.5的部署
  • 原文地址:https://www.cnblogs.com/5320zhq/p/5041936.html
Copyright © 2011-2022 走看看