虚拟内存_虚拟内存设置 - CSDN
虚拟内存 订阅
虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。目前,大多数操作系统都使用了虚拟内存,如Windows家族的“虚拟内存”;Linux的“交换空间”等。 [1] 展开全文
虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。目前,大多数操作系统都使用了虚拟内存,如Windows家族的“虚拟内存”;Linux的“交换空间”等。 [1]
信息
外文名
Virtual Memory
别    称
虚拟存储器
用    途
计算机系统内存管理
中文名
虚拟内存
虚拟内存简介
虚拟内存别称虚拟存储器(Virtual Memory)。电脑中所运行的 程序均需经由内存执行,若执行的程序占用内存很大或很多,则会导致内存消耗殆尽。为解决该问题,Windows中运用了虚拟内存技术,即匀出一部分硬盘空间来充当内存使用。当内存耗尽时,电脑就会自动调用硬盘来充当内存,以缓解内存的紧张。若计算机运行程序或操作所需的随机存储器(RAM)不足时,则 Windows 会用虚拟存储器进行补偿。它将计算机的RAM和硬盘上的临时空间组合。当RAM运行速率缓慢时,它便将数据从RAM移动到称为“分页文件”的空间中。将数据移入分页文件可释放RAM,以便完成工作。 一般而言,计算机的RAM容量越大,程序运行得越快。若计算机的速率由于RAM可用空间匮乏而减缓,则可尝试通过增加虚拟内存来进行补偿。但是,计算机从RAM读取数据的速率要比从硬盘读取数据的速率快,因而扩增RAM容量(可加内存条)是最佳选择。 [2]  虚拟内存是Windows 为作为内存使用的一部分硬盘空间。虚拟内存在硬盘上其实就是为一个硕大无比的文件,文件名是PageFile.Sys,通常状态下是看不到的。必须关闭资源管理器对系统文件的保护功能才能看到这个文件。虚拟内存有时候也被称为是“页面文件”就是从这个文件的文件名中来的。 [2]  内存在计算机中的作用很大,电脑中所有运行的程序都需要经过内存来执行,如果执行的程序很大或很多,就会导致内存消耗殆尽。为了解决这个问题,WINDOWS运用了虚拟内存技术,即拿出一部分硬盘空间来充当内存使用,这部分空间即称为虚拟内存,虚拟内存在硬盘上的存在形式就是 PAGEFILE.SYS这个页面文件。 [2] 
收起全文
精华内容
参与话题
  • 什么是虚拟内存

    千次阅读 2019-11-09 15:38:31
    什么是虚拟内存呢?先查一下维基百科: 虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时...

    什么是虚拟内存呢?先查一下维基百科:

    虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。与没有使用虚拟内存技术的系统相比,使用这种技术的系统使得大型程序的编写变得更容易,对真正的物理内存(例如RAM)的使用也更有效率。

    对虚拟内存的定义是基于对地址空间的重定义的,即把地址空间定义为「连续的虚拟内存地址」,以借此「欺骗」程序,使它们以为自己正在使用一大块的「连续」地址。

    也就是说虚拟内存能提供一大块连续的地址空间,对程序来说它是连续的,完整的,实际上虚拟内存是映射在多个物理内存碎片上,还有部分映射到了外部磁盘存储器上。虚拟内存有以下两个优点:

    1.虚拟内存地址空间是连续的,没有碎片

    2.虚拟内存的最大空间就是cup的最大寻址空间,不受内存大小的限制,能提供比内存更大的地址空间

     

    虚拟内存是如何工作的呢?

     

    创建一个进程时,操作系统(32位系统)会为该进程分配一个4GB 大小的虚拟内存。 之所以是4GB ,是因为在 32 位的操作系统中,一个指针长度是 4 字节(32位, 2的32次方个地址寻址能力是从 0x00000000~0xFFFFFFFF )即为 4GB 大小的容量。

    一个进程用到的虚拟地址是由内存区域表来管理的,实际用不了4G。而用到的内存区域,会通过页表映射到物理内存。所以每个进程都可以使用同样的虚拟内存地址而不冲突,因为它们的物理地址实际上是不同的。比如进程A的0x12345678虚拟地址和进程B的的0x12345678虚拟地址映射的物理地址是不同的的。

    我们现在使用的64位系统,虚拟内存最大有多大呢?是2的64次方吗?那将会有16EB的虚拟地址空间,1EB有多大呢?1EB = 1,000 PB = 1,000,000 TB =  1,000,000,000 GB 毫无疑问这是个非常巨大的数字,我们的系统根本不需要如此巨大的虚拟内存。现代的操作系统,比如,Windows在AMD64上的实现仅应用了最大256TB的虚拟内存。

    cup要访问虚拟内存地址时,需要经过地址翻译成物理地址才能访问。比如下图(来自《深入理解计算机系统》)中,cpu要访问虚拟地址4100,需要通过专用的硬件内存管理单元(memory management unit)MMU来翻译成对应的内存物理地址4,然后cpu在内存地址4的位置上取到数据返回。

     

    虚拟内存被分为一块块固定的大小,成为虚拟页(Virtual Page)简称VP,对应的物理内存也被分成一块块同样的大小,成为物理页(Physical Page)简称PP。磁盘和内存之间是以页为单位进行数据交换的。

    cpu怎么知道某一个虚拟页是否缓存了数据?缓存在内存中还是磁盘中呢?

    这就需要一张表格来记录了,这就是页表。

    页表第一列valid 如果是0表示该虚拟页未被缓存,1表示已经缓存了数据。

    第二列蓝色的表示数据缓存在内存中,白色的表示数据缓存在磁盘中。

     

    页命中

     

    当cpu要访问PTE2(箭头所指的位置)的数据时,发现valid标志位为1,所以表示该虚拟页已经被缓存了,由于页表中的地址指向内存中的VP2数据块,所以cpu直接从内存中读取数据VP2,这种情况就叫做页命中。

     

    缺页

     

    当cpu要访问PTE3(箭头所指的位置)的数据时,发现valid标志位为0,所以表示该虚拟页未被缓存,这时会触发一个缺页异常,cup根据页表第二列的指针找到磁盘中对应的数据块VP3,然后根据规则选择一个内存中的牺牲页,把VP3覆盖到内存中。

     

    上图中的内存中的vp4被替换成了VP3,valid的值从0变成1。

     

    缺页异常返回后,会重启缺页指令,并更新虚拟地址,cpu再次访问PTE3的时候就能命中页,取到数据了。

     

    总结

     

    当每个进程创建的时候,内核会为每个进程分配虚拟内存,这个时候数据和代码还在磁盘上,当运行到对应的程序时,进程去寻找页表,如果发现页表中地址没有存放在物理内存上,而是在磁盘上,于是发生缺页异常,于是将磁盘上的数据拷贝到物理内存中并更新页表,下次再访问该虚拟地址时就能命中了。

     

    现在你是不是对虚拟内存的工作原理更加了解了呢?

     

     

     

     

     

                                                                                欢迎关注我的公众号

    展开全文
  • 理解虚拟内存机制

    千次阅读 2016-12-21 13:13:26
    这个系列会总结计算机,网络相关的一些重要的底层原理。很多底层原理大家上学的时候都学过,但是在学校的时候大部分的同学都是为了应付考试而学习,过几天全忘了。随着工作的时间越久,越体会到这些基础知识的重要...

    原文连接:http://blog.csdn.net/iter_zc/article/details/42644229


    这个系列会总结计算机,网络相关的一些重要的底层原理。很多底层原理大家上学的时候都学过,但是在学校的时候大部分的同学都是为了应付考试而学习,过几天全忘了。随着工作的时间越久,越体会到这些基础知识的重要性。做技术和练武功一样,当你到了一定的阶段,也会遇到一个瓶颈,突破了你的眼界就会大不同,突破不了,只能困在原地无法成长。我自己深有体会,这些基础知识,底层原理是助你打破瓶颈的灵丹妙药。当理解了一些底层原理之后,会发现现在很多热门技术,原理,常见的设计都是在底层基础上发展而来的。

    这篇总结一下单机系统的虚拟内存原理。在 聊聊高并发(三十四)Java内存模型那些事(二)理解CPU高速缓存的工作原理这篇中说了CPU高速缓存的一些原理,虚拟内存也是缓存原理的应用,它是单机系统管理内存的手段,很多设计非常经典,在分布式存储系统中可以看到这些原理和设计的应用。

    虚拟内存是单机系统最重要的几个底层原理之一,它由底层硬件和操作系统两者软硬件结合来实现,是硬件异常,硬件地址翻译,主存,磁盘文件和内核的完美交互。它主要提供了3个能力:

    1. 给所有进程提供一致的地址空间,每个进程都认为自己是在独占使用单机系统的存储资源
    2. 保护每个进程的地址空间不被其他进程破坏,隔离了进程的地址访问
    3. 根据缓存原理,上层存储是下层存储的缓存,虚拟内存把主存作为磁盘的高速缓存,在主存和磁盘之间根据需要来回传送数据,高效地使用了主存

    本文包括几块内容
    • 虚拟地址和物理地址
    • 页表
    • 地址翻译
    • 虚拟内存相关的数据结构
    • 内存映射

    虚拟地址和物理地址


    对于每个进程来说,它使用到的都是虚拟地址,每个进程都看到一样的虚拟地址空间,对于32位计算机系统来说,它的虚拟地址空间是 0 - 2^32,也就是0 - 4G。对于64位的计算机系统来说,理论的虚拟地址空间是 0 - 2^64,远高于目前常见的物理内存空间。虚拟地址空间不需要和物理地址空间一样大小。Linux内核把虚拟地址空间分为两部分: 用户进程空间和内核进程空间,两者的比例一般是3:1,比如4G的虚拟地址空间,3G用户用户进程,1G用于内核进程。


    下图是一个典型的Linux进程的虚拟地址空间分布


    在说CPU高速缓存的时候说过CPU只直接和寄存器和高速缓存打交道,CPU在执行进程的指令时要取一个实际的物理地址的值的时候主要有几步:
    1. 把进程指令使用的虚拟地址通过MMU转换成物理地址
    2. 把物理地址映射到高速缓存的缓存行
    3. 如果高速缓存命中就返回
    4. 如果不命中,就产生一个缓存缺失中断,从主存相应的物理地址取值,并加载到高速缓存中。CPU从中断中恢复,继续执行中断前的指令
    所以高速缓存是和物理地址相映射的,进程指令中使用到的是虚拟地址

    操作系统内存管理

    在缓存原理中,数据都是按块来进行逻辑划分的,一次换入/换出的数据都是以块为最小单位,这样提高了数据处理的性能。同样的原理应用到具体的内存管理时,使用了(page)来表示块,虚拟地址空间划分为多个固定大小的虚拟页(Virtual Page, VP),物理地址空间划分为多个固定大小的物理页(Physical Page, PP), 通常虚拟页大小等于物理页大小,这样简化了虚拟页和物理页的映射。虚拟页的大小通常在4KB - 2MB之间。在JVM调优的时候有时候会使用2MB的大内存页来提高GC的性能。

    要明白一个重要的概念:
    1. 对于CPU来说,它的目标存储器是物理内存,使用高速缓存做物理内存的缓存
    2. 同样,对于虚拟内存来说,它的目标存储器是磁盘空间,使用物理内存做磁盘的缓存
    所以,从缓存原理的角度来理解,在任何时刻,虚拟页的集合都分为3个不相交的子集:
    1. 未分配的页,即没有任何数据和这些虚拟页关联,不占用任何磁盘空间
    2. 缓存的页,即已经分配了的虚拟页,并且已经缓存在具体的物理页中
    3. 未缓存的页,即已经为磁盘文件分配了虚拟页,但是还没有缓存到具体的物理页中

    虚拟内存系统和高速缓存系统一样,需要判断一个虚拟页面是否缓存在DRAM(主存)中,如果命中,就直接找到对应的物理页。如果不命中,操作系统需要知道这个虚拟页对应磁盘的哪个位置,然后根据相应的替换策略从DRAM中选择一个牺牲的物理页,把虚拟页从磁盘中加载到DRAM物理主存中

    虚拟内存的这种缓存管理机制是通过操作系统内核,MMU(内存管理单元)中的地址翻译硬件和每个进程存放在主存中的页表(page table)数据结构来实现的


    页表


    页表(page table)是存放在主存中的,每个进程维护一个单独的页表。它是一种管理虚拟内存页和物理内存页映射和缓存状态的数据结构。它逻辑上是由页表条目(Page Table Entry, PTE)为基本元素构成的数组。
    1. 数组的索引号对应着虚拟页号
    2. 数组的值对应着物理页号
    3. 数组的值可以留出几位来表示有效位,权限控制位。有效位为1的时候表示虚拟页已经缓存。有效位为0,数组值为null时,表示未分配。有效位为0,数组值不为null,表示已经分配了虚拟页,但是还未缓存到具体的物理页中。权限控制位有可读,可写,是否需要root权限

    聊聊高并发(三十四)Java内存模型那些事(二)理解CPU高速缓存的工作原理这篇中解释了缓存相联度的概念,DRAM缓存是全相联的,即只有一组,任意的缓存行可以缓存任意的内容,有一个比较判断的过程,即任意的虚拟页可以对应任意的物理页。

    DARM缓存的命中称为页命中,不命中称为缺页。举个例子来说,
    1. CPU要访问的一个虚拟地址在虚拟页3上(VP3),通过地址翻译硬件从页表的3号页表条目中取出内容,发现有效位0,即没有缓存,就产生一个缺页异常
    2. 缺页异常调用内核的缺页异常处理程序,它会根据替换算法选择一个DRAM中的牺牲页,比如PP3。PP3中已经缓存了VP4对应的磁盘文件的内容,如果VP4的内容有改动,就刷新到磁盘中去。然后把VP3对应的磁盘文件内容加载到PP3中。然后更新页表条目,把PTE3指向PP3,并修改PTE4,不再指向PP3.
    3. 缺页异常处理程序返回后重新启动缺页异常前的指令,这时候虚拟地址对应的内容已经缓存在主存中了,页命中也可以让地址翻译硬件正常处理了
    磁盘和主存之间传送页的活动叫做交换(swapping)或者页面调度(页面调入,页面调出)。现代操作系统都采用按需调度的策略,即不命中发生时才调入页面。操作系统都会在主存中分配一块交换区(swap)来作缓冲区,加速页面调度。

    由于页的交换会引起磁盘流量,所以具有好的局部性的程序可以大大减少磁盘流量,提高性能。而如果局部性不好产生大量缺页,从而导致不断地在磁盘和主存交换页,这种现象叫缓存颠簸。可以用Unix的函数getrusage来统计缺页的次数

    现代操作系统都采用多级页表的方式来压缩页表的大小。举个例子,
    1. 对于32位的机器来说,支持4G的虚拟内存大小,如果每个页是4KB大小,那么采用一级页表的话,需要10^6个页表条目PTE。32位机器的页表条目是4个字节,那么页表需要4MB大小的空间。
    2. 假设使用4MB大小的页,那么只需要10^3个页表项。假设每个4MB大小的页又分为4KB大小的子页,那么每个4MB大小的页需要10^3个的页表项来指向子页。也就是说可以分为两级页表,第一级页表项只需要4KB大小的页表项,每个一级页表项又指向一个4KB大小的二级页表,二级页表项则指向实际的物理页。
    页表项加载是按需加载的,没有分配的虚拟页不需要建立页表项, 所以可以一开始只建立一级页表项,而二级页表项按需创建,这样大大压缩了页表的空间。

    使用k级页表项的地址翻译如下:


    Core i7采用4级页表的结构:



    地址翻译


    地址翻译就是把N个元素的虚拟地址空间(VAS)映射到M个元素的物理地址空间(PAS)的过程。下表是地址翻译时用到的符号


    下面看一下CPU如何把一个虚拟地址翻译到对应的物理地址。
    1. CPU有一个专门的页表基地址寄存器(page table base register, PTBR)指向当前页表的基地址,从而可以快速定位到该进程的页表
    2. n位的虚拟地址划分为p位的虚拟地址偏移量VPO和(n - p)位的虚拟页号VPN
    3. 物理地址同样划分为p位的物理地址偏移量PPO和(m - p)位的物理页号PPN
    4. 由于虚拟页大小和物理页大小相同,所以VPO = PPO

    页面的命中完全由硬件完成,缺页则由硬件和内核共同完成,已经在上面举例说明了。

    为了提高地址翻译的效率,地址翻译硬件还引入了一个硬件设备来缓存页表条目PTE,叫做翻译后备缓冲区TLB(translation lookaside buffer)。它是一个小的,虚拟寻址的缓存,每一行都保存一个由单个PTE组成的块。TLB也遵循缓存的设计原理,分为组,行,块的结构。一个虚拟地址映射到TLB的缓存结构如下:

    而TLB的命中和不命中的流程如下:

    Core i7处理器的地址翻译硬件结构如下:
    总结一下地址翻译的过程:
    1. CPU拿到一个虚拟地址,分为两步,先通过页表机制确定该地址所在虚拟页的内容是否从磁盘加载到物理内存页中,然后通过高速缓存机制从该物理地址中取到数据
    2. 地址翻译硬件要把这个虚拟地址翻译成一个物理地址,从而可以再根据高速缓存的映射关系,把这个物理地址对应的值找到
    3. 地址翻译硬件利用页表数据结构,TLB硬件缓存等技术,目的只是把一个虚拟地址映射到一个物理地址。要记住DRAM缓存是全相联的,所以一个虚拟地址和一个物理地址是动态关联的,不能直接根据虚拟地址推导出物理地址,必须根据DRAM从磁盘把数据缓存到DRAM时存到页表时存的实际物理页才能得到实际的物理地址,用物理页PPN + VPO就能算出实际的物理地址 (VPO = PPO,所以直接用VPO即可)。 PPN的值是存在页表条目PTE中的。地址翻译做了一堆工作,就是为了找到物理页PPN,然后根据VPO页面偏移量,就能定位到实际的物理地址。
    4. 得到实际物理地址后,根据高速缓存的原理,把一个物理地址映射到高速缓存具体的组,行,块中,找到实际存储的数据。

    Linux虚拟内存机制



    Linux把虚拟内存划分成区域area的集合,每个存在的虚拟页面都属于一个area。一个area包含了连续的多个页。Linux通过area相关的数据结构来灵活地管理虚拟内存。
    1. 内核为每个进程维护了一个单独的任务结构 task_struct
    2. task_struct的mm指针指向了mm_struct,该结构描述了虚拟内存的运行状态
    3. mm_struct的pgd指针指向该进程的一级页表的基地址。mmap指针指向了vm_area_struct链表
    4. vm_area_struct是描述area结构的一个链表,链表节点的几个重要属性如下:vm_start表示area的开始位置,vm_end表示area的结束位置,vm_prot描述了area内的页的读写权限,vm_flags描述该area内的页面是与其他进程共享还是进程私有, vm_next指向下一个area节点
    在Linux系统中,当MMU翻译一个虚拟地址发生缺页异常时,跳转到内核的缺页异常处理程序。
    1. Linux的缺页异常处理程序会先检查一个虚拟地址是哪个area内的地址。只需要比较所有area结构的vm_start和vm_end就可以知道。area都是一个连续的块。如果这个虚拟地址不属于任何一个area,将发生一个段错误,终止进程
    2. 要访问的目标地址是否有相应的读写权限,如果没有,将触发一个保护异常,终止进程
    3. 选择一个牺牲页,如果牺牲页被修改过,那么把它交换出去。从磁盘加载虚拟页内容到物理页,更新页表

    内存映射机制


    虚拟内存的目标存储器是磁盘,所以虚拟内存区域是和磁盘中的文件对应的。初始化虚拟内存区域的内容时,会把虚拟内存区域和一个磁盘文件对象对应起来,这个过程叫内存映射(memory mapping)。虚拟内存可以映射的磁盘文件对象包括两种:
    1. 一个普通的磁盘文件,文件中的内容被分成页大小的块。因为按需进行页面调度,只有真正需要读取这些虚拟页时,才会交换到主存
    2. 一个匿名文件,匿名文件是内核创建的,内容全是二进制0,它相当于一个占位符,不会产生实际的磁盘流量。映射到匿名文件中的页叫做请求二进制零的页(demand zero page)
    一旦一个虚拟页面被初始化了,它就在一个由内核维护的专门的交换区(swap area)之间换来换去。

    由于内存映射机制,所以一个磁盘文件对象可以被多个进程共享访问,也可以被多个进程对象私有访问。如果是共享访问,那么一个进程对这个对象的修改会显示到其他进程。如果是私有访问,内核会采用写时拷贝copy on write的方式,如果一个进程要修改一个私有的写时拷贝的对象,会产生一个保护故障,内核会拷贝这个私有对象,写进程会在新的私有对象上修改,其他进程仍指向原来的私有对象。


    理解了内存映射机制就可以理解几个重要的函数:

    1. fork函数会创建带有独立虚拟地址空间的新进程,内核会为新进程创建各种数据结构,分配一个唯一的PID,把当前进程的mm_struct, area结构和页表都复制给新进程。两个进程的共享同样的区域,这些区域包括共享的内存映射和私有的内存映射。私有的内存映射区域都被标记为私有的写时拷贝。如果新建的进程对这些虚拟页做修改,那么会触发写时拷贝,为新的进程维护私有的虚拟地址空间。


    2. mmap函数可以创建新的虚拟内存area,并把磁盘对象映射到新建的area。
    mmap可以用作高效的操作文件的方式,直接把一个文件映射到内存,通过修改内存就相当于修改了磁盘文件,减少了普通文件操作的一次拷贝操作。普通文件操作时会先把文件内容从磁盘复制到内核空间管理的一块虚拟内存区域area,然后内核再把内容复制到用户空间管理的虚拟内存area。 mmap相当于创建了一个内核空间和用户空间共享的area,文件的内容只需要在这个area对应的物理内存和磁盘文件之间交换即可。
    mmap也可以通过映射匿名文件的方式来分配内存空间。比如malloc当要求分配的内存大小超过了MMAP_THRESHOLD(默认128kb)时,会使用mmap私有的,匿名文件的方式来分配大块的内存空间。

    后面会详细介绍mmap的机制



    参考资料: 
    《深入理解计算机系统》

    展开全文
  • 深入理解虚拟内存机制

    万次阅读 2018-09-11 18:14:10
    现代操作系统了提供了一种对主存的抽象概念,叫做虚拟内存。它为每个进程提供了一个非常大的,一致的和私有的地址空间。虚拟内存提供了以下的三个关键能力: 它将主存看成是一个存储在磁盘空间上的地址空间的高速...

    原文转载自:https://www.jianshu.com/p/13e337312651

    概述

    现代操作系统了提供了一种对主存的抽象概念,叫做虚拟内存。它为每个进程提供了一个非常大的,一致的和私有的地址空间。虚拟内存提供了以下的三个关键能力:

    1. 它将主存看成是一个存储在磁盘空间上的地址空间的高速缓存,主存中只保存活动区域,并根据需要在磁盘和主存之间来回传送数据。
    2. 它为内阁进程提供了一致的地址空间,简化了内存管理。
    3. 它保护了每个进程的地址空间不被其他进程破坏。

    物理和虚拟寻址

    计算机的主存可以看做是一个由 M 个连续的字节大小的单元组成的数组。每个字节都有一个唯一的物理地址(Physical Address,PA)。第一个字节的地址为 0,接下来的地址为 1,以此类推。CPU 访问内存的最简单的方式是使用物理寻址(physical addressing)。

    物理寻址

     

    该图例的上下文是一条加载指令,塔读取从物理地址 4 处开始的 4 字节字。CPU 在执行这条指令的时候,生成一个有效物理地址,通过内存总线,把这个物理地址传递给主存,主存取出从物理地址4处开始的 4 个字节字,然后将它返回给 CPU,CPU 将它存放在一个寄存器里。早期使用物理寻址的系统通常都比较简单,比如数字信号处理器,计算器等嵌入式设备。

    虚拟寻址

     

    现在处理器采用的是一个程序虚拟寻址(virtual addressing)的寻址方式,如上图所示。CPU 通过生成一个虚拟地址(virtual address,VA)来访问主存,这个虚拟地址在被送到主存之前会先转换成一个物理地址。将虚拟地址转换成物理地址的任务叫做地址翻译(address translation),地址翻译需要 CPU 硬件和操作系统之间的配合。 CPU 芯片上叫做内存管理单元(Menory Management Unit, MMU)的专用硬件,利用存放在主存中的查询表来动态翻译虚拟地址,该表的内容由操作系统管理。

    地址空间

    地址空间(address space)是一个非负整数 地址 的有序合集:{0,1,2,... }

    地址空间

     

    在一个带虚拟内存的系统中,CPU 从一个有 N= 2 的 n 次方 个地址的地址空间中生成虚拟地址,这个地址空间就称为虚拟地址空间:
    {0,1,2,3,...., N-1}。
    一个系统还有一个地理地址空间,对应于系统中物理内存的 M 个字节: {0,1,2,3,..., M-1}。
    一个地址空间的大小通常是由表示最大地址所需要的位数来描述的,比如,一个包含 N = 2 的 n 次方 个地址的虚拟地址空间就叫做一个 n 位地址空间,现代操作系统通常支持 32 位或者 64 位虚拟地址空间。

    虚拟内存做为缓存的工具

    从概念上来说,虚拟内存被组织成为一个由存放在磁盘上的 N 个连续的字节大小的单元组成的数组,也就是字节数组。每个字节都有一个唯一的虚拟地址作为数组的索引。磁盘上活动的数组内容被缓存在主存中。在存储器结构中,较低层次上的磁盘的数据被分割成块,这些块作为和较高层次的主存之间的传输单元。主存作为虚拟内存的缓存。

    虚拟内存(VM)系统将虚拟内存分割成称为虚拟页(Virtual Page,VP)的大小固定的块,每个虚拟页的大小为 P = 2 的 p 次方 字节。同样的,物理内存被分割为物理页(Physical Page,PP),大小也为 P 字节(物理页也称作页帧(page frame))。

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

    1. 未分配的,VM 系统还未分配(或者创建)的页,未分配的页没有任何数据和它们关联,因此不占用任何内存空间。
    2. 缓存的,当前已缓存在物理内存中的已分配页。
    3. 未缓存的,未缓存在物理内存中的已分配页。

    VM系统如何使用主存作为缓存

    上图展示了在一个有 8 个虚拟内存的虚拟内存中,虚拟页 0 和 3 还没有被分配,所以在磁盘上不存在。虚拟页 1,4,6 被缓存在物理内存中。虚拟页 2,5,7 已经被分配了,但是当前并没有缓存在主存中。

    DRAM 缓存的组织结构

    image.png

    我们使用 SRAM 缓存来表示位于 CPU 和 主存之间的 L1, L2 和 L3 高速缓存,使用 DRAM 缓存来表示虚拟内存系统中的缓存,也就是主存。

    在存储器层次结构中, DRAM 比 SRAM 慢个大约 10x 倍,磁盘比 DRAM 慢大约 10, 000x 倍。因此 DRAM 缓存的不命中比 SRAM 缓存中的不命中要昂贵的多,因为 DRAM 缓存不命中需要和磁盘传送数据,而 SRAM 缓存不命中是和 DRAM 传送数据。

    归根到底, DRAM 缓存的组织结构是由巨大的不命中开销驱动的。

    页表

    indexing

    VA 是通过什么方式转成 PA 呢 ?
    同任何缓存一样,虚拟内存系统必须有某种方法来判定一个虚拟也是否缓存在 DRAM 的某个地方。如果命中缓存,那么虚拟内存系统还必须确认这个虚拟页存在哪个物理页中。如果没有命中缓存,那么虚拟内存系统必须判断虚拟页存放在磁盘的哪个位置,在物理内存中选择一个牺牲页,并将虚拟页从磁盘复制到 DRAM,替换这个牺牲页。

    这些功能由软硬件联合提供,包括操作系统软件,MMU 中的地址翻译硬件和一个存放在物理内存中叫页表(page table)的数据结构,页表将虚拟页映射到物理页。每次地址翻译硬件将一个虚拟地址转换成物理地址时都会读取页表。

    Page Tables

    上图展示了一个页表的基本结构,页表就是一个页表条目(Page Table Entry,PTE)的数组。虚拟地址空间中的每个页在页表中都有一个 PTE。在这里我们假设每个 PTE 是由一个有效位(Valid bit)和一个 n 位地址字段组成的。有效位表明了该虚拟页当前是否被缓存在 DRAM 中。如果有效位为 1,那么地址字段就表示 DRAM 中相应的物理页的起始位置,这个物理页缓存了该虚拟页。如果有效位为 0,那么一个 null 地址表示这个虚拟页还未被分配,否则对应的这个地址就指向该虚拟页在磁盘上的起始位置。

    上图所示中一共有 8 个虚拟页和 4 个物理页的页表,4 个虚拟页 VP1, VP2, VP4, VP7 当前被缓存在 DRAM 中,VP0 和 VP5 还未被分配,而剩下的 VP3 和 VP6 已经被分配了,但是当前未被缓存。

    页命中

    image.png

    当 CPU 想要读取 VP2 中的虚拟内存中的一个字时,地址翻译硬件将虚拟地址作为一个索引来定位到 PTE2, 并从主存中读取它。因为 PTE2 设置了有效位,所以 VP2 是缓存在主存中的,所以地址翻译硬件使用 PTE 中的物理内存地址构造出这个字的物理地址。

    缺页

    缺页

    在虚拟内存中,DRAM 缓存不命中称为缺页(page fault)。如上图所示,CPU 引用了 VP3 中的一个字, VP3 并未缓存在 DRAM 中。地址翻译硬件从内存中读取 PTE3, 从有效位判断出 VP3 未被缓存,并且触发了一个缺页异常。缺页异常会调用内核的缺页异常处理程序,该程序会选择一个牺牲页。如下图所示,在这个案例中就是存放在 PP3 中的 VP4。

    牺牲页

    此时如果 VP4 已经被修改了,那么内核程序会将它复制回磁盘。接下来,内核程序从磁盘赋值 VP3 到内存中的 PP3并更新 PTE3。随后返回用户进程。当异常处理程序返回时,它会重启执行导致缺页的指令,该指令会将导致缺页的虚拟地址重新发送到地址翻译硬件。如下图所示,现在 VP3 已经在主存中了,那么就是页命中了。

    页命中

    局部性

    当我们了解了虚拟内存的运作机制之后,是不是觉得虚拟内存的效率会很低呢?因为页面没有命中的代价非常大。是不是担心虚拟内存会影响程序的性能呢?其实虚拟内存运作的非常好。它充分利用了局部性( locality )的原理。

    局部性

    在程序整个运作过程中,程序引用的不同页面的总数可能超出了物理内存的总大小,但是局部性原则可以保证在任意时刻,程序将趋向于在一个较小的活动页面(active page)集合上工作,这个集合被称作工作集(working set)或者常驻集合(resident set)。在程序初始开销之后也就是将工作集页面调入主存,接下来对这个工作集的访问会产生命中,这样就不会产生额外的磁盘消耗。
    如果程序有良好的时间局部性,那么虚拟内存将工作的非常好。如果程序没有良好的时间局部性也就是工作集的大小超出了主存的大小,那么程序将会进入一个称作 抖动(thrashing)的状态,这个时候页面将不断地换进换出,程序会出现性能问题。

    虚拟内存作为内存管理的工具

    虚拟内存大大简化了内存管理,操作系统为每个进程提供了一个独立的虚拟地址空间。

    内存管理工具

    在上图中,进程 1 的页表将 VP1 映射到 PP2, VP2 映射到 PP6。进程 2 的页表将 VP1 映射到 PP8, VP2 映射到 PP6。在这里可以看到多个虚拟页面可以映射到同一个共享的物理页面上。

    按需页面调度和独立的虚拟地址空间的结合,让 虚拟内存简化了链接和加载,代码和数据共享,以及应用程序的内存分配。

    • 简化链接。独立的地址空间允许每个进程的内存映像使用相同的基本格式,而不管代码和数据实际存放在物理内存的何处。
    • 简化加载。虚拟内存使得容易向内存中加载可执行文件和共享对象文件。将一组连续的虚拟页面映射到任意一个文件中的任意位置的表示法称作内存映射(memory mapping)。Linux 提供了一个 nmap 的系统调用,允许应用程序自己做内存映射。
    • 简化共享。独立地址空间为操作系统提供了一个管理用户进程和操作系统自身之间共享的一致机制。一般情况下,每个进程都有自己私有的代码、数据、堆栈。这些内容不与其他进程共享。在这种情况下,操作系统创建页表,将相应的虚拟页映射到不连续的物理页面。
    • 简化内存分配。虚拟内存向用户进程提供一个简单的分配额外内存的机制。当一个用户程序要求额外的堆空间时候,操作系统分配 k 个适当的连续的虚拟内存页面,并且将他们映射到物理内存的中的 k 个任意页面,操作系统没有必要分配 k 个连续的物理内存页面。

    虚拟内存作为内存保护的工具

    虚拟内存大大简化了内存管理,操作系统提供独立的地址空间使得区分不同进程的私有内存变得容易,但是地址翻译机制可以使用一种自然的方式拓展到提供更好的访问控制。每次 CPU 生成一个地址时,地址翻译硬件都会读一个 PTE ,通过在 PTE 上添加一些额外的控制位来控制对一个虚拟页面内容的访问。

    访问控制

    在上图中,每个 PTE 添加了三个控制位, SUP 位表示进程是否必须运行在超级用也就是内核模式下才能访问该页,WRITE 位控制页面的写访问, EXRC 位控制页面的执行。如果有指令违反了这些控制条件,那么 CPU 会触发一个一般保护故障,将控制传递给内核中的异常处理程序。

    地址翻译

    页面命中

    上图中展示了页面命中的场景,CPU 硬件的执行步骤:

    1. 处理器 生成一个虚拟地址,并把它传送给 MMU。
    2. MMU 生成 PTE 地址,并从高速缓存/主存中请求这个 PTE 。
    3. 高速缓存/主存向 MMU 返回 PTE。
    4. MMU 构造物理地址,并把它传送给高速缓存/主存。
    5. 高速缓存/主存返回所请求的数据字给处理器。

    页面命中是全部由硬件来处理的,既然有页面命中,那么就有页面不命中的场景。

    页面不命中

    上图展示了页面不命中的场景, CPU 硬件的执行步骤:

    1. 处理器 生成一个虚拟地址,并把它传送给 MMU。
    2. MMU 生成 PTE 地址,并从高速缓存/主存中请求这个 PTE 。
    3. 高速缓存/主存向 MMU 返回 PTE。
    4. PTE 中的有效控制位为 0 ,所以 MMU 触发了一次异常,传递 CPU 中的控制到操作系统内核中的缺页异常处理程序。
    5. 缺页处理程序确定出物理内存中的牺牲页,如果这个页面已经被修改了,则把它换出到磁盘。
    6. 缺页处理程序调入新的页面,并更新内存中的 PTE。
    7. 缺页处理程序返回原来的进程,再次执行导致缺页的指令, CPU 将引起缺页的虚拟地址重新发送给 MMU ,因为虚拟页面现在存在主存中,所以会命中,主存将请求字返回给处理器。

    地址翻译的过程执行起来太慢了?怎么解决呢?答案你应该也猜到了,就是添加缓存。在 MMU 中包含了一个 TLB (Translation Lookaside Buffer)缓存。

    TLB 命中

    我们来看看 TLB 命中的场景,

    • 第 1 步 CPU 产生一个虚拟地址
    • 第 2 和 3 步 MMU 从 TLB 中取出对应的 PTE 。
    • 第 4 步 MMU 将这个虚拟地址翻译成一个物理地址,并且将它发送到高速缓存/主存。
    • 第 5 步 高速缓存/主存将所请求的数据字返回 CPU。

    如下图所示,当 TLB 不命中的时候, 多了步骤 3 和 4 ,MMU 必须从 L1 缓存中取出对应的 PTE , 新取出的 PTE 存放在 TLB 中,可能会覆盖一个已经存在的 PTE 。

     

    TLB 不命中

    总结

    虚拟内存对于计算机系统来说是核心的,虚拟内存也是强大的,同时虚拟内存也是危险的。虚拟内存还包括多级页表,内存映射,动态内存分配,垃圾收集等等内容。限于篇幅,这里只是叙述了一些基本的概念,帮助程序员理解 虚拟内存 这个概念,对具体细节不做深究。若是有兴趣的话,可以参考 《深入理解计算机系统》书籍,了解更多关于计算机虚拟内存要点。

    参考

    本文是华盛顿大学的公开课 《 The Hardware / Software Interface 》的课程笔记,该课程的参考书籍是大名鼎鼎的 CSAPP 也就是《 深入理解计算机系统 》这书。文章截图来源于课程,文章的内容也参考了 CSAPP 的书本内容。

    1. https://courses.cs.washington.edu/courses/cse351/17wi/videos.html
    2. https://book.douban.com/subject/26912767/



    作者:要上班的斌哥
    链接:https://www.jianshu.com/p/13e337312651
    來源:简书
    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

    展开全文
  • 虚拟内存、分页机制

    千次阅读 2019-08-13 19:34:32
    虚拟内存1.1 linux进程内存布局内核空间(kernel space)(1G)用户空间(3G)1.2 分页1.3 页表页表项的结构1.4 加速分页过程转换检测缓冲区软件TLB管理1.5 针对大内存的页表多级页表倒排页表 1. 虚拟内存 虚拟内存...

    1. 虚拟内存

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

    1.1 linux进程内存布局

    进程内存空间通过分段存储来管理
    在这里插入图片描述

    内核空间(kernel space)(1G)

    内核总是驻留在内存中,是操作系统的一部分。内核空间为内核保留,不允许应用程序读写该区域的内容或直接调用内核代码定义的函数。

    用户空间(3G)

    • 环境变量(environment variables)
    • 命令行参数(command-line arguments)
    • 栈(stack)
      栈又称堆栈,由编译器自动分配释放,用来存储临时数据和栈帧。
    • 内存映射段(memory mapping segment)
      将硬盘文件的内容直接映射到内存,内存映射是一种方便高效的文件I/O方式, 因而被用于装载动态共享库。
    • 堆(heap)
      堆用于存放进程运行时动态分配的内存段。
    • BSS段(bss segment)
      静态内存分配,保存未初始化的全局及静态变量(皆为0),可读可写。
    • 数据段(data segment)
      静态内存分配,保存已初始化的全局及静态变量,可读可写。
    • 代码段(text segment)
      保存可执行机器码和常量,可读不可写可执行。
    • 保留区(reserved)(32位cpu下占128M)
      位于虚拟地址空间的最低部分,未赋予物理地址。任何对它的引用都是非法的,用于捕捉使用空指针和小整型值指针引用内存的异常情况。
             它并不是一个单一的内存区域,而是对地址空间中受到操作系统保护而禁止用户进程访问的地址区域的总称。
             在32位X86架构的Linux系统中,用户进程可执行程序一般从虚拟地址空间0x08048000开始加载。该加载地址由ELF文件头决定
             交换分区:在物理内存满时, 如果还需要内存资源,内核则把物理内存中非活动的页面放到交换分区中。

    1.2 分页

           大部分虚拟内存系统中都使用一种称为分页的技术。

           由程序产生的地址称为虚拟地址,它们构成了一个虚拟地址空间。在没有虚拟内存的计算机上,系统直接把虚拟地址送到内存总线上,读写操作使用具有相同地址的物理内存字;而在使用虚拟内存的情况下,虚拟地址不是被直接送到内存总线上,而是被送到内存管理单元(Memory Management Unit,MMU),MMU把虚拟地址映射为物理内存地址。
           虚拟地址空间按照固定大小划分成被称为页面(page)的若干单元。在物理内存中对应的单元称为页框。页面和页框的大小通常是一样的。实际系统中的页面大小从512字节到1GB。
           栗子:一页4KB,64KB的虚拟地址空间和32KB的物理内存可得到16个虚拟页面和8个页框。从虚拟地址到物理地址的流程:
    在这里插入图片描述
           在上图中,虚拟地址8196(二进制是0010 0000 0000 0100),输入的16位虚拟地址被分为4位的页号和12位的偏移量。4位的页号可以表示16个页面,12位的偏移量可以为一页内的全部4096个字节编址。
           可用页号作为页表的索引,以得出对应于该虚拟页面的页框号。如果“在/不在”位是0,则引起缺页中断。如果该位是1,则将在页表中查到的页框号复制到输出寄存器的高3位中,再加上输入虚拟地址的低12位偏移量。如此就构成了15位的物理地址。输出寄存器的内容随即被作为物理地址送到内存总线。
           此处讨论缺页中断(或称为缺页错误)发生的事:假如操作系统访问虚拟页面B产生缺页中断,决定放弃页框1(对应虚拟页面A),那么它将把产生缺页中断所对应的虚拟页面(页面B)装入页框1的起始物理地址,并对MMU映射做两处修改:首先,它要将原来页框1所对应的虚拟页面(页面A)的表项设为未映射,使以后任何对原来虚拟页面(页面A)的访问都导致陷阱。随后,把引起缺页中断(页面B)的的表项设为映射,因此在引起陷阱的指令重新启动时,它将虚拟页面B映射为物理地址页框1中的某个地址。

    1.3 页表

           虚拟地址被分成虚拟页号(高地址)和偏移量(低地址)两部分。不同的划分对应了不同的页面大小。
           虚拟页号可作为页表的索引,以找到该虚拟页面对应的页表项。由页表项可以找到对应的页框。然后把页框号拼接到偏移量的高位端,以替换调虚拟页号,形成送往内存的物理地址。
           页表的目的是把虚拟页面映射为页框,把虚拟地址中的虚拟页面域替换成页框域,从而形成物理地址(本篇博客讨论的情况均不涉及虚拟机,每个虚拟机都需要有自己的虚拟内存,因此页表组织变得很复杂,包括影子页表和嵌套页表)。

    页表项的结构

    在这里插入图片描述

    • 页框号:最重要的就是页框号,页映射的目的就是找到这个值
    • “在/不在”位:是1时表示该表项是有效的,可以使用;是0时则表示该表项对应的虚拟页面现在不在内存中,访问该页面会引起一个缺页中断。
    • 保护位:指出一个页允许什么样的方式访问,最简单的形式是只有一位,0表示读/写,1表示只读;更先进的方式是使用三位,各位分别表示是否启用读、写、执行该页面。
    • 修改位:记录页面的使用情况,在写入一个页时自动设置修改位。如果一个页面已经被修改过(即它是“脏”的),则必须把它写会磁盘。如果没有被修改过(即它是“干净”的),可以直接被丢弃,因为它在磁盘上的副本仍然是有效的。脏位,反映看该页面的状态。
    • 访问位:不论是读还是写,系统都会在该页面被访问时设置访问位。用于页面置换算法中。
    • 禁止该页面被高速缓存:对于映射到设备寄存器而不是常规内存的页面很重要。具有独立的I/O空间而不使用内存映射I/O的机器不需要这一位。

           在任何分页系统中,都需要考虑两个主要问题:

    • 虚拟地址到物理地址的映射必须非常快。
    • 如果虚拟地址空间很大,页表也会很大。

    1.4 加速分页过程

           每次访问内存都需要进行虚拟地址到物理地址的映射,每条指令进行一两次或更多页表访问是必要的。如果执行一条指令需要1ns,页表查询必须在0.2ns之内完成,以避免映射成为一个主要瓶颈。
           现代计算机使用至少32位的虚拟地址。假设页面大小为4KB,32位的地址空间将有100万页,那么页表必然有100万条表项,而且每个进程都需要自己的页表。64位地址空间简直多到超乎你的想象。​

    转换检测缓冲区

           大多数程序总是对少量的页面进行多次的访问,只有很少的页表项会被反复读取,而其他大的页表项很少被访问。利用这种特性有一种解决方案:为计算机设计一个小型的硬件设备,将虚拟地址直接映射到物理地址,而不必再访问页表。这种设备称为转换检测缓冲区(Translation Lookaside Buffers,TLB),有时又称为相联存储器快表。它通常在MMU中,包含少量的表项,在实际中很少会超过256个。每个表项记录了一个页面的相关信息,包括虚拟页号、页面的修改位、保护码和该页锁对应的物理页框,还有另外一位用来记录这个表项是否有效(即是否在使用)。
           TLB的工作过程:将一个虚拟地址放入MMU中进行转换时,硬件首先通过将该虚拟页号与TLB中所有表项同时(并行)进行匹配,判断虚拟页面是否在其中。如果发现在,并且不违反保护码,则将页框号直接从TLB中取出而不必再访问页表。如果违反了保护码,则会产生一个保护错误,就像对页表进行非法操作一样。如果虚拟页号不在TLB中,此时就会去进行正常的页表查询。接着从TLB中淘汰掉一个表项,然后用找到的页表项代替它。当一个表项被清除除TLB时,将修改位复制到内存中的页表项,而除了访问位,其他的值不变。当页表项中从页表中装入TLB中时,所有的值都来自内存。

    软件TLB管理

           现代许多的机器,几乎所有的页面管理都在软件中实现。TLB被操作系统显示地加载,当发生TLB访问失效时,生成一个TLB失效并将问题交给操作系统解决。系统找到该页面,然后从TLB中删除一个项,接着装载一个新的项,最后再执行先前出错的指令。TLB失效比缺页中断更加频繁。
           如果TLB大到(如64个表项)可以减少失效率时,TLB的软件管理就会变得足够有效。
           在减少TLB失效的同时,又要在发生TLB失效时减少处理开销。有时候操作系统能用“直觉”指出哪些页面下一步可能会被用到并预先为它们在TLB中装载表项。
           (软件、硬件)处理TLB失效常用的办法都是找到页表并执行索引操作以定位将要访问的页面。软件做这样的搜索时,通过在内存中的固定位置维护一个大的(如4KB)TLB表项的软件高速缓存(该高速缓存的页面一直保存在TLB中)来减少TLB失效。
           两种不同的TLB失效:

    • 软失效
      一个页面访问在内存中而不在TLB中,此时要做的是更新TLB,不需要产生磁盘I/O。(10~20个机器指令,几纳秒)
    • 硬失效
      页面本身不在内存中(当然也不TLB中),此时需要一次磁盘存取以装入该页面。(几毫秒,硬失效的处理时间往往是软失效的百万倍)
             在也表中查找相应的映射被称为页表遍历
             假设页表遍历没有在进程的页表汇总找到需要的页,从而产生了一个缺页错误,此时有三种可能:
             (1):所需要的页面就在内存中,但未记录在该进程的页表里。比如该页面可能已由其他其他进程从硬盘中调入内存,这种情况只需要把所需要的页面正确映射到页表中,而不是从磁盘调入。这是一种软失效,称为次要缺页错误
             (2):需要从硬盘重新调入页面,这就是严重缺页错误
             (3):程序访问了一个非法地址,根本不需要向TLB中新增映射。此时,操作系统一般会通过报告段错误来终止该程序。只有第三种缺页属于程序错误,其他缺页情况都会被硬件或操作系统以降低性能为代价而自动修复。

    1.5 针对大内存的页表

           怎样解决巨大的虚拟地址空间?两种办法

    多级页表

           32位的虚拟地址被划分为10位的PT1域,10位的PT2域和12位的Offset(偏移量)域。因为偏移量是12位,所以页面大小是4KB,共有220个页面。假设每个进程都占用了4G的线性地址空间,页表共含1M个表项,每个表项占4个字节,那么每个进程的页表要占据4M的内存空间。为了节省页表占用的空间,我们使用两级页表。每个进程都会被分配一个页目录,但是只有被实际使用页表才会被分配到内存里面。一级页表需要一次分配所有页表空间,两级页表则可以在需要的时候再分配页表空间。
           引入多级页表的原因是避免把全部页表一直保存在内存中(特别是一些从不需要的页表)。
    在这里插入图片描述
           在左边的是顶级页表(页目录表),它有1024个表项,对应于10位的PT1域。当一个虚拟地址被送到MMU时,MMU首先提取PT1域并把该值作为访问顶级页表的索引。因为整个4GB(即32位)虚拟地址空间已经按4KB大小分块,所以顶级页表中这1024个表项的每一个都表示4M的块地址范围。二级页表的每一项都表示4KB的地址范围。Offset对4096个地址进行编址。
           由索引顶级页表得到的表项中含有二级页表的地址或页框号。顶级页表的表项0指向程序正文的页表,表项1指向数据的页表,表项1023指向堆栈的页表,其他的表项未用,现在把PT2域作为访问选定的二级页表的索引,以便找到该虚拟页面的对应页框号。
           虽然虚拟地址空间超过100万个页面,实际上只需要4个页表:顶级页表,0-4M(正文段),4M-8M(数据段)和顶端4M(堆栈段)的二级页表。顶级页表中1021个表项的“在/不在”都设成0,当访问他们时强制产生一个缺页中断。
           二级页表可扩充为三级、四级或更多级。级数越多,灵活性就越大。
           页目录指针表。每一级的页表项由32位扩展到了64位,这样处理器就能寻址到4GB以外的地址空间。

    倒排页表

    展开全文
  • 虚拟内存

    2019-06-20 12:45:46
    虚拟内存 计算机系统使用的各种内存管理策略。所有这些策略都为同一目的:同时将多个进程存放在内存中,以便多道程序设计。不过,这些策略都需要在进程执行之前将整个进程放在内存中。 虚拟内存技术允许执行进程...
  • 首先我们需要先了解什么是虚拟内存。我们知道电脑的硬件中有内存条(物理内存)、硬盘,当内存条中的空间不足时操作系统会从硬盘中分配一部分空间当作内存来使用。因内存和硬盘读写速度差异太大,所以当启用虚拟内存...
  • 虚拟内存与物理内存的联系与区别

    万次阅读 多人点赞 2018-08-30 11:55:36
    操作系统有虚拟内存与物理内存的概念。在很久以前,还没有虚拟内存概念的时候,程序寻址用的都是物理地址。程序能寻址的范围是有限的,这取决于CPU的地址线条数。比如在32位平台下,寻址的范围是2^32也就是4G。并且...
  • 虚拟内存与物理内存的区别,

    万次阅读 多人点赞 2016-11-05 22:23:39
    每个进程都有自己独立的4G内存空间,各个进程的内存空间具有类似的结构    2.一个新进程建立的时候,将会建立起自己的内存空间,此进程的数据,代码等从磁盘拷贝到自己的进程空间,哪些数据在哪里,都由进程控制...
  •   ... ...3、【高级】-【性能】-【设置】-【高级】-【虚拟内存】-【更改】,如下2图:     4、取消自动管理所有驱动器的分页文件大小,手动输入自定义大小即可,如下2两图:  ...
  • Windows Server2012虚拟内存设置

    万次阅读 2017-05-08 21:26:10
    买了个1核1G RAM的Windows 2012,今天准备装IIS的时候出现了“无法打开运行空间池,服务器管理器winrm插件可能已损坏或丢失”,“线程未启动”等问题,网上的说法是由于ECS内存不够引起的,可以通过设置虚拟内存来...
  • 虚拟内存设置误区及正确方法

    千次阅读 2018-01-26 16:14:22
    虚拟内存是计算机系统内存管理的一种技术。如果计算机缺少运行程序或操作所需的随机存取内存 (RAM),则 Windows 使用虚拟内存(Virtual Memory)进行补偿。虚拟内存将计算机的 RAM 和硬盘上的临时空间组合在一起。...
  • 虚拟内存: 电脑中所运行的程序均需经过内存执行,若执行的程序占用的内存很大很多,则会导致内存消耗殆尽,为解决该问题,WINDOWS运用了虚拟内存技术,即拿出一部分硬盘空间来充当内存使用,这部分空间即称为虚拟...
  • 梅林固件设置虚拟内存

    万次阅读 2018-11-25 10:50:38
    网件R6400自带的虚拟机内存只有250MB,内存不够怎么添加呢? 准备 准备一个u盘,将塔查道路由器上 ...虚拟内存" 查找u盘,找到对应的设备名,例如/dev/sda1 admin@R6400-ACF7:/tmp# df -h Filesystem ...
  • 虚拟内存机制

    万次阅读 2017-11-13 14:23:24
    虚拟内存机制 1.为什么要有虚拟内存 在早期的计算机中,是没有虚拟内存的概念的。我们要运行一个程序,会把程序全部装入内存,然后运行。 当运行多个程序时,经常会出现以下问题: 1)进程地址空间不隔离,...
  • 分页内存管理——虚拟地址到物理地址的转换

    万次阅读 多人点赞 2017-11-04 16:07:43
    引子:这是逻辑地址(虚拟地址),包括程序中打印的变量地址显示的都是逻辑地址,并不是内存空间上的物理...一、物理内存和虚拟内存我们先来了解一下,什么是物理内存,什么又是虚拟内存? 1.物理内存:指通过物理内存
  • Chrome是吃内存大户,而且需要虚拟内存的支持!需要虚拟内存的支持!需要虚拟内存的支持! 所以如果出现标题所说的三个问题,把虚拟内存设置大一些即可!
  • 最近一直在VMware workstation中使用ubuntu,当使用一段时间后,发现ubuntu总是反应...感觉上应该是vmware会统计内存中数据的使用情况,将不常用的放入本地硬盘上,以节省内存。我的主机内存足够大,希望虚拟机总是提高
  • 虚拟化技术详解

    万次阅读 多人点赞 2018-08-08 11:06:42
    看到这篇文章的朋友,大部分应该都用过虚拟化软件,然后才会想知道虚拟化技术的。windows下的常用的虚拟化技术有VmWare,VirtualBox等等,那么这篇文章将会...虚拟内存 内存的虚拟化 硬盘虚拟化 网络虚拟化 ...
  • 当我们电脑当中的物理内存不足的时候,我们可以通过电脑系统当中的虚拟内存来设置虚拟内存,把虚拟内存设置大一些,这样能够在一定程度上缓解内存不足的压力,那么win7系统怎么添加虚拟内存呢?今天为大家分享win7...
  • 查看linux虚拟内存大小

    千次阅读 2008-06-11 20:15:00
    free 命令
1 2 3 4 5 ... 20
收藏数 508,683
精华内容 203,473
关键字:

虚拟内存