zoukankan      html  css  js  c++  java
  • 虚拟内存

    1.虚拟内存

    为什么要提出虚拟内存:

    1)物理内存不够:同时运行的进程太多,需要很多内存,在物理上扩展内存相对有限(内存条都很贵呀),所以提出一种从逻辑上来扩充内存的方法,叫做虚拟内存。

    2)安全隐患:如果全部的进程都放在物理内存上,那么进程访问物理内存的时候很可能会修改到其它进程的内存,甚至修改到内核的内存,这种行为很危险

    2.虚拟地址

      每一个进程都有一个大小一致的、私有的虚拟地址空间,这个地址空间是虚拟的,并非实际存在的。32位CPU一般有32根地址总线,那么就一共可以寻232个地址=也就是4x1024x1024x1024=4G个地址,1个地址对应1字节的存储单位,所以就是4GB,也就是说每个进程都有独立的4GB的虚拟地址空间。

    3.页

      操作系统不是以字节为单位管理内存的,而是以页为单位管理内存,一页通常为4KB

    4.虚拟页和物理页

    1)虚拟地址空间划分为多个固定大小的虚拟页(VP),虚拟页放在磁盘上

    2)物理内存被划分为多个固定大小的物理页(PP),物理页放在物理内存上

    3)虚拟页和物理页的大小是一样的

    4)要明确的是:磁盘上数据必须先读入到内存中才能被cpu处理

    5.虚拟页的分类

    1)未映射(分配)的页:虚拟页还没和磁盘文件确立对应关系

    2)未缓存的页:虚拟页和磁盘文件建立了映射,但是磁盘文件还没有缓存到物理内存上

    3)缓存的页:虚拟页映射到了磁盘文件,并且磁盘文件缓存到物理

    6.页表

      页表是一个数组,常期存放在物理内存中,里面有各虚拟页的状态,是否映射,是否缓存。页表中每一个元素叫做页表条目PTE

    1)数组的下标,表示虚拟页号(图中0、7)

    2)数组的元素由一个有效位和一个地址字段组成:

      有效位为0,表示未缓存的页;有效位为1,表示缓存的页

      地址字段为null,表示未映射的页;为非null,表示物理页号或者磁盘地址,未缓存则为磁盘地址,缓存了则为物理页号

    7.虚拟寻址

    进程执行时,CPU访问虚拟地址时,会有以下情况:

    1)页命中(CPU访问图中的VP2

      CPU把虚拟地址VP2送给MMU(内存管理单元)进行地址翻译(由虚拟地址得到物理地址的这一整个过程):首先得到页表中PTE2的地址,然后读取PTE2的内容,有效位为1,表示VP2是缓存的,再根据地址字段内容获得PP1的物理地址,然后CPU就去访问这个物理地址,获得了数据

    2)缺页(CPU访问VP3

    • CPU把虚拟地址VP3送给MMU(内存管理单元)进行地址翻译,首先得到页表中PTE3的地址,然后读取PTE3的内容,有效位为0,表示VP3并未缓存到物理内存上,这种不命中就叫缺页;
    • 发生缺页异常,内核会进行页面置换:选择一个虚拟页,这里是VP4,作为牺牲页,将PP3中的内容刷新回VP4对应的磁盘地址上,然后将VP3的内容缓存到PP3上,更新页表,PTE3有效位变为1,地址字段变为PP3,PTE4有效位变为0,地址字段变为磁盘地址
    • 缺页异常处理完毕后,CPU重新访问VP3,页命中

    8.页面置换算法

      用来选出牺牲页的算法

    1)最佳置换算法

      选择以后进程将永不使用的虚拟页作为牺牲页,此算法无法实现,一般用来评价其他算法。

    2)先进先出页面置换算法

      淘汰最早缓存在内存中的虚拟页,实现简单性能差,因为显然不科学,人家最早进入内存不代表人家不被进程经常访问。

    3)最近最久未使用页面置换算法(LRU)

      淘汰进程最近一段时间内最长时间未访问过的虚拟页,性能好开销大;每个页都有一个字段,来记录上次被访问以来所经历的时间,页以链表的形式维护,最近最多使用的页在表头,最少使用的在表尾,所以每次访问了内存都要更新这个链表,所以开销大;当发生缺页时,表尾的页为牺牲页

    4)时钟页面置换算法

      又称为最近未使用算法,性能接近LRU开销更小,把所有页都保存在一个类似时钟的环形链表中,每页都有一个使用位R,有一个时钟指针开始时指向最早进入内存的虚拟页;

    1)当某一虚拟页首次装入内存,使用位R设为1;

    2)当发生缺页时,检查时钟指针指向的页的使用位R,R=0则该页为牺牲页,R=1则对改使用位R清0并将指针指向下一位直到找到R=0的页为止

    9.虚拟寻址下的两个问题及解决方案

    1)地址翻译必须非常快

    2)页表可能会在内存中占用很多空间

    解决方案一:TLB加速地址翻译

    1)TLB(Translation Lookaside Buffer)是一个小的、虚拟寻址的缓存,存着少量虚拟页和物理页的对应关系

    2)MMU在进行地址翻译时,先去TLB中匹配,如果TLB中存在,则MMU不用访问页表就能得到翻译结果

    3)如果TLB中不存在,则MMU再去访问页表完成翻译;接着还会再TLB中淘汰一个表项,然后用新找到的页表条目PTE替代它,这样如果这一虚拟页很快再次被访问时,就可以从TLB中快速匹配到

    4)其实TLB技术就是抓住了进程的这么一个特点:进程总是对少量的虚拟页进行多次的访问,也就是说这些虚拟页的页表条目PTE会被反复读取

    解决方案二:多级页表

    1)一级页表在面对巨大的虚拟地址空间时,将会有很多PTE,会占有较多内存,所以引入多级页表机制:只有顶级页表长期在内存中,其余级页表只有在需要时存在,部分低级还可能存在于磁盘上

    2)图a表示该32位操作系统虚拟寻址采用二级页表机制,Offset为12位,则虚拟页的大小为4KB,如果采用一级页表机制则在内存中需要220个PTE来对应

    3)如果这是一个需要12MB内存的进程,底端是4MB的正文段,其上面是4MB的数据段,顶端是4MB的栈,中间4GB-12MB是空闲,采用二级页表机制,顶级页表有210=1024个PTE,其中PTE0、PTE1、PTE1023分别对应正文段、数据段、栈,其余PTE将不会用到

    4)顶级页表的一个PTE对应一张二级页表,空的PTE将不产生二级页表,所以就有3张二级页表,每张二级页表都有210=1024个PTE

    5)所以在二级页表机制下内存中一共有210+210x3=212个PTE,相较与之前的220个PTE来将,大大减少

    参考资料:

    https://www.cnblogs.com/shijingjing07/p/5611579.html

  • 相关阅读:
    Jenkins安装后,安装插件失败。报错SunCertPathBuilderException
    计算机网络
    abaqus
    品优购
    html5 css3
    css定位
    元素的显示与隐藏 / 精灵图
    学成在线案例
    css(3)
    css(2)
  • 原文地址:https://www.cnblogs.com/Joezzz/p/9798899.html
Copyright © 2011-2022 走看看