3.1 内存管理的基本逻辑

  1. 内存管理的功能:

    1. 内存空间的分配与回收:本章最重要的一点
      1. 在程序被调入内存时,选择从哪里被调入,就引出了外存的交换区与文件区和三种取页面方式;
      2. 在程序被调入内存时,选择在何时被调入,就引出了预调页和请求调页两种策略;
      3. 物理内存空间可以被程序连续分配(单一连续,固定分区,动态分区),也可以被非连续分配(页式,段式,段页式,衍生请求式);
        1. 连续分配时,内存不能完全利用,产生内、外部碎片,动态分区时还有4种分配算法
        2. 非连续分配时,只有内部碎片没有外部碎片,程序只在内存中分散存储一小部分代码和数据
          1. 进程所占内存越小并发度越高,因此确定系统给每个进程的页框数有3种策略
          2. 当进程访问页面不在内存时,需要的置换算法有4种
    2. 地址转换:逻辑地址到物理地址,主要是非连续分配的地址计算
    3. 内存的扩充:覆盖,交换,虚拟存储,三种
    4. 存储保护:设置上下限寄存器,或重定位寄存器和界地址寄存
      1. 重定位寄存器是“加” 界地址寄存器是“比”
  2. 程序在内存中的过程:

    1. 编译:将源代码变成目标模块;此处每个模块的地址都是从0开始
    2. 链接:将目标模块与库函数链接在一起形成完整的装入模块;此处地址合在一起才算是逻辑地址
      1. 静态链接:在运行前完整链接库函数,不再拆开
      2. 装入时动态链接:在装入时边装边链接
      3. 运行时动态链接:在程序执行中,需要时才链接,便于修改更新,实现目标模块的共享
    3. 装入:将装入模块放入内存;此处逻辑地址变成物理地址
      1. 绝对装入:逻辑地址等于物理地址;只适用于单道程序
      2. 静态重定位:装入时重定位,要求分配全部空间,进程地址不再改变
      3. 动态重定位:运行时重定位,空间不需要全部,也不需要连续,进程可以移动
    4. image.png

3.2 连续分配管理方式

  1. 内部碎片:是已经被分配出去(能明确指出属于哪个进程)却不能被利用的内存空间
  2. 外部碎片:是还没有被分配出去(不属于任何进程),但由于太小了无法分配
  3. 这样就比较好理解了

3.2.1 单一连续分配

  • 内存中只有一道程序,逻辑地址与物理地址对应,可以采用覆盖技术扩充内存容量

    3.2.2 固定分区分配

  • 内存的分区大小划定就不变,有大小相等的分区块,也有大小不等的分区块

  • 缺点:程序太大,放不进任何分区,也许能用覆盖技术分段运行;程序太小,分区利用率很低

    3.2.3 动态分区分配

  1. 概念:不预先划分内存区块,由程序的具体情况动态划分
  2. 空闲块的使用策略: image.png

    1. 固定分区会产生内部碎片,动态分区会产生外部碎片
  3. 紧凑技术:移动程序,消除外部碎片,动态重定位的运用


3.3 非连续分配管理方式

3.3.1 基本分页存储

  1. 概念:程序分页,内存分块,进程由页向块映射,分配内存
    1. 进程中的为页,物理内存中的为页框、页帧或者物理块,外存中称块
    2. 页面大小指分页的大小KB,页表长度指页表项的个数
    3. 页表由页表项组成,每个页表项的长度是一样的,并没有页号存在,得自己算
  2. 地址转换:
    1. 页号与PCB中的页表长度比较,判断是否越界
    2. 页号是页表始址和页面大小推出来的
    3. 只提供虚拟地址即可找到物理地址,所以页式管理是一维的
  3. 快表:解决多次访存影响速度的问题
    1. 逻辑地址与快表比对,如果相同就直接得出物理地址,如果快表中没有再访存慢表得到物理地址
    2. 一般默认先查TLB再访存,有些会同时访问
  4. 多级页表:解决页表在内存中太占地方的问题

    1. 一个进程一张段表或页目录表,且常驻内存,底层的页表根据情况调入调出
    2. 在地址上的反映,地址还是那个地址,其实就是对分段的地址的理解发生了变化,例如32位逻辑地址,页面大小为4KB,所以页面偏移量为12位,前面的20位在一级页表中表示纯纯的连续页表,占很大的内存,但是如果是多级页表,就可以根据前10位判断页目录号,后10位判断页表号
    3. 当TLB命中时,直接取得页框号,没有多级快表这种东西,TLB中存的本来就是完整的前20位页号
      当TLB缺失时,需要访存取得一级二级页表,再访存取得指令或数据
    4. image.png

      3.3.2 基本分段存储

  5. 概念:程序按自然段划分逻辑空间,段内连续,段间不连续

    1. 段表的段表项也是一样长,段号也是需要自己算的,实际只存了基址和段长
    2. 与分页相比,考虑了用户的编程,信息共享及动态链接的需求
    3. 无法只通过一个逻辑地址得知物理地址,因为分段管理的地址空间是二维的
  6. 地址转换:与页式不同,段号与段表长度比较,看是否越界;偏移量与段长比较,看是否越界

    3.3.3 段页式存储

  7. 概念:程序先按逻辑分段,段中再分页;
    一个程序有一个段表,一个段有一个页表;


3.4 虚拟内存

3.4.1 基本概念

  1. 局部性原理:时间局部性:现在用了待会还要用,例如循环
    空间局部性:现在这一个待会下一个,例如数组
  2. 概念:基于局部性原理,只将一部分程序装入内存,用时再调入内存,不用时调出至外存,原本存不了那么多程序的内存,现在能运行这么多程序,给用户的感觉就像内存增大了很多倍,但其实只是逻辑上的扩大

    3.4.2 请求分页管理方式

  3. 概念:在基本分页的基础上,增加了请求调页和页面置换的功能

  4. 页表机制:对比之前的基本分页,增加了一些标志位
    1. 状态位:显示是否已存入内存,是就为1,不是为0
    2. 访问字段:记录被访问的次数,是置换时的依据
    3. 修改位(脏位):记录是否被更改,改了的话,置换该页时要写回内存
    4. 外存地址:在外存上的地址
  5. 置换算法:

    1. 最佳置换算法:不存在
    2. 先进先出算法:Belady异常
    3. 最近最久未使用:图表法
    4. 时钟置换:保留被访问的,置换没有被访问的;改进后置换顺序(0,0)-(0,1)-(1,0)-(1,1)

      3.4.3 页面分配策略

  6. 驻留集:为进程分配的页框的集合,称为驻留集,具体分多少个页框:

    1. 固定分配局部置换:页框数一定,缺页只能置换
    2. 可变分配全局置换:页框数不定,缺页就给空闲物理块
    3. 可变分配局部置换:动态增减页框数,允许缺页置换
  7. 工作集:现页面前t个页面的无重复集合;反映接下来一段时间里会经常访问的页面
  8. 调入时机:预调页靠预测,用于运行前首次调入;请求调页一次调一页,用于运行中
  9. 从哪里调入:交换区大,文件区复制到交换区,让内存从交换区中取
    交换区小,不会被修改的代码段直接从从文件区拿,可能被修改的在交换区换入换出
    UNIX方式,全从文件区拿,被换出的才放进交换区
  10. image.png
  11. 抖动:换出换进,CPU效率低下,存储器负荷运行;原因是物理块分配少了

**