第四章 存储管理
4.1 概 述
存储器和中央处理器(CPU)一样是计算机系统的重要组成部分。它为操作系统、各种系统程序和用户程序所共享。存储器空间被划分成系统存储区(简称系统区)和用户作业存储区(简称用户区)两大部分。存储器管理讨论的主要对象是内存的用户区。 4.1.1 信息的二级存储
主存: 划分成系统存储区(简称系统区)和用户作业存储区(简称用户区)两大部分。系统区存放操作系统与硬件的接口信息(新旧PSW、定时时间、I/O工作情况)、操作系统的管理信息(PCB)和驱动程序、标准子程序等。
辅助存储器:提供大容量存储空间 4.1.2 存储器管理的功能
1.存储器管理的基本目的是:①充分发挥内存的利用率;②为用户使用存储器提供方便。 2.存储器管理的功能可以归纳为4个方面。
(1)内存分配:为多个程序分配内存空间,各程序在规定的那一部分内存空间里运行。内存分配的主要方式有静态分配和动态分配。
(2)地址重定位(地址转换):把程序的逻辑地址变换为存储器的物理地址。地址重定位的方式有静态重定位和动态重定位。
(3)内存空间的共享与保护:对操作系统以及各用户的信息提供保护措施。 (4)内存扩充:通过软件方法扩充逻辑存储空间。 4.2 重定位
4.2.1 地址空间和存储空间
源程序经过汇编或编译后再经过连接形成程序的装配模块形式,即转换为相对地址编址形式,它是以0为基址顺序进行编址的。相对地址又叫逻辑地址或虚地址。
逻辑地址空间(简称地址空间)是逻辑地址的集合,物理地址空间(简称存储空间)是物理地址的集合。
4.2.2地址重定位
所谓地址重定位是指把程序空间中的逻辑地址转换为存储空间的物理地址的过程.又称为地址映射。
地址重定位的方式有静态重定位和动态重定位。
静态重定位是在程序目标模块装入时由装入程序完成的。装入程序把目标模块中的逻辑地址与本程序在内存中的起始地址相加得到正确的物理地址。(亦称绝对装入方式)(P96 图4.2 静态地址再定位)
优点:容易实现,无需硬件支持,可由专门设计的程序来完成。 缺点:(1)程序经地址再定位后就不能再移动了,因而不能重新分配内存,不利于内存的有效利用; (2)程序在存储空间中只能连续分配;
(3)若干用户很难共享内存中的同一程序,若要共享,则需使用各自的副本。
动态重定位是在程序运行时完成的,靠硬件地址变换机构实现。最简单的办法是利用一个重定位寄存器。在程序实际运行前,由操作系统把程序在内存的起始地址送入重定位寄存器。在程序运行期间,凡遇到访问内存的操作,就由硬件机制自动地把用户程序的相对地址与重定位寄存器的内容相加,其和就是实际访问内存的有效地址。(P97 图4.3 动态地址再定位)
优点:(1)用户程序在内存中可以移动,这有利于内存的充分利用;
(2)程序不必连续存放在内存中,只需对分散的内存使用基址-限长寄存器即可; (3)若干用户可以共享同一程序。
缺点: 需要附加的硬件支持,增加了成本,实现存储管理的软件算法比较复杂。
4.3 分区存储管理(连续分配存储管理方式)
连续分配是指为一个用户程序分配一个连续的内存空间,有两种方式,即单一连续分配方式和多个分区分配方式。其中,多个分区分配方式是一种可用于多道程序的较简单的存储管理方式,它又可以进一步细分为固定分区方式和可变(动态)分区方式。
4.3.1 一个分区的存储管理(单一连续分配存储管理方式)
单一连续分配方式只能用于单用户、单任务的操作系统。内存分为系统区和用户区。系统区仅提供给操作系统使用;用户区指除系统区以外的全部内存空间,提供给用户使用。仅当内存中没有其它作业时才有可能调度一个作业投入运行;被调度的作业所需主存的大小仅当不超过可用的主存容量时,才能将其装入主存并投入运行,否则该作业无法运行。
地址重定位时,只要将指令或数据的逻辑地址加上用户区基地址,就可以形成物理地址。
为了防止操作系统程序受到用户程序有意或无意的破坏,需要设置内存保护机构,如采用基址寄存器和界限寄存器机制。
优点:方法简单,易于实现。
缺点:仅适用于单道程序,不能使处理机和主存得到充分利用。
4.3.2 多个分区的存储管理之一:固定分区管理方式(分区大小、个数均固定)(P99)
一.原理
将内存空间划分为若干个固定大小的区域(所有分区可以大小相等,也可以大小不等,但事先必须固定,以后也不能改变),在每个分区中可以装入一道作业,这样当内存中划分成几个分区时,便允许几道作业并发运行;当有一个分区空闲时,便可从外存的后备队列中,选择一个适当大小的作业装入该分区;当该作业运行结束时,又可从后备队列中找出另一个作业调入该分区。
为了便于内存分配,通常将这些分区根据它们的大小进行排队,并为之建立一张分区分配(使用)表。每个表项包括该分区的起始地址、大小及状态。当有一用户程序要装入时,由内存分配程序检索该表,从中找出一个能满足要求的、尚未分配的分区,将它分配给该程序,然后修改分区使用表中的状态;若找不到大小足够的分区,则拒绝为该程序分配内存。
优缺点:固定分区分配是最简单的多道程序的存储管理方式。但由于每个分区的大小固定,必然会造成存储空间的浪费;而且,程序大小受分区空间大小的限制。
二.地址转换与存储保护
由于在每个分区中只可以装入一道作业,且作业在执行过程中不会改变存放区域,因此该作业的起始地址固定,可以采用静态重定位。
设置上、下界限寄存器:下限地址<=绝对地址<=上限地址
三.主存空间的利用
(1) 按分区大小从小到大排列分区;
(2) 根据经常出现的作业的大小和频率划分分区; (3) 多队列的固定分区法。
4.3.3 多个分区的存储管理之二:可变分区管理(动态分区分配)(P100)
一.分区分配中的数据结构:
可变分区分配是根据作业的实际需要,动态地为之分配连续的内存空间。它是在作业装入和处理过程中建立的分区,并且要使分区的容量能正好适应作业的大小。为了实现分区分配,系统中必须设置相应的数据结构,如已分配区表和空闲分区表(或空闲分区链),用来记录内存的使用情况,为内存分配提供依据。
空闲分区链的形式 序号 1 2 : 始址 长度 标志 前向指针 N+2 占用标志位 N个可用字节 {当占用标志位=1时,前后向指针无意义。} 后向指针 N+2 占用标志位 空闲分区表 二.分区分配算法:常见的分区分配算法,有首次适应算法(FF)、循环首次适应算法(CFF)、最
佳适应算法(BF)、最差适应算法(WF)。
在首次适应算法中,空闲分区按地址递增的顺序形成空闲分区链,分配时从空闲分区链的第一个空闲分区开始向后扫描,直到找到第一个能满足需要的空闲分区。该算法倾向于优先利用内存中低地址部分空闲区,从而保留了高地址部分大的空闲区,分区合并较简单。缺点是低地址部分会留下许多难以利用的小空闲区,而每次查找又都从低地址部分开始,增加了开销。
循环首次适应算法中,空闲分区也按地址递增的顺序形成空闲分区链,分配时不是从空闲分区链的第一个空闲分区开始,而是从上一次找到的空闲分区的下一个空闲分区开始向后扫描,直到找到第一个能满足需要的空闲分区。该算法可以使得小的空闲区均匀地分布在可用存储空间中,当回收时,与大的空闲区合并的机会增加。但保留大的空闲区的可能性减小了。
在最佳适应算法中,空闲分区按大小递增的顺序形成空闲分区链,分配时从空闲分区链的第一个空闲分区开始向后扫描,直到找到第一个能满足需要的空闲分区,很显然该分区是满足需要而且是最接近需要的空闲区。该算法可以保留大的空闲区,但会留下许多小的空闲区.而且空闲区回收也更复杂一些。 在最差适应算法中,空闲分区按大小递减的顺序形成空闲分区链,分配时直接从从空闲分区链的第一个空闲分区中分配(不能满足需要则不分配)。很显然,如果第一个空闲分区不能满足需要,则再没有空闲分区能满足需要。该算法克服了最佳适应算法留下许多小的碎片的不足,但保留大的空闲区的可能性减小了,而且空闲区回收也和最佳适应算法一样复杂。
三.地址转换与存储保护:
一般采用动态重定位方式装入作业,要有硬件的地址转换机构作支持。 四.移动(拼接)技术:(可再定位式分区分配) 动态分区解决了固定分区空间浪费严重的问题。但在连续分配方式中.必须把一个程序装入到一个连续的内存空间,这样就会形成许多“碎片”。可通过移动方法将碎片拼接成一个可用的大块空间,但必须付出很大的系统开销(损失了处理机时间),而且移动也是有条件的。另外,程序大小受内存空间的限制。 五、多重分区分配:
给一个作业分配一个以上分区的方法,称为多重分区分配。,采用该分配方案可使存储空间的利用率提高,能实现对子程序、数据段的共享。但作业的分段越多,分区越小,结果使存储器分得过碎,没有较大的空白区,另外要求更多的硬件支持,管理也比较复杂。
六、分区分配方案的评价:(p106) 4.4 分页存储管理方式 4.4.1基本思想
将一个进程的逻辑地址空间分成若干个大小相等的页(或称页面),内存空间分成与页相同大小的物理块(或称页框)。在为进程分配内存时,以块为单位进行分配,每页分配一块。系统为每个进程建