存储器管理的对象是主存储器(主存、内存)。存储管理的主要功能包括 分配和回收主存空间、提高主存的利用率、扩充主存、对主存信息实现有效保护。
1. 基本概念
- 存储器结构
存储器的功能是保存数据,存储器的发展方向是高速度、大容量和小体积。
一般存储器的结构有“寄存器-主存-外存”结构和“寄存器-缓存-主存-外存”结构,如图所示。
存储组织的功能是在存储技术和CPU寻址技术许可的范围内组织合理的存储结构,使得各层次的存储器都处于均衡的繁忙状态。
- 虚拟地址。对程序员来说,数据的存放地址是由符号决定的,故称为符号名地址,或者名地址。它是从0号单元开始编址,并顺序分配所有的符号名所对应的地址单元。由于符号名地址不是主存中的真实地址,因此也称为相对地址、程序地址、逻辑地址或称虚拟地址。
- 地址空间。程序中由符号名组成的空间称为名空间。源程序经过汇编或编译后形成二进制的目标程序。在目标程序中,程序指令和数据的位置按照字或字节单位根据它们的相对顺序来确定,称为相对地址。把程序中由相对地址组成的空间叫做逻辑地址空间,逻辑地址空间通过地址再定位机构转换到绝对地址空间,绝对地址空间也叫物理地址空间。
- 地址重定位
将逻辑地址转换成主存物理地址的过程称为地址重定位。在可执行文件装入时,需要解决可执行文件中地址(指令和数据)与主存地址的对应关系,由操作系统中的装入程序(Loader)和地址重定位机构来完成。地址重定位分为静态地址重定位和动态地址重定位。
2. 存储管理方案
存储管理的主要目的是解决多个用户使用主存的问题。其管理方案主要包括分区存储管理、分页存储管理、分段存储管理、段页式存储管理以及虚拟存储管理。
2.1 分区存储管理
分区存储管理是早期的存储管理方案,其基本思想是把主存的用户区划分成若干个区域,每个区域分配给一个用户作业使用,并限定它们只能在自己的区域中运行,这种主存分配方案就是分区存储管理方式。按分区的划分方式不同,可分为固定分区、可变分区和可重定位分区。
- 固定分区:静态分区方法,系统生成时固定生成,每个区域可以不等,操作系统通过主存分配情况表管理主存。
- 可变分区:可变分区分配需要两种管理表格:已分配表和未分配表。请求和释放分区主要有4种算法:最佳适应算法、最差适应算法、首次适应算法和循环首次适应算法。
- 可重定位分区。基本思想是移动所有已分配好的分区,使之成为连续区域。当请求空间不足时发生。
- 分区保护
目的是防止未经校核的用户访问分区,常用如下两种方式:上界/下界寄存器保护(上界寄存器≤物理地址≤下界寄存器)、基址/限长寄存器保护(基址寄存器≤物理地址<基址寄存器+限长寄存器)。
2.2 分页存储管理
分页存储管理方案是对分区存储管理方案的优化。
- 纯分页存储管理
-
分页原理
将一个进程的地址空间划分成若干个大小相等的区域,称为页。相应地,将主存空间划分成与页相同大小的若干个物理块,称为块或页框。为进程分配主存时,可将进程中若干页分别装入多个不相邻接的块中。 -
地址结构
分页系统的地址结构如图所示,由两部分组成:前一部分为页号P;后一部分为偏移量 W,即页内地址。图中的地址长度为 32 位,其中 0-11 位为页内地址(每页的大小为 4KB),12~31 位为页号,所以允许的地址空间大小最多为1MB 个页。
-
页表
将进程的每一页离散地分配到内存的多个物理块中后,系统应保证能在内存中找到每个页面所对应的物理块。为此,系统为每个进程建立了一张页面映射表,简称页表,如图所示。
-
地址变换机构
地址变换机构的基本任务是利用页表把用户程序中的逻辑地址变换成内存中的物理地址,即将用户程序中的页号变换成内存中的物理块号。
- 快表
从地址映射的过程可以发现,页式存储管理至少需要两次访问内存,第一次是访问页表,得到数据的物理地址;第二次是存取数据。若采用间接寻址访问数据,还需要再进行地址变换。为了提高访问内存的速度,可以在地址映射机构中增加一组高速寄存器,用来保存页表,这种方法需要大量的硬件开销。另一种方法是在地址映射机构中增加一个小容量的联想存储器,联想存储器由一组高速存储器组成,称为快表,用来保存当前访问频率高的少数活动页的页号及相关信息。
2.3 分段存储管理
分段存储管理是在分页管理基础上为了实现信息共享而提出。段是信息的逻辑单位,允许若干个进程共享一个或多个段,可简单地实现段的保护。
在分段存储管理方式中,作业的地址空间被划分为若干段,每段是一组完整的逻辑信息,如主程序段、子程序段、数据段及堆栈段等,每段都有自己的名字,都是从零开始编址的一段连续的地址空间,各段长度不等。分段系统的地址结构如图所示,逻辑地址由段号(名)和段内地址两部分组成,在该地址结构中,允许一个作业最多有64K段,每段的最大长度为64KB。
2.4 虚拟存储管理
如果一个作业的部分内容装入主存便可开始启动运行,其余部分暂时留在磁盘上,需要时再装入主存。这样,可以有效地利用主存空间。从用户角度看,该系统所具有的主存容量将比实际主存容量大得多,人们把这样的存储器称为虚拟存储器。虚拟存储器是为了扩大主存容量而采用的一种设计方法,其容量是由计算机的地址结构决定的。
- 程序局部性原理:程序在执行时将呈现出局部性规律,即在一段时间内,程序的执行仅局限于某个部分。程序的局限性表现在时间局限性和空间局限性两个方面。
- 虚拟存储器的实现
虚拟存储器具有请求调入功能和置换功能,可以把作业的一部分装入主存使其开始运行,能从逻辑上对主存容量进行扩充。虚拟存储器的逻辑容量由主存和外存容量之和以及 CPU 可寻址的范围来决定,其运行速度接近于主存速度,成本接近于外存。虚拟存储器实现主要有以下3 种方式。- 请求分页系统。以页为单位调入和置换来执行程序。
- 请求分段系统。以段为单位
- 请求段页式系统。
- 请求分页管理的实现
请求分页是在纯分页系统的基础上,增加了请求调页功能、页面置换功能所形成的页式虚拟存储系统,是目前常用的一种虚拟存储器的方式。
在请求分页系统中,每当所要访问的页面不在主存时,便产生一个缺页中断,请求调入所缺的页。缺页中断与一般中断的主要区别在于:缺页中断在指令执行期间产生和处理中断信号,而一般中断在一条指令执行结束后,下一条指令开始执行前检查和处理中断信号;缺页中断返回到被中断指令的开始重新执行该指令,而一般中断返回到下一条指令执行;一条指令在执行期间,可能会产生多次缺页中断。
页面置换算法
在进程运行过程中,如果发生缺页而内存中又无空闲块时,为了保证进程能正常运行,就必须从内存中调出一页程序或数据送入磁盘的对换区。置换算法的好坏将直接影响系统的性能,不适当的算法可能会导致刚被换出的页很快又被访问,需重新调入,使得系统频繁地更换页面,以致一个进程在运行中把大部分时间花费在页面置换工作上,称该进程发生了**“抖动”(Thrashing,也称颠簸)**。请求分页系统的核心问题是选择合适的页面置换算法。常用的页面置换算法如下所述。
-
最佳置换算法:选择那些永不使用,或者是在最长时间内不再被访问的页面置换出去。但是要确定哪一个页面是未来最长时间内不再被访问的,很难估计。
发生9次缺页中断,发生了6次页面置换。 -
先进先出置换算法:总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰。但是可能发生Belady现象,是指如果对一个进程未分配它所要求的全部页面,有事就会出现分配的页面数增加但缺页率反而增加的异常现象。
发生15次缺页中断,发生了12次页面置换。 -
最近最少使用置换算法:选择最近最少使用的页面予以淘汰,系统在每个页面设置一个访问字段,用于记录这个页面自上次被访问以来所经历的时间T,当要淘汰一个页面时,选择T最大的页面。
产生了12次缺页中断,发生了9次页面置换。 -
最近未用置换算法
NRU 算法是将最近一段时间未引用过的页面换出。这是一种 工RU 的近似算法。该算法为每个页面设置一位访问位,将内存中的所有页面通过链接指针连成一个循环队列。当某页被访问时,其访问位置 1。在选择一页淘汰时,就检查其访问位,如果是0,就选择该页换出;若为 1,则重新置为 0,暂不换出该页,在循环队列中检査下一个页面,直到找到访问位为0的页面为止。该算法只有一位访问位,只能用它表示该页是否已经使用过,若未使用过,则可将其置换出去。