计算机基础-内存管理

计算机基础-内存管理

整理自<< 现代操作系统 >> 一书第四版第3章内存管理,文字有所修改,使得内容更加通俗易懂.

地址空间

  1. 地址空间:一个进程可用于寻址内存的一套地址集合,每一个进程都有一个自己的地址空间,并且这个地址空间独立于其他进程的地址空间.
  2. 每一个CPU配置的两个特殊硬件寄存器,通常叫做基址寄存器界限寄存器,当使用基址寄存器和界限寄存器时,程序装载到内存中连续的空闲位置且装载期间无需重定位.当一个进程运行时,程序的起始物理地址装载到基址寄存器中,程序的长度装载到界限寄存器中.每次一个进程访问内存,取一条指令,读或者写一个数据字,CPU硬件会在把地址发送到内存总线前,自动把基址值加到进程发出的地址值上,同时检查程序提供的地址是否等于或者大于界限寄存器里面的值.如果访问的地址超过了界限,会产生错误并且中止访问.

处理内存超载

  1. 交换技术:把一个进程完整调入内存,使该进程运行一段时间,然后把他存回磁盘.
  2. 虚拟内存:使程序在只有一部分被调入内存的情况下运行.

空闲内存管理

  1. 在动态分配内存时,操作系统必须对其进行管理.一般来收有两种方法可以实现跟踪内存使用情况:位图和空闲区链表.
  2. 位图:内存可能被划分成小到几个字或大到几千字节的分配单元,每一个分配单元对应于位图的一位,0表示空闲,1表示占用(或者相反).
  3. 使用链表储存管理:维护一个记录已分配内存和空闲内存段的链表,其中链表中的一个结点或者包含一个进程,或者包含两个进程间的一块空闲区.下面讨论一下创建/换出进程的几种算法:

    算法 说明
    first fit 沿着链表搜索,找到第一个足够大的空闲区立刻使用,有剩余的部分的话形成新的空闲区.
    next fit 基本算法和first fit相同,但是搜索不是从链表头开始,而是从上次结束的位置开始,这也说明每一次找到合适的位置都会做相应的标记.
    best fit 顾名思义找出空闲空间最接近实际需要的空闲区.
    worst fit 总是使用空闲空间最大的空闲区
    quick fit 为常用大小的空闲区维护单独的链表

初识虚拟内存

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

分页

  1. 大部分虚拟内存系统都使用一种叫分页的技术.
  2. 程序产生的地址称为虚拟地址,他们构成了虚拟地址空间,在没有虚拟内存的电脑上,系统直接地址送到内存总线上,读写操作使用具有同样地址的物理内存字;但是如果使用了虚拟内存,虚拟地址会被送到内存管理单元(MMU)中,MMU再把虚拟地址映射为物理地址.
  3. 简单例子:一台16位的计算机,计算可知它的虚拟地址范围为0 - 64K-1,但是实际上这台电脑的物理内存只有32KB,说明即使可以编写64KB大小的程序,但是它却不可以完全调入内存运行.磁盘上必须有一个最多64KB的程序副本,保证程序片断在需要的时候调入内存.
  4. 页面:虚拟地址空间按照固定大小划分为若干的单元.
  5. 页框:在物理内存中对应的单元称为页框.页面和页框一般来说大小是一样的.
  6. RAM和磁盘之间的交换总是以整个页面为单元进行的.
  7. 缺页错误(page fault):程序访问了一个未被映射的页面.解决:操作系统使用替换算法找到一个页框,把它写入进磁盘上(它有可能不在磁盘中存在或者它的内容改变过需要更新磁盘),再把要访问的页面读到替换出去的页框中,修改映射关系,重新执行指令.
  8. 虚拟地址到物理地址的映射:①虚拟地址划分为虚拟页号(高位)和页面偏移量(低位),页号用作页表的索引,以找到对应的页表项.②页表项可以找到页框号,拼接到偏移量的高位部分(即替换掉虚拟页号),形成物理地址.因此.页表的功能就是把虚拟页面映射为页框.
  9. 页表项结构:页框号 + present bit + protection bit + modified/dirty bit + referenced bit…
  10. 因为引入了页表,而页表是在内存中的,要访问内存也就意味着要访问页表,即比不使用分页的情况下多访问一次内存,于是采用TLB来加快访问内存的速度.TLB通常在MMU中,包含经常使用到的表项.表项除了多出来的虚拟页号,其他域和页表项中的域是一一对应的,还有一位用来记录这个表项是否有效.
  11. TLB工作过程:①虚拟地址放入MMU进行转换,硬件先将该虚拟页号和TLB中的所有表项进行匹配,若发现有效的匹配且不违反保护位,那么直接将页框号从TLB中取出而不需要再访问内存.②如果虚拟页号不在TLB中,那么会进行正常的页表检查,接着从TLB中淘汰一个表项,用新找到的表项替换它.

针对大内存的页表

  1. 多级页表:虚拟地址划分为多级页表域(如PT1.PT2…)和页内偏移量.
  2. 多级页表工作过程:虚拟地址送到MMU,先提取PT1域并作为访问顶级页表的索引,索引顶级页表得到的页表项中有二级页表的地址或页框号,然后,把PT2域作为访问选定的二级页表的索引……最后找出了该虚拟地址对应的页框号或者发生一次page fault.如果找到页框号那么会和偏移量拼接形成物理地址,然后被放到总线上并送到内存.

页面替换算法

  1. 发生page fault时,操作系统需要在内存中选择一个页面将其换出内存.
  2. 下面是常见的页面替换算法

    算法 说明
    最优页面置换 选择替换需要最多条指令后才会执行的页面,但是这个算法难以实现.
    NRU(not recently used)最近未使用页面置换 为页面设置R和M位,表示页面被访问(读或写)和被写入(修改),每一次访问内存就更新这些位.启动一个进程时它的所有页面的这两个位被设置为0,R被定期清零(每次时钟中断时),来区别最近没有被访问的页面和被访问的页面.这算法意思就是在最近的时钟周期中淘汰一个没有被访问但是已经被修改比淘汰一个被频繁使用但是没被修改的页面要好
    FIFO先进先出 选择替换最早放入内存中的页面
    second chance第二次机会置换 仍然使用类似FIFO的结构,检查页面R位,如果为0,说明这个页面又老又没被使用,立刻置换.否则置为0,放入链表尾端,继续寻找一个又老又没被使用的页面进行替换.
    时钟页面置换 所有页面都保存在一个类似钟面的环形链表中,一个表针指向最老的页面,然后使用类似second chance的算法,只是在替换时把新页面放在当前位置,然后表针向前移动一个位置.
    LRU(least recently used)最近最少使用 替换未被使用时间最长的页面

未完待续

猜你喜欢

转载自blog.csdn.net/qq_37993487/article/details/80257226