文章目录
存储器的层次结构
程序的装入和链接
用户程序要在系统中运行,必须先将它装入内存,然后将其转变为一个可以执行的程序
-
编译
-
链接
-
静态链接方式
- 在程序运行之前,将各目标模块及它们所需的库函数链接成一个完整的装配模块,以后不再拆开
-
装入时动态链接
- 边装入边链接
- 便于修改和更新
- 便于实现对目标模块的共享
-
运行时动态链接
- 在运行时进行
- 即:在执行过程中,发现一个被调用的模块未装入内存,立即由OS找出并装入内存,链接到调用者模块上
-
-
装入
-
绝对装入方式
- 使用绝对地址,需要提前知道
-
可重定位装入方式(静态重定位)
- 程序中的其他地址都是相对于起始地址计算的
-
动态运行时的装入方式(动态重定位)
- 在程序真正运行时进行
-
连续分配存储管理方式
为一个用户程序分配一段连续的内存空间
单一连续分配
- 用户区仅装有一道用户程序
固定分区分配
- 分区大小可相等可不等
动态分区分配
-
数据结构
- 空闲分区表:在系统中设置一张空闲分区表,用于记录每个空闲分区的情况
- 空闲分区链:将空闲分区链接成一个双向链
-
分区分配操作
-
固定分区法的内存分配与回收
- 执行完毕后,管理程序将对应的分区状态设为未使用即可
-
动态分区时的分配
- u.size 请求分区大小 m.size 空闲分区大小
- 完成分配后,返回分配区的首地址
- 内存回收:系统根据回收区的首地址,从空闲区链中找到相应的插入点
-
动态重定位分区分配
-
1、紧凑
-
动态重定位
- 系统增设一个重定位寄存器,用来存放程序(数据)在内存中的起始地址。
- 真正的地址= 相对地址 + 寄存器中的地址
对换(Swapping)
定义
- 把内存中暂时不能运行的进程或暂时不用的程序或数据,调出到外存上
- 以便腾出足够的内存空间
- 再把具备运行条件的进程或进程所需要的程序和数据调入内存
两类
- 整体对换
- 页面(分段)对换
分页存储管理方式
页面和物理块
-
页面
- 将进程的地址空间分若干页,并为每页加以编号,从0开始
- 内存空间也分为若干块,编号第0#块、第1#块……
- 进程的最后一页常常装不满一块,形成不可利用的碎片,称为“页内碎片”“内碎片”
-
页面大小
- 过小:虽然会减小内部碎片,但是每个进程占用较多的页面,导致页表过长,占用大量内存
- 一般选2^n 1kb、2kb、4kb
地址结构
页表
- 为能在内存中找到每一个页面所对应的物理块,系统又为每个进程建立了一张页面映像表,简称页表
地址变换机构
-
基本的地址变换机构
-
进程运行期间,需要将用户的逻辑地址变换为内存空间中的物理地址
-
实际上,地址转换时只需求出块号即可
-
为了提高地址变换速度,增设一个具有并行查寻能力的高速缓存寄存器,称为“联想寄存器”或“快表”,在IBM系统中也叫作:地址变换高速缓存TLB
- 运行过程,先在输入寄存器中,快速查找当前页表的页号,如果有匹配的,则读出物理块号b,否则再次访问内存中的页表逐个寻找
-
-
访问内存的有效时间EAT
- EAT = 2*访问一次内存的时间
-
两级和多级页表
-
两级页表:针对难于找到大的连续的内存空间来存放页边的问题,可利用将页表进行分页的方法,为离散分配的页表再建立一张页表,称为外层页表,形成了两级页表
- 为了进行地址映射, 同样需要设置一个外部页表寄存器,存放外层页表的内存起始地址和长度
-
分段存储管理方式
引入
- 方便编程:采用 段名(段号) + 段内偏移量(段内地址)
- 信息共享
- 信息保护:按允许的方式共享信息
- 动态增长
- 动态链接:段式管理是按信息的逻辑意义来划分段,每段对应一个相应的程序模块,因此可用段名+段人口地址来调入相应的段
基本原理
-
分段
- 系统为每个进程建立了一张段映射表,简称“段表”
-
地址结构
-
地址变换机构