4.1存储器概述
存储管理
计算机系统的主要用途是执行程序。
在执行时,这些程序及其所访问的数据必须在内存里(至少部分如此)。
为改善CPU的使用率和对用户的响应速度,计算机必须在内存中保留多个进程。内存管理方案有很多,以便适应不同需求,而方案的选择依赖于很多因素,尤其是系统硬件设计,每个算法都要有自己的硬件支持。
存储器的层次结构
按照距离CPU的远近及由快到慢的存取速度,可以将存储器分为:CPU寄存器(寄存器)、主存(高速缓存cache、主存储器、磁盘缓存)、辅存(磁盘、可移动存储介质)
寄存器、高速缓存和内存被称为可执行存储器
4.2 程序装入与链接
程序装入
为了执行程序,需要将其调入内存形成多个进程
- 进程至少占据数据段和代码段两个内存空间
- 进程在执行时,会访问内存中的数据和指令;进程终止时,其地址空间将被释放
许多系统允许用户进程放在物理内存的任意位置,即计算机的物理地址空间虽然从0开始计数,但用户进程的开始物理地址却不必也是0
用户程序的处理过程
编辑:编写源代码,形成源文件
编译:将源文件翻译成若干目标模块
链接:多个目标模块及其所需函数库生成装入模块(可执行文件)
装入:将装入模块放入内存,申请PCB、分配空间、生成进程
地址捆绑
- 用户程序在执行前,需要经过多个步骤,在这些步骤中,地址可能有不同的表示形式
源程序中的地址通常用符号表示(如count),编译器通常将这些符号地址捆绑在可重定位的地址(如“从本模块开始的第3字节”)。链接程序或装入程序再将这些可重定位的地址捆绑成绝对地址(如20375)
每次捆绑都称为从一个地址空间到另一个地址空间的映射
重定位:装入时对目标程序中指令和数据地址的修改过程
- 指令数据与内存地址的捆绑可在如下任一步骤中执行
绝对装入方式
此种方式的程序代码中使用的绝对地址既可在编译或汇编时给出,也可由程序员人工赋予
优点:装入简单,无需地址变换,适用于单道程序环境
缺点:如果开始地址产生变化,必须重新编译代码,同时要求程序员熟悉内存使用情况和硬件结构
可重定位装入方式
根据内存当前情况将装入模块装入到内存的适当位置,装入时的地址变换是一次性完成的,以后不再修改,因此称为静态重定位
如果开始地址产生变化,只需重新加载用户代码以引入改变值即可
优点:适用于多道程序环境
缺点:程序装入内存后占据连续空间且不能在内存中移动位置
动态运行时装入方式
装入模块中使用逻辑地址,装入时不变换地址,执行时才进行重定位
优点:可以分散存储程序、移动程序,且支持程序执行过程中的地址变换,是虚拟存储的基础
缺点:需要重定位寄存器硬件支持
程序链接
源程序经过编译后形成的目标模块需要使用链接程序将其组织为装入模块
静态链接
将多个目标模块及其所需库函数链接成一个完整的装配模块,以后不再拆开的事先链接方式
应解决如下问题
对相对地址进行修改:某些目标模块在链接后将不再从0开始,而是根据其前部的其他模块的结束地址变换,因此链接为一个可执行文件时需要修改其基地址
变换外部调用符号:每个模块的外部调用符号(符号地址)也变换为相对地址,此时形成的不可分拆的装入模块称为可执行文件
装入时动态链接
目标模块装入时遵循边装入边链接的原则,同时按照静态链接时的方法修改新装入的目标模块的相对地址
优点:便于修改和更新、便于实现目标模块的共享(一个目标模块可能链接到多个应用模块上,满足多个应用程序需求)
运行时动态链接
对某些不常用模块的链接推迟到执行时才运作,凡在执行过程中用不到的目标模块都不会被调入内存,更不会被链接到装入模块上
优点:加快装入过程,节省内存空间
存储管理器
4.3 连续分配方式
用户程序获得的内存空间具有连续性
单一连续分配方式
内存被划分为低址部分的系统区和高址部分的用户区
仅用于单用户单任务OS
固定分区分配
将内存用户空间划分为多个固定大小的区域,每个区域内只装入一个进程,即并发的进程数量取决于分区个数
若当前某进程完成操作释放资源,外存后备队列中的适当大小作业被装入分区,获得执行
最早及最简单的运行多道程序的存储管理方式,实现简单,但会浪费存储空间
- 分区方法
- 内存分配
动态分区分配
根据进程实际需要动态的分配内存
动态分区分配算法
首次适应算法
循环首次适应算法
最佳适应算法
最坏适应算法
快速适应算法(分类搜索法)
分区分配操作
伙伴系统
可重定位分区分配
碎片(零头)
动态重定位
4.4 对换
多道程序环境下的对换技术
对换空间的管理
换入和换出
存储器的扩充方式
覆盖:由应用程序控制
对换和虚拟存储:由OS控制
4.5 基本分页存储管理方式
离散分配方式
页面与页表
页面
页表
地址变换机构
两级或多级页表
反置页表
反置页表全OS仅一个,外部页表每个进程一个
4.6 基本分段存储管理方式
引入
原理
信息共享
段页式存储管理方式