4.1存储器的层级结构
存储器管理的主要对象是内存
4.1.1多级结构的存储器系统
- 存储器的多层结构。
- 可执行的存储器。
寄存器和主存储器又被称为可执行存储器
4.1.2主存储器与寄存器
- 处理机都是从主存储器中取得指令和数据的,并将其所取得的指令放入指令寄存器中,而将其所读取的数据装入到数据寄存器中。
- 寄存器
4.1.3 高速缓存和磁盘缓存
- 高速缓存,它是介于寄存器和存储器之间的存储器,主要用于备份主存中较常用的数据,以减少处理机对主存储器的访问次数,这样可以大幅度地提高程序执行的速度。
- 磁盘缓存,它位于内存中,主要用于暂时存放频繁使用的一部分磁盘数据和信息。它本身并不是一种实际存在的存储器,而是利用主存中的部分存储空间暂时存放从磁盘中读出或写入的信息,主存也可以看作是辅存的高速缓存,因此,辅存中的数据必须复制到主存方能使用,反之,数据也必须先存在主存中,才能输出到辅存。
4.2程序的装入和链接
用户程序要在系统中执行, 必须先将它装入内存,然后再将其转变为一个可以执行的程序,通常都要经过以下几个步骤:
- 编译
- 链接
- 装入
4.2.1 程序的装入
将一个装入模块装入内存时,可以有如下三种装入方式
- 绝对装入方式:只能将目标模块装入到内存中事先指定的位置,这只适用于单道程序环境。
- 可重定位装入方式:它可以根据内存的具体情况将装入模块装入到内存的适当位置,或将装入模块装入到内存中的任何允许位置,故可用于多道程序环境。
3.** 动态运行时的装入方式**:在运行过程中它在内存中的位置可能经常要改变,一个进程可能多次换出,又多次被换入,每次换入后的位置通常是不同的。这种情况下,应该采用动态运行时装入的方式。动态运行时的装入程序在把装入模块装入内存后,并不立即把装入模块中的逻辑地址转换为物理地址,而是把这种地址转换推迟到程序真正要执行时才进行。
4.2.2程序的链接
链接程序的功能是将这组目标模块以及它们所需要的库函数装配成一个完整的装入模块,在对目标模块进行链接时,根据进行链接的时间不同,可把链接分为如下三种:
- 静态链接方式:在程序运行之前,先将各目标模块及它们所需的库函数链接成一个完整的装配模块,以后不再拆开。
- 装入时动态链接:将用户源程序编译后所得到的一组目标模块,在装入内存时,采用边装入边链接的链接方式。
- 运行时动态链接:对某些模块的链接推迟到程序执行时才进行。
4.3 连续分配存储管理方式
连续分配方式可分为四类
- 单一连续分配
- 固定分区分配
- 动态分区分配
- 动态可重定位分区分配
4.3.1 单一连续分配
在单道程序环境下,当时的存储管理方式是把内存分为系统区和用户区。用户区内存中,仅装有一道用户程序,即整个内存的用户空间由该程序独占。这样的存储器分配方式被称为单一连续分配方式。
4.3.2 固定分区分配
为了能在内存中装入多道程序,且使这些程序之间又不会发生互相干扰,于是将整个用户空间划分为若干个固定大小的区域,在每个分区中只装入一道作业,这样就形成了最早的,也是最简单的一种可运行多道程序的分区式存储管理方式。当有一空闲分区时,便可以再从外存的后备作业队列中选择一个适当大小的作业,装入该分区。当该作业结束时,又可再从后备作业队列中找出另一作业调入该分区。
一,划分分区的方法
- 分区大小相等(指所有的内存分区大小相等)。其缺点是缺乏灵活性。当程序太小时,会造成空间的浪费。当程序太大时,一个分区又不足以装入该程序,致使该程序无法运行。
- 分区大小不等。通常,可把内存区划分为含有多个较小的分区,适量的中等分区和少量的大分区。
二,内存分配
4.3.3 动态分区分配
它是根据进程实际需要,动态地为之分配内存空间。在实现动态分区分配时,将涉及到分区分配中所用的数据结构,分区分配算法和分区的分配与回收操作这样三方面的问题。
一,动态分区分配的数据结构
二,动态分区分配算法
三,分区分配操作
- 分配内存
- 回收内存,此时应将回收区与插入点的前一个分区进行合,不必为回收分区分配新表项
4.3.4 基于顺序搜索的动态分区分配算法
基于顺序搜索的动态分区分配算法有如下四种:
- 首次试适应算法
- 循环首次适应算法
- 最佳适应算法
- 最坏适应算法
首次适应算法(FF): FF算法要求空闲分区链以地址递增的次序链接。在分配内存时,从链首开始顺序查找,直至找到一个大小能满足要求的空闲分区为止。其缺点是低址部分不断被划分,会留下许多难以利用的,很小的空闲分区
首次循环首次适应算法(NF):
为进程分配内存空间时,不再是每次都从链首开始查找,而是从上次的空闲分区的下一个空闲分区开始查找。该算法能使内存中的空闲分区分布得更加均匀,从而减少了查找空闲分区时的开销,但这样会缺乏大的空闲分区
最佳适应算法(BF):
该算法要求将所有的空闲分区按其容量以从小到大的顺序形成一空闲分区链
最坏适应算法(WF):
在扫描整个空闲分区或链表时,总是挑选一个最大的空闲区,从中分割一部分存储空间给作业使用,以至于存储器中缺乏较大的空闲分区,故把它称为最坏适应算法。最坏适应分配算法查找效率很高,该算法要求,将所有的空闲分区,按其容量大小以形成一空闲分区链,查找时,只要看第一个分区能否满足作业要求即可
4.3.5 基于索引搜索的动态分区分配算法
在大,中型系统中往往会采用基于索引搜索的动态分区算法,目前常用的有快速适应算法,伙伴系统和哈希算法。
目前最常用的有
- 快速适应算法:又称为分类搜索法,是将空闲分区根据其容量大小进行分类,对于每一类具有相同容量的所有空闲分区,单独设立一个空闲分区链表,这样系统中存在多个空闲分区链表。
- 伙伴系统
- 哈希算法
4.3.6 动态可重定位分区分配
- 紧凑:当一台计算机运行了一段时间后,它的内存空间将会被分割成许多小的分区,而缺乏大的分空闲空间,即使这些分散的许多小分区的容量总和大于要装入的程序,但由于这些分区不相邻接,也无法把该程序装入内存中。通过移动内存中作业位置,把原来多个分散的小分区拼接成一个大分区的方法,称为拼接或紧凑。
- 动态重定位:需在系统中增设一个重定位寄存器,用它来存放程序(数据)在内存中的起始地址。地址变换过程是在程序执行期间,随着对每条指令或数据的访问自动进行的,故称为动态重定位。
- 动态重定位分区分配算法
4.4 对换
4.5分页存储管理方式
根据在离散分配时所分配的地址空间的基本单位的不同,又可将离散分配分为以下三种:
- 分页存储管理方式
- 分段存储管理方式
- 段页式存储管理方式
4.5.1 分页存储管理的基本方式
- 页面和物理块
- 页面。分页存储管理将进程的逻辑地址空间分为若干页,并为各页加以编号,也把内存的物理地址空间分为若干个块,同样也为它们加以编号。在为进程分配内存时,以块为单位,将进程中的若干个页分别装入到多个可以不相邻的物理块中。
- 页面大小。页面大小应选择适中,且页面大小应是2的幂,通常为 1KB ~ 8KB。
- 地址结构
- 页表:在分页系统中,允许将各个进程的各个页离散地存储在内存的任一物理块中,为保证进程仍然能够正确的运行,即能在内存中找到每个页面对应的物理块,系统又为每个进程建立了一张页面映像表,简称页表。在进程地址空间内的所有页,依次在页表中都有一个页表项,其中记录了相应页在内存中对应的物理块号。可见,页表的作用是实现从页号到物理块号的地址映射。
4.5.2 地址变换机构
为了能将用户地址空间中的逻辑转换为内存空间中的物理地址,在系统中必须设置地址变换机构。该机构的基本任务是实现从逻辑地址到物理地址的转换。地址变换任务是借助于业表来完成的。
-
基本的地址变换机构
- 页表功能是由一组专门的寄存器来实现的,一个页表项用一个寄存器。
- 页表大多驻留在内存中。
- 平时,进程未执行时,页表的始址和页表长度存放在本进程的PCB中。当调度程序调度到某进程时,才将这两个数据装入页表寄存器中。因此,在单处理机环境下,虽然系统中可以运行多个进程,但只需一个页表寄存器。
-
具有快表的地址变换机构
为了提高地址变换速度,可在地址变换机构中增设了一个具有并行查寻能力的特殊高速缓冲寄存器,又称联想寄存器,或称快表,用以存放当前访问的那些页表项。
4.5.3 访问内存的有效时间
从进程发出指定逻辑地址的访问请求,经过地址变换,到在内存中找到对应的实际物理地址单元并取出数据,所需要花费的总时间,称为内存的有效访问时间(EAT)。
所谓命中率, 是指使用快表并在其中成功查找到所需页面的表项的比率,这样,在引入快表的分页存储管理方式中,有效访问时间的计算公式:
4.5.4 两级和多级页表
现在的大多数计算机系统都支持非常大的逻辑地址空间。在这样的环境下,页表就变得非常大,要占用相当大的内存空间。而且还要求连续的,显然这是不现实的,我们可以采用这样两个方法来解决这一问题。
-
对页表所需的内存空间,可采用离散分配方式,以解决难以找到一块连续大内存空间的问题。
-
只将当前需要的部分页表项调入内存,其余的页表项仍驻留在磁盘上,需要时再调入。
4.6 分段存储管理方式
为了更好地提高内存的利用率,进而又从连续发生分配方式发展到离散方式–分页存储管理方式。如果说,推动上述发展的主要动力都是直接或间接的出于提高内存利用率的目的,那么引入分段管理方式的目的,是为了满足用户在编程和使用上的多方面要求。
4.6.1 分段仓储管理方式的引入
为什么要引入分段存储管理方式,一方面是由于通常的程序都可分为若干段,每个段大多是以一个相对独立的逻辑单位;另一方面,实现和满足信息共享,信息保护,动态链接以及信息动态增长等需要,都是以段为单位的。
- 方便编程
- 信息共享
- 信息保护
- 动态增长
- 动态链接
4.6.2 分段系统的基本原理
- 分段:分段存储管理方式中,作业的地址空间被划为若干个段,每个段定义了一组逻辑信息。段的长度由相应的逻辑信息组的长度决定,因此各段的长并不相等。
- 段表:在分段式存储管理系统中,则是为每个分段分配一个连续的分区,进程中的各个段,可以离散地装入内存中不同的分区中,为保证程序能正常运行,就必须能从内存物理内存中找出每个逻辑段所对应的位置。为此,在系统中,类似于分页系统,需要为每个进程建立一张段映射表。段表可以存放在一组寄存器中,以利于提高地址转换速度。但更常见的方法是将段表放在内存中。段表是用于实现从逻辑段到物理内存区的映射的。
- 地址变换机构:为了实现进程从逻辑地址到物理地址的变化功能,在系统中设置了段表寄存器。
- 分页和分段的主要区别:两者都采用离散分配方式,且都是通过地址映射机构实现地址变换。但在概念上两者完全不同,主要表现为下述三个方面:
- 页是信息的物理单位。采用分页存储管理方式是为了实现离散分配方式,以消减内存的外零头,提高内存的利用率。分段存储管理方式则是信息的逻辑单位,它通常包含的是一组意义相对完整的信息。分段的主要目的在于能更好地满足用户的需要。
- 页的大小固定且由系统决定。而段的长度不固定,决定于用户所编写的程序。
- 分页的用户程序地址空间是一维的。而在分段系统中,用户程序地址空间是二维的。
4.6.3 信息共享
分段系统的一个突出优点,是易于实现段的共享。
4.6.4 段页式存储管理方式
分页系统以页面作为内存分配的基本单位,能有效地提高内存利用率,而分段系统,以段作为内存分配的基本单位,它能够更好地满足用户多方面的需求。对两种存储管理方式各取所长–段页式存储管理方式。特点是:
- 便于实现
- 分段可共享
- 易于保护
- 动态链接
基本原理
段页式系统的基本原理是分段和分页原理的结合,将用户程序分成若干段,再把每个段分成若干个页,并为每一个段赋予一个段名。
地址变换过程
在段页式系统中,为了便于实现地址的变换,须配置一个段表寄存器。