操作系统学习笔记(7)——存储管理
1、计算机存储体系
- 金字塔体系:寄存器>高速缓存>主存储器>磁盘缓存>固定磁盘>可移动存储介质
- 主存储器(内存):
- 内存空间是由存储单元组成的一维连续的地址空间
- 存放代码及数据等信息
2、存储管理目标及任务
- 目标:
-
充分利用内存空间,为进程的并发执行提供存储支持
-
方便用户使用,自动装入程序、数据,用户不必考虑硬件细节
-
- 功能任务
- 实现内存空间的管理、分配与回收
- 实现逻辑地址到物理地址的自动转换
- 实现多个进程间的信息共享与通信
- 实现多个进程隔离和信息保护
- 实现内存和辅存空间的协同使用
- 地址重定位
- 静态地址重定位和动态地址重定位
- 静态地址重定位是在虚拟空间程序执行之前,由装配程序完成的地址映射工作。对于虚拟空间内的指令和数据来说,静态地址重定位只完成了一个首地址不同的连续地址变换。它要求所有待执行的程序必须在程序执行之前完成它们之间的链接,否则将无法得到正确的内存地址和内存空间。优点是不需要硬件支持,但是缺点是必须占有连续的内存空间,这就难以做到数据和程序的共享。
- 动态地址重定位是程序在执行过程中,在CPU访问内存之前,将要访问的程序或数据地址转换为内存地址。动态地址重定位需要硬件的支持。地址重定位机构需要一个或多个基地址寄存器BR和一个或多个程序虚拟地址寄存器VR,指令或数据的内存地址MA与虚拟地址的计算关系如下:MA=(BR)+(VR),这里的(BR),(VR)分别表示寄存器中的内容。优点有:内存可以不连续分配、提供实现虚存的基础、有利于程序共享。
3、连续存储区管理方案
4、分区存储的管理方案
- 存储分区
- 系统把内存用户区划分为若干分区
- 分区大小可以相等,也可以不等
- 一个进程占据一个分区
- 分类:固定分区存储、可变分区存储
- 固定分区
-
- 预先将内存分割成若干个连续区域
- 每个连续区的大小可以相同,也可以不同,但是,一旦划分好分区之后,主存中分区的个数就固定了,且每个分区的大小也固定不变
- 如果有足够大空闲区,则分配给创建的进程
- 每个分区用来装入一个作业,由于主存中有多个分区,就可同时在每个分区中装入一个作业。所以,这种存储管理方式是适用于多道程序系统的
-
- 显然为了管理主存空间的使用,必须设置一张“主存分配表”(分区说明表),用来说明各分区的分配情况。
-
- 当作业队列中有作业要装入主存时,存储管理可采用“顺序分配算法”进行主存空间的分配。顺序查看主存分配表,找到一个标志为“0”的并且长度大于或等于欲装入作业的地址空间长度的分区就可以了
- 这种固定分区模式的地址转换一般采用静态重定位技术 ,如果内存需要扩充则采用覆盖技术
-
- 优点:实现简单,无外部碎片
- 缺点:a.当用户程序太大时,可能所有的分区都不能满足需求,此时不得不采用覆盖技术解决,但这又会降低性能。b.会产生内部碎片,碎片大,存在小分区占用大作业的情况,内存利用率低。
- 可变分区/变长分区/动态分区
- 与固定分区的区别就是:动态的划分分区
- 这种分配方式不会预先划分内存分区,而是在进程装入内存时,根据进程的大小动态地建立分区,并使分区的大小正好适合进程的需要,因此系统分区的大小和数目是可变的。
- 可变分区模式下,刚开始,OS就绪,但任何用户程序未进入内存前整个用户内存区是一大空间。已占用区和空闲分区并不是绝对的
- 需要创建空闲区表和已分配区表来进行管理
- 程序进入内存时的例行工作就是分配空闲区和装入程序,并修改相应的空闲表和已分配区表
- 一旦一个内存分区被分配给一个进程,该进程可以被装入该块中执行,装入时需重定位。
- 可变分区的实现过程同样的系统要相应的数据结构表来记录内存的使用情况
-
- 可变分区的分配方式就是当有作业要装入内存时,在空闲区表中找一找“ 未分配 ”的栏目,从中找出一个能容纳作业的空闲区。若空闲区大于作业的长度时则被分成两部分,一部分分配给作业;另一部分仍作为空闲区登记在表中。若找到的空闲区等于作业长度时,分配后该栏目状态改为“空”状。显然这种动态的按需分配模式有效地解决了固定分区方式中由于分区内部剩余内存空置所形成的内部碎片的问题。当一个新作业装入内存时,我们也看到是需要按照一定的算法,从空闲分区表(或空闲分区链)中选出一个分区分配给该作业的
- 分区算法
- 最先(首次)适应分配算法:每次都从低地址开始查找,找到第一个能满足大小的空闲分区。这种算法优点是实现简单,缺点是可能将低地址处大的空闲区分割成许多小的空闲区,形成许多不连续的“碎片”。碎片长度可能不能满足作业要求,降低了内存利用率。
- 最佳适应算法:空闲分区按容量递增次序链接。每次分配内存时顺序查找空闲分区表,找到大小能够满足要求的第一个空闲分区。这种算法貌似最佳,尽可能地选择了最适合的分区空间,但也因此产生大量的不能被使用的很小的空闲区。因此这种方法会产生很多的外部碎片。所以该算法分配效果不一定是最佳的。
- 最坏适应算法:为了解决最佳适应算法的问题——即留下太多难以利用的小碎片,我们转换思路考虑可以在每次分配时,优先使用最大的连续空闲区,这样分配后的空闲区就不会太小,更方便使用。显然这种算法分割后产生的空闲区一般仍可以供以后分配使用。但工作一段时间后,也不能满足大作业对空闲区的请求。
-
- 动态分区的地址转换模式
- 显然,采用可变分区方式时,一般采用动态重定位方式装入作业。
- 它的内存扩充方面,虽然消除了固定分区造成的“内碎片”,但是不可避免的在内存空间造成“外碎片”。我们一般采用移动(紧缩)技术进行内存扩充,定时的或在内存紧张时,将内存中所有作业移到内存的一端,使其相邻。
- 那么我们也看到经过紧缩后的进程在内存中的位置发生了变化,若不对程序和数据的地址进行修改,在进程就无法运行。要使其运行,必须进行“动态重定位”
- 动态分区的地址转换模式
-
- (问题一)内存回收:空间合并,修改管理表格
- (问题二)内存碎片:反复分配回收后,产生很多不连续的小空闲块
- 问题解决方法:
5、 存储覆盖与交换技术
- 引入原因
- 多道环境下扩充内存,解决在较小的存储空间中运行较大、较多进程时的矛盾
- 进程的程序和数据主要放在外存,需要执行的部分放在内存,内外存之间进行信息交换
- 覆盖技术
- 进程若干程序段、数据段等共享同一存储空间
- 要求模块之间有明确调用结构,并向系统指明
- 交换技术
- 多个进程分时共享内存储空间
- 进程在内、外存之间动态调度
- 需要在辅存设置一个盘交换区