第三章 内存管理概念部分

1 基本原理和要求

1 内存管理的功能

  1. 内存空间的分配与回收
  2. 地址转换
  3. 内存空间的扩充
  4. 存储保护
    0PHSu4.png
    0P7j3T.png

2 程序装入和链接

  1. 静态链接
  2. 装入时动态链接
  3. 运行时动态链接

3 装入内存的三种方式

  1. 绝对装入
    • 编译时,编译程序产生绝对地址的目标代码,
    • 只适用于单道程序环境
    • 绝对地址可在编译或汇编时给出,也可由程序员直接赋予
    • 通常情况下,程序中采用的是符号地址,然后再转换为绝对地址
  2. 可重定位装入
    • 指令中使用的地址,数据的地址都是相对于起始地址的逻辑地址
    • 装入时才重新定位,将逻辑地址转换为物理地址(地址变换是在装入时一次完成的)
    • 一个作业装入内存时必须分配完所有的内存空间,若果不足,就不能装入
    • 在运行期间不能移动,也不可再申请新的内存
  3. 动态运行时装入
    • 编译链接后的装入模块的地址都是从0开始的
    • 装入模块装入内存后不会立刻把逻辑地址转换为物理地址,而是把逻辑地址转换为物理地址的过程推迟到程序真正运行时
    • 需要重定位寄存器,存放装入模块存放的起始地址
    • 允许程序在内存中移动

4 关于链接和装入的理解(☆)

不是说上面的链接和装入是一一对应的,静态链接不是说就非得和静态装入(绝对装入)是一块儿的,绝对装入现在都不用了,但是静态链接我们还是用的就可以说明这一问题.
链接是针对程序在磁盘中的,比如静态链接的程序是用到的模块已经固定好啥样了,就像这样
0P2zTS.png
然后怎么装入就看哪种方式,现在的应该都是动态装入
静态装入:
0PWWVK.png
假设有一个没有错误(err.o),使用动态装入:
0PWqqP.png
如果动态链接:
0PoVgg.png
装入后:
0Po3CT.png
装入是怎样将链接好后的程序装入到内存里,当然也可能是没有链接好,但是编译通过了(毕竟动态链接)
0PTcWT.png

2 覆盖和交换

覆盖与交换技术是在多道程序环境下用来扩充内存的两种方法
0POkee.png
0PLbsU.png

3 连续分配管理方式

连续分配:系统为用户进程分配的必须是一个连续的内存空间

1 单一连续分配

一般无需内存保护
优点:简单,无外部碎片,可采用覆盖技术,不需要额外的技术支持
缺点:只适用于单用户,单任务,有内部碎片,利用率低

2 固定分区分配

分类:

  1. 分区大小相等
  2. 分区大小不等
    优点:可用于多道程序的最简单的存储分配,无外部碎片
    缺点:不能实现多进程共享一个主存区,所以利用率低,存在内部碎片(当程序小于固定分区大小,也占用一个完整的内存分区,这样分区内部就存在空间浪费,这种现象称为内部碎片);程序可能太大而放不进任意一个分区中,此时用户不得不使用覆盖技术来使用内存空间

3 动态分区分配

0it6pD.png

内部碎片,外部碎片

动态分配没有内部碎片
0ikxxg.png
当剩余的内存空间可以满足某进程,但是由于是不连续的碎片,可以采用紧凑(拼凑Compaction)技术来解决

1 使用的数据结构

  1. 空闲分区表
  2. 空闲分区链
    0iFZkV.png

2 分配与回收

  1. 分配
    1. 如果那一块未满就更新一下
    2. 如果恰好那一块一样大,就删除表项或结点
  2. 回收
    1. 回收区前面有就俩合并,后面有也是,如果前后都有,就三个都合并
    2. 前后都没,插入一个表项
  3. 适合重定位装入方式,因为连续,且可以移动

动态分区分配算法

0iaEY6.png

4 非连续分配管理方式

1 基本分页存储管理方式

1 分页存储知识点:

0iIUiV.png
0i4neI.png
0i48Sg.png
0i4Nmn.png
0i4BfU.png
0i4fk6.png

2 基本地址变换机构

0A4sr4.png

3 具有块表的地址变换机构

  1. 进程切换时,快表被清楚
  2. 查询未命中,访问两次内存,查询命中访问一次
  3. 快慢表同时注意以下:
    0A73He.png
  4. 局部性原理
    0A7oE4.png
  5. 总结
    0AHkxP.png

4 两级页表

  1. 单级页表的问题
    1. 页表必须连续分配,当页表过大时,需要占用过多的连续页框
    2. 没有必要让整个页表常驻内存,进程在一段时间内的运行可能只访问几个特定的页面
  2. 访问次数(没有块表机构):
    1. n级页表,访问n+1次内存,如只有一个页表,则先访问页表,得到块号再访问内存单元(这个别忘了),如果2级则访问顶级页表一次,找到下一级页表所在的块号,访问该块号得到二级页表,找到要访问的内存块号,最后访问内存单元
  3. 一个页表最多只能占用一个页面,两级不够就继续分
  4. 总结
    0uzIaQ.png

2 基本分段存储管理

1 逻辑地址结构

段号 段内偏移量

2 表项结构

段号 段长 本段在主存的始址

3 寻址过程

0lZdBQ.png

3 段页式管理方式

0uzIaQ.png