目录
内存
内存地址及内存地址所存储的数据量(一个字节0x00)
内存的分段
逻辑地址及物理地址
逻辑地址为相对地址
逻辑地址如何转换到物理地址
程序运行
预处理-编译-汇编-链接
装入
- 绝对装入 编译时 提前知道进程起始地址 单道程序环境
- 可重定位装入(静态重定位)在装入时完成地址转换
需要一次性装入所有数据,即需要分配要求的全部连续内存空间,不可以动态申请内存空间 - 动态运行时装入(动态重定位)
地址转换推迟到程序运行时进行,需要重定位寄存器(存入起始地址
链接
链接时将个模块逻辑地址整合为完整的逻辑地址
- 静态链接:链接后直接装入完整的逻辑地址生成可执行文件
- 装入时动态链接:装入时动态进行链接
- 运行时动态链接:运行时动态进行链接,未使用的模块可以不进行链接
内存管理的功能
均由操作系统完成
内存空间的分配与回收
连续分配管理
单一连续分配(单一进程独占用户区) 固定分区分配(多个进程瓜分用户区 存在内部碎片(内存分配给进程但进程未使用的部分)) 动态分区分配(分区大小可变,存在外部碎片(某些空闲分区太小难以利用) 通过空闲分区表或空闲分区链存储空闲空间 使用动态分区分配算法进行分配 ) 通过紧凑技术解决外部碎片)
非连续分配管理方式
分段与分页都是内存管理的方式
- 基本分页存储管理
分页是系统行为,对用户不可见
进程内存逻辑地址划分的页面与内存的页框 两者大小相等 通过页表存储页面与页框的关系 页表存储在PCB(进程控制块中) 逻辑地址到物理地址的转换(找页面号、查页表、确定偏移量 页面大小使用2的整数次幂)
快表(TLB) 联想寄存器用于存储最近使用的页表项(页面号与页框号的对应 即页号与内存块号) 进程切换时会清空 是一种高速缓存即cache 可以加速地址变换的速度 局部性原理 时间局部性以及空间局部性
两级页表
单级页表存储在连续空间中,所需空间大 使用两级页表将页表项进行分组,即为二级表
所需要的页面不在内存时产生缺页中断
-
基本分段存储管理
内存分段 如以函数名作为段名分段及变量分段 每个段占据连续空间,段不相邻 段名与段号对应
段号及段内地址
段的大小由用户的程序决定
分段可以实现信息的共享和保护,如多个进程对同一个代码段中存储数据进行访问(为纯代码或不可冲入代码(即可以供多个进程的共享的部分) -
段页式
先分段再分页
逻辑地址由段号、页号及页号偏移量组成
对内存进行逻辑上的扩充 覆盖(多个模块(同一个进程)使用通过一个覆盖区,程序员申明覆盖结构) 交换(进程在内存与外存之间动态调度,进程的pcb常驻内存 进程的状态 换出外存后挂起 缺页与交换相关 有限换出阻塞态的进程即低优先级的进程) 虚拟存储
实现物理地址和逻辑地址的转换即地址重定位
内存保护,各个进程在各自内存空间进行 设置上下限寄存器 或使用重定位寄存器以及界地址寄存器
由操作系统负责并
管理空闲与非空闲空间
虚拟内存
虚拟内存在外存中,由操作系统统一调配内存及外存对信息的调用
三个特性
- 多次性 作业无需一次性装入内存,而是允许被分成多次调入内存
- 对换性 无需常驻内存,可以在运行过程中进行内外存的换入换出
- 虚拟性 从逻辑上扩充了内存的容量
虚拟内存在非连续分配的存储管理基础上进行,与之对应
- 请求分页式
- 请求分段式
- 请求段页式
需要加入请求调页(将不在内存的信息调入内存)或置换功能(将暂时不用的信息调出内存)
请求分页
- 页表机制
记录页面是否调入,记录已调入页面是否有进行修改(未修改直接覆盖),记录页面所在内存块或页框位置,记录外存地址,访问字段(页面访问情况 判断页面置换) - 缺页中断机构
通过访问页表判断该页面是否存在于内存,若不存在则产生缺页中断,缺页的进程阻塞,调页完成后唤醒。由空闲块进行分配,无空闲块进行置换 缺页中断属于内中断 - 地址变换机构
快慢表一致,在块表则一定在内存中,被换出后快表清楚被换出的页表项
缺页不等于页面置换
最佳置换算法:保证最低的缺页率
先进先出置换算法:通过队列实现 belady异常,内存块的增大可能会导致缺页次数增加
最近最久未使用置换算法LRU:淘汰最近最久未访问的也页面 需要硬件支持,开销大
时钟置换算法(NRU) 最近未用算法:最近访问访问位置为1,缺页时指针发生转动,转动时被循环判断的页面访问位置0。
改进:优先淘汰未被修改的页面,减少写回外存的开销,使用访问位,修改位的标志位组进行判断。先找00(不修改标志位),再找01(修改访问位),扫描过程访问位置0,一轮后先找00,再找01。
页面分配、置换策略
-
驻留集:给进程分配的物理块的集合,即可以使用的内存块
驻留集固定分配以及可变分配 局部置换以及全局置换(置换的内存块是已分配的还是其他空闲内存块的)
全局置换通过一个空闲物理块队列实现,若使用完毕则将其他未锁定的页面换出外存。
可变分配局部置换:在置换算法的基础上通过缺页率判断是否进行新的物理块的分配,即根据缺页率动态减少或增加进程所可以使用的内存块 -
页面的调入
预调页策略:在调入内存时根据局部性原理提前将页面相邻的页面进行调入 一般用于进程开始时
请求调入:即需要时进行调入页面 一般用于进程进行时
内存区、对换区及文件区
抖动现象:刚换出的页面又马上需要换入内存,增加内存块 -
工作集:在某段时间间隔内,进程实际访问的页面的集合 通过检测工作集的大小确定驻留集的大小。 驻留集大小大于工作集。
内存映射文件
可以供多个进程访问同一个文件
将磁盘的文件映射到进程的虚拟地址空间,即以访问内存的方式访问磁盘空间,构建一个文件的虚拟地址以及物理地址的映射表
将多个进程的虚拟地址指向通过一个磁盘地址