第三章
内存的基础知识
内存是用于存放数据的硬件。程序执行前需要先放到内存中才能被CPU处理。
每个内存地址对应一个存储单元。
如果计算机“按字节编址”则每个存储单元大小为1字,即1B,即8个二进制位
如果字长为16位的计算机“按字编址”则每个存储单元大小为1个字:每个字的大小为16个二进制位
几个常用的数量单位(字节):
210 = 1K、220 = 1M、230 = 1G
指令的工作原理:操作码+若干参数(可能含地址参数)
相对地址又称逻辑地址,绝对地址又称物理地址。
从写程序到程序运行:
- 编辑源代码文件
- 编译:由源代码文件生规目标模块(高级语言“翻译"为机器语言)
- 链接:由目标模块生成装入模块,链接后形成完整的逻辑地址
- 装入:将装入模块装入内存,装入后形成物理地址
装入模块、装入内存
三种方式:
-
绝对装入:
在编译时,如果知道程序将放到内存中的哪个位置,编译程序将产生绝对地址的目标代码。装入程序按照装入模块中的地址,将程序和数据装入内存。
缺点:只适用于单道程序环境,因为只有一个程序读写才能确定地址
-
静态重定位:
又称可重定位装入。编译、链接后的装入模块的地址都是从0开始的,指令中使用的地址、数据存放的地址都是相对于起始地址而言的逻辑地址。装入时对地址进行“重定位”,将逻辑地址变换为物理地址(地址变换是在装入时一次完成的)
必须分配其要求的全部内存空间
在运行期间不能再移动
用于早期多道批处理操作系统
-
动态重定位:
又称动态运行时装入。编译、链接后的装入模块的地址都是从0开始的。地址转换推迟到程序真正要执行时才进行。因此装入内存后所有的地址依然是逻辑地址。这种方式需要一个重定位寄存器的支持。
重定位寄存器:存放装入模块存放的起始位置
允许程序在内存中发生移动
现代操作系统
链接
三种方式:
- 静态链接:在程序运行之前,先将各目标模块及它们所需的库函数连接成一个完整的可执行文件(装入模块),之后不再拆开。
- 装入时动态链接:将各目标模块装入内存时,边装入边链接的链接方式。
- 运行时动态链接:在程序执行中需要该目标模块时,才对它进行链接。其优点是便于修改和更新,便于实现对目标模块的共享。
内存管理的概念
- 内存空间的分配与回收
- 从逻辑上对内存空间进行扩充
- 逻辑地址与物理地址的转换
- 内存保护功能,保证各进程在备自存储空间内运行,互不干扰
- 方法一:在CPU中设置一对上、下限寄存器,存放进程的上、下限地址。进程的指令要访问某个地址时,CPU检查是否越界。
- 方法二:采用重定位寄存器(又称基址寄存器)和界地址寄存器(又称限长寄存器)进行越界检查。重定位寄存器中存放的是进程的起始物理地址。界地址寄存器中存放的是进程的最大逻辑地址。
内存空间的扩充
- 覆盖技术
- 交换技术
- 虚拟存储技术
覆盖技术
解决“程序大小超过物理内存总和”的问题
思想:
- 将程序分为多个段(多个模块)
- 内存中分为一个“固定区”和若干个“覆盖区”
- 需要常驻内存的段放在“固定区”中,调入后就不再调出(除非运行结束);不常用的段放在“覆盖区”,需要用到时调入内存,用不到时调出内存
缺点:必须由程序员声明覆盖结构,操作系统完成自动覆盖。对用户不透明,增加了用户编程负担。
交换技术
思想:内存空间紧张时,系统将内存中某些进程暂时换出外存,把外存中某些已具备运行条件的进程换入内存(进程在内存与磁盘间动态调度)
-
应该在外存(磁盘)的什么位置保存被换出的进程?
具有对换功能的操作系统中,通常把磁盘空间分为文件区和对换区两部分。文件区主要用于存放文件,主要追求存储空间的利用率,因此对文件区空间的管理采用离散分配方式;对换区空间只占磁盘空间的小部分,被换出的进程数据就存放在对换区。由于对换的速度直接影响到系统的整体速度,因此对换区空间的管理主要追求换入换出速度,因此通常对换区采用连续分配方式。
-
什么时候应该交换?
交换通常在许多进程运行且内存紧缺时进行,而系统负荷降低就暂停。例如:在发现许多进程运行时经常发生缺页,就说明内存紧张。
-
应该换出哪些进程?
可优先换出阻塞进程;可换出优先级低的进程;为了防止优先级低的进程在被调入内存后很快又被换出,有的系统还会考虑进程在内存的驻留时间…
注意:PCB会常驻内存,不会被换出外存
内存空间的分配与回收
连续分配管理方式
连续分配:指为用户进程分配的必须是一个连续的内存空间。
单一连续分配
内存被分为系统区和用户区。系统区通常位于内存的低地址部分,用于存放操作系统相关数据;用户区用于存放用户进程相关数据。
内存中只能有一道用户程序,用户程序独占整个用户区空间。
优点:实现简单;无外部碎片;可以采用覆盖技术扩充内存;不一定需要采取内存保护
缺点:只能用于单用户、单任务的操作系统中;有内部碎片;存储器利用率极低。
固定分区分配
将整个用户区划分为若千个固定大小的分区,在每个分区中只装入一道作业,这样就形成了最早的、最简单的一种可运行多道程序的内存管理方式。
- 分区大小相等:缺乏灵活性,但是很适合用于用一台计算机控制多个相同对象的场合
- 分区大小不等:增加了灵活性,可以满足不同大小的进程需求