操作系统—内存管理
操作系统—内存管理
操作系统中的内存管理是确保程序正确执行的关键环节。本文将详细介绍内存管理的目的、程序的链接与装入过程、逻辑地址与物理地址的区别、内存保护机制以及连续分配管理方式等核心概念。
补充知识
- 210B=1K;220B=1M;230B=1G
- 4GB=4*230个字节=232个地址
- 1B=1字节=8位=8b
内存管理的目的:①方便用户;②提高内存利用率
内存:存放数据 —— 程序执行前需先放到内存中才能被CPU处理
存储单元:用于存放数据的最小单元
1.程序的链接与装入
源代码
*.c
→编译→目标模块
*.o
→链接→ 可执行文件/装入模块(完整的逻辑地址)
*.exe
→装入→ 内存(物理地址)
- 编译:源代码→目标模块
- 链接:目标模块+所需的库函数→完整的装入模块(完整的逻辑地址)
- 装入:将装入模块装入内存运行(物理地址)
程序的链接:把 各个目标模块的逻辑地址 组合形成 完整的逻辑地址
- 程序链接
把各目标模块及它们所需的库函数链接成一个完整的装配模块,以后不再拆开
装入时动态链接(边装入边链接)—— 优点:便于修改和更新,便于实现对目标模块的共享
运行时动态链接:对于某些目标模块,只有在程序执行时需要该目标模块时才进行链接 ——优点:加快程序的装入过程,节省大量内存空间
内存的装入:逻辑地址 → 物理地址
- 绝对装入:只适用于 单道程序环境。在编译时,将产生绝对地址的目标代码
- 可重定位装入(静态重定位):适用 多道程序环境。
必须给装入内存的作业分配要求的全部连续内存空间;作业一旦进入内存,整个运行期间就不能在内存中移动
重定位:在装入时对目标程序中指令和数据地址的修改过程
静态重定位:地址变换通常是在进程装入时一次完成的
- 动态运行时装入(动态重定位)
把地址转换推迟到程序真正要执行时才开始——需要重定位寄存器(存放装入模存放的起始地址)的支持
优点:①允许程序在内存中发生移动;②将程序分配到不连续的存储区;③在程序运行前可以只装入部分代码即可投入运行,在程序运行期间,根据需要动态申请分配内存;④便于程序段的共享
补充知识
可重入程序通过【减少对换数量】来改善系统性能的
2.逻辑地址与物理地址
- 相对地址 / 逻辑地址:编译后,每个目标模块都从0号单元开始编址(相对于进程的起始地址而言的地址)
- 逻辑地址空间 / 虚拟地址空间:当链接程序将各个模块链接成一个完整的可执行目标模块时,链接程序顺序依次按各个模块的相对地址构成统一的从0号单元开始编址
- 物理地址空间:内存中物理单元的集合,是地址转换的最终地址
- 地址重定位:将逻辑地址转换成物理地址
加快虚实地址转换:增大快表TLB容量;让页表常驻内存
3.内存保护
- 在CPU中 设置一对上、下限寄存器。存放用户作业在主存中的下限和上限地址(每当CPU要访问一个地址时,分别和两个寄存器的值相比,判断有无越界)
- 采用重定位寄存器(基地址寄存器)和界地址寄存器(限长寄存器)
重定位寄存器(“加”):存放 进程的起始物理地址。即含最小的物理地址值
界地址寄存器(“比”):存放 进程的最大逻辑地址。即含逻辑地址的最大值
注:①若未发生地址越界,则加上重定位寄存器的值后映射成物理地址,再送交内存单元
②加载重定位寄存器和界地址寄存器时必须使用特权指令,只有操作系统内核才可以加载这两个存储器——不允许用户程序修改这两个寄存器的值
③整个系统设置一个重定位寄存器
4.覆盖与交换 ——扩充内存 ——了解即可
①覆盖
- 解决:程序大小 > 物理内存总和
- 用户空间:固定区 和 若干覆盖区
- 固定区:存放经常活跃的部分
- 覆盖区:存放即将要访问的段 ——其他段放在外存,只有在需要调用前,系统才将其调入覆盖区,替换覆盖区原有的段
- 对用户和程序员不透明
②交换
- 换出:把处于等待状态的程序从内存移到辅存
- 换入:把准备好竞争CPU运行的程序从辅存移到内存
- 优先换出 阻塞进程、优先级低 的进程
- 对换区的I/O速度比文件区更快
- PCB常驻内存
连续分配管理方式
连续分配管理方式:为一个用户程序分配一个连续的内存空间
1.单一连续分配
- 内存:系统区、用户区
- 系统区:仅供操作系统使用,通常在低地址部分
- 用户区:仅有一道用户程序,即整个内存的用户空间由该程序独占
- 优点:简单、无外部碎片
- 缺点:只能用于单用户、单任务的OS,有内部碎片,存储器利用率低
- 注:可采用覆盖技术
2.固定分区分配
固定分区分配:将用户内存空间划分为若干固定大小的区域,每个分区只装入一道作业
- 分区大小相等 ——适合于用一台计算机控制多个相同对象的场合 ——缺乏灵活性
- 分区大小不等
分区分配内存管理方式主要保护措施:界地址保护
分区使用表:用数据结构的数组。按分区大小排队,各表项包括每个分区的起始地址、大小、状态(是否已分配)——分配内存时,便检索该表
- 优点:实现简单,无外部碎片
- 缺点:①程序可能太大而放不进任何一个分区(采用覆盖技术来使用内存空间);②存在内部碎片;③存储空间利用率低
3.动态分区分配
又称 可变分区分配:根据进程的实际需要,动态的为之分配内存(在作业装入时动态建立)
- 优点:无内部碎片
- 缺点:有外部碎片(采用紧凑技术才解决)
动态分区分配策略
动态分区分配策略 空闲分区链接次序 查找要求 评价
首次适应算法First Fit 地址递增 从低地址开始顺序查找 通常是最好、最快的。缺点:出现很多小的空闲分区,增加开销
邻近适应算法Next Fit(循环首次适应算法) 地址递增 从上次查找结束的位置开始继续查找 通常比首次适应算法要查。缺点:小碎片很多
最佳适应算法Best Fit 容量递增 找到第一个能满足要求且最小的空闲分区 性能通常很差。缺点:产生最多的外部碎片(内存碎片)
最坏适应算法Worst Fit 容量递减 找到第一个能满足要求且最大的空闲分区 性能很差缺点:会导致没有可用的大内存块
回收内存(相邻的空闲分区合并,并修改起始地址和大小)
- 若回收区与插入点的前一空闲分区相邻,则合并,并修改合并后表项的大小
- 若回收区与插入点的后一空闲分区相邻,则合并,并修改合并后表项的起始地址和大小
- 若回收区同时与插入点的前、后一空闲分区相邻,则合并,并修改合并后表项的大小
- 若回收区没有相邻的空闲分区,则为回收区新建一个表项,填写起始地址和大小,并插入空闲分区链