存储器管理
存储器即主存、内存(Memory),分为两大部分:
系统区:供操作系统使用
用户区:划分为一个或多个区域,供用户进程使用。
存储器管理的主要目标是为用户提供方便、安全和充分大的存储器。
1、存储器管理的功能
存储空间的分配和回收:
地址变换:将逻辑地址变换为物理地址
存储保护:防止因用户程序错误破坏系统或其他用户,防止程序之间的相互干扰
存储扩充:在逻辑上为用户提供一个比实际内存更大的存储空间
2、存储器管理的基本概念
逻辑地址 (Logical address) :用户编程时所使用的地址。又称相对地址、虚地址。
地址空间:逻辑地址的集合。
物理地址(Physical address):内存中的地址。又称绝对地址、实地址。
主存空间:物理地址的集合。
3、程序的装入
为将一个用户源程序变为一个在内存中可执行的文件,通常要经历以下步骤:编译、链接、装入。
将装入模块装入内存有3种方式:
绝对装入方式
编译时产生绝对地址的目标代码,绝对装入程序按照装入模块中的地址将程序及数据装入内存,不需对地址进行变换。
程序中使用的绝对地址可以在编译时给出,也可以由程序员直接赋予。
特点:使用绝对地址不方便,适于单道程序环境。
可重定位装入方式
编译时产生相对地址的目标代码,由装入程序根据内存当时的实际使用情况,将装入模块装入到内存的适当地方。
动态运行时装入方式
在将装入模块装入内存时并不进行地址变换,在程序执行过程中进行地址变换。
特点:需要硬件支持,可以部分装入
4、地址变换
地址变换:将逻辑地址转换为物理地址。又称地址映射、重定位(relocation)。
地址变换分为两类:
静态地址变换
静态地址变换:又称静态地址重定位,地址变换在程序装入时一次完成,以后不再改变。
特点:不需硬件支持,但程序运行时不能在内存移动,程序需要连续存储空间,难以共享。
动态地址变换
动态地址变换:又称动态重定位,在程序执行过程中,每次访问内存之前将要访问程序地址转换成内存地址。
特点:需要硬件支持,不需连续空间,可以实现虚拟存储。
5、程序的链接
链接程序的功能是将经过编译或汇编后得到的目标模块以及所需的库函数装配成一个完整的装入模块。
实现链接的方式有三种:
静态链接
在程序运行之前,将各目标模块及其所需的库函数装配成一个完整的装入模块。
装入时动态链接
源程序编译后所得到的目标模块在装入内存时边装入边链接。
特点:便于软件版本的修改和更新,便于目标模块的共享。
运行时动态链接
将某些目标模块的链接推迟到执行时才进行。即在执行过程中,若发现一个被调用模块尚未装入内存时,由OS去找到该模块,将它装入内存并链接到调用者模块上。
特点:加快了程序装入,节省了内存。
6、内存保护
内存保护:是防止一个进程有意或无意破坏操作系统或其他进程。
常用的存储保护方法有:
界限寄存器法
通过对每个进程设置一对界限寄存器来防止越界访问,达到存储保护的目的。
界限寄存器方法有两种实现:
上下界寄存器
用上、下界寄存器分别存放作业存储空间的结束地址和开始地址。
在作业运行过程中,将每一个访问内存的地址都同这两个寄存器的内容进行比较,若超出了上下界寄存器的范围则产生越界中断。即
下界寄存器≤地址<上界寄存器
基址限长寄存器
用基址和限长寄存器分别存放作业存储空间的起始地址及作业长度。
当作业执行时,将每一个访问内存的相对地址和这个限长寄存器比较,若逻辑地址超过限长则产生越界中断。
存储保护键
通过保护键匹配来判断存储访问方式是否合法。即
为每个存储块分配一个保护键,相当于一把锁;进入系统的每个作业赋予一个保护键,相当于一把钥匙。当作业运行时,检查钥匙和锁是否匹配,若二者匹配,则允许访问。否则发出保护性中断信号
环保护机制
处理器状态分为多个环,分别具有不同的存储访问特权级,通常环的编号越小,特权级越高。
例如:规定低编号环具有高优先权。操作系统核心处于0环,某些重要实用程序和操作系统服务处于中间环,一般应用程序占据外环。
访问权限
7、单一连续分配
单一连续分配方式中,内存分为系统区和用户区。系统区给操作系统使用,用户区给一道用户作业使用。
特点:管理简单,只需很少的软硬件支持;但各类资源的利用率不高。
8、分区存储管理
分区存储管理是多道程序系统中采用的一种最简单的方法。它把系统的内存划分为若干大小不等的区域,操作系统占一个区域,其他区域由并发进程共享,每个进程占一个区域。
分区存储管理分为:
固定分区
固定分区(fixed-sized partition)存储管理方法将内存空间划分为若干个固定大小的分区,每个分区中可以装入一道程序。分区的位置及大小在运行期间不能改变。
为了便于管理内存,系统需要建立一张分区使用表,其中记录系统中的分区数目、分区大小、分区起始地址及状态。
分区分配:当有用户程序要装入时,由内存分配程序检索分区使用表,从中找出一个能满足要求的空闲分区分配给该程序,然后修改分区说明表中相应表项的状态;若找不到大小足够的分区,则拒绝分配内存。
分区回收:当程序执行完毕不再需要内存资源时,释放程序占用的分区,管理程序只需将对应分区的状态置为未分配即可。
特点:最早的多道程序存储管理方式,不能充分利用内存,存在内存碎片。
动态分区
初始时,整个用户区是1个空闲块
作业1进入,2个分区
作业2进入,3个分区
作业3进入,4个分区
作业1结束,4个分区
作业3结束,3个分区
作业2结束,1个分区
动态分区存储管理又称为可变分区(variable-pattition)存储管理,这种存储管理方法的实现思想是根据作业大小动态地建立分区,并使分区的大小正好适应作业的需要。因此系统中分区的大小是可变的,分区的数目也是可变的。
9、分区分配算法
目前常用的分区分配算法有以下几种:
首次适应算法
首次适应算法又称最先适应算法,该算法要求空闲分区按地址递增的次序排列。
在进行内存分配时,从空闲分区表(或空闲分区链)首开始顺序查找,直到找到第一个能满足其大小要求的空闲分区为止。
然后,再按照作业大小,从该分区中划出一块内存空间分配给请求者,余下的空闲分区仍然留在空闲分区表(或空闲分区链)中。
特点:优先利用内存低地址端,高地址端有大空闲区。但低地址端有许多小空闲分区时会增加查找开销。
循环首次适应算法
循环首次适应算法又称下次适应(next fit)算法,它是首次适应算法的变形。
该算法在为进程分配内存空间时,从上次找到的空闲分区的下一个空闲分区开始查找,直到找到第一个能满足其大小要求的空闲分区为止。
然后,再按照作业大小,从该分区中划出一块内存空间分配给请求者,余下的空闲分区仍然留在空闲分区表(或空闲分区链)中。
特点:使存储空间的利用更加均衡,但会使系统缺乏大的空闲分区。
最佳适应算法
最佳适应算法要求空闲分区按容量大小递增的次序排列。
在进行内存分配时,从空闲分区表(或空闲分区链)首开始顺序查找,直到找到第一个能满足其大小要求的空闲分区为止。
如果该空闲分区大于作业的大小,则从该分区中划出一块内存空间分配给请求者,将剩余空闲区仍然留在空闲分区表(或空闲分区链)中。
按最佳适应算法为作业分配内存,就能把既满足作业要求又与作业大小最接近的空闲分区分配给作业。
特点:保留了大的空闲区。但分割后的剩余空闲区很小。
最坏适应算法
最坏适应算法要求空闲分区按容量大小递减的次序排列。
在进行内存分配时,先检查空闲分区表(或空闲分区链)中的第一个空闲分区,若第一个空闲分区小于作业要求的大小,则分配失败;
否则从该空闲分区中划出与作业大小相等的一块内存空间分配给请求者,余下的空闲分区仍然留在空闲分区表(或空闲分区链)中
特点:剩下的空闲区比较大,但当大作业到来时,其存储空间的申请往往得不到满足。
10、内部碎片和外部碎片
内部碎片(Internal Fragmentation)是指分配给作业的存储空间中未被利用的部分
外部碎片(External Fragmentation)是指系统中无法利用的小存储块。