本章思维导图
存储器是计算机系统的重要组成部分。存储器管理的主要对象是内存。
5.1 存储器的层次结构
5.1.1 多层结构的存储器
1 存储器的多层结构
对于通用计算机来说,存储层次一般为3层:CPU寄存器,主存储器,辅助存储器(辅存)。
对于较高档的计算机,存储层次分为6层:寄存器、高速缓存、主存储器、磁盘缓存、固定磁盘、可移动存储介质。
其中,寄存器、高速缓存、主存储器、磁盘缓存,断电后它们所存储的信息将不会存在;而固定磁盘、可移动存储介质,它们所存储的信息会被长期保存。
2 可执行存储器
寄存器和主存储器被称为可执行存储器。进程可以在很少的时钟周期内使用一条load或store指令对可执行存储器进行访问。
5.1.2 主存储器和寄存器
1 主存储器
主存储器,简称主存或内存,也称为可执行存储器,是计算机系统中的主要部件,用于保存进程运行时的程序和数据。
2 寄存器
寄存器是CPU内部的一些小型存储区域,用于暂时存放参与运算的指令、数据和运算结果等。在当前的微机系统和中大型计算机中,寄存器的数目都已增加到数十个到数百个,而寄存器的长度一般是32位或64位。
5.1.3 高速缓存和磁盘缓存
1 高速缓存
高速缓存是现代计算机结构中的一个重要部件,它是介于寄存器和内存之间的存储器,主要用于备份内存中较常用的数据,减少处理机对内存的访问次数,这样可以大幅度地提高程序执行速度。高速缓存的容量一般为几十KB到几十MB(有时到达几百MB),访问速度快于内存。
2 磁盘缓存
磁盘缓存,主要用于暂时存放频繁使用的一部分磁盘数据,以减少访问磁盘的次数。它是利用内存中的部分存储空间,暂时存放从磁盘中读出的信息。
5.2 程序的装入与链接
程序的运行一般经过三个步骤(可执行文件)
(1)编译:由编译程序对用户源程序进行编译,形成若干个目标模块;
(2)链接:由链接程序将编译后形成的一组目标模块以及它们所需要的库函数链接在一起,形成一个完整的装入模块;
(3)装入:由装入程序将装入模块装入内存。
5.2.1 地址绑定和内存保护
1 逻辑地址和物理地址
逻辑地址:CPU生成的地址。
物理地址:内存单元看到的地址(装入内存地址寄存器的地址)。
2 内存保护
(1)确保每个进程都有一个单独的内存空间。
(2)分开内存空间是通过两个寄存器来实现的,基地址寄存器和界限寄存器。
内存空间保护的实现是通过CPU硬件对在用户态下产生的物理地址与寄存器的地址进行比较完成的。即判断 “基地址<=物理地址<(基地址+界限地址)”是否成立。
加载基地址寄存器和界限寄存器时必须使用特权指令,但特权指令只能在内核态下运行。
5.2.2 程序的装入
1 绝对装入方式(单道程序环境)
绝对装入方式适用于计算机系统很小,知道程序在内存中的位置。通常会选择在程序中采用符号地址,然后在编译或汇编时,再将这些符号地址变换为绝对地址。
2 可重定位装入方式(多道程序环境,内存位置固定)
重定位:在装入时对目标程序中指令和数据的逻辑地址变换为物理地址的过程。
可以根据内存的实际情况将程序放在内存合适的位置(位置固定)。
3 动态运行时装入方式(多道程序环境,内存位置动态变化)
动态运行时装入方式再把装入模块装入内存后,并不会立即把装入模块中的相对地址变换为绝对地址,而是会把这种地址推迟到程序真正要执行时才进行。
5.2.3 程序的链接
1 静态链接
在程序运行之前,先将各目标模块及它们所需的库函数链接成一个完整的装配模块,以后不再拆开,这种方式成为静态链接。在链接成完整的装配模块须解决两个问题:修改相对地址和变换外部调用符号。
2 装入时动态链接
将用户源程序编译后所得到的一组目标模块,在装入内存时,采用边装入边链接的链接方式。优点:便于修改和更新;便于实现对目标模块的共享。
3 运行时动态链接
最流行的方式,对装入时动态链接的一种改进。
5.3 对换与覆盖
5.3.1 多道程序环境下的对换技术
正常轮换进行作业调度,一个作业完成将其放至后备队列等待,继续调下一个作业。
1 对换
把内存中暂时不能运行的进程或者暂时不用的程序和数据,转移到外存上,以便腾出足够的内存空间,再把已具备运行条件的进程或进程所需要的程序和数据存入内存。
2 对换的类型
(1)整体对换。处理机中级调度实际上就是存储器的对换功能,其目的是解决内存紧张问题。
(2)页面(分段)变换。这种对换是实现请求分页和请求分段存储管理的基础。
5.3.2 对换区的管理
1 对换区管理的主要目标
在OS中,磁盘空间分为文件区和对换区。
(1)文件区管理的主要目标。文件区的管理应采取离散分配存储管理方式。
(2)对换区管理的主要目标。对换区的管理应采取连续分配存储管理方式。
2 对换区空闲盘块管理中的数据结构
与内存在动态分区分配方式中所用的数据结构相似,同样可以使用空闲分区表或空闲分区链。
3 对换区的分配与回收
与采用动态分区方式时的内存分配与回收方式类似。算法可以是首次适应算法、循环首次适应算法或最佳适应算法。
5.3.3 进程的换出与换入
1 进程的换出
两个步骤:选择被换出的进程;换出进程。
2 进程的换入
查看PCB集合中所有进程的状态,从中找出处于“就绪”状态但已被换出的进程。
5.3.4 覆盖
覆盖:在任何时候只在内存中保留所需的指令和数据;当需要其他指令和数据时,它们就会被装入刚刚不需要的指令和数据所占用的内存空间。
让进程的大小比它分配到的内存空间大,可以使用覆盖技术。
覆盖的优点:不需要OS的特别支撑。用户通过简单的文件结构将文件读入内存,并执行所读指令,即可实现完全覆盖。
覆盖的缺点:覆盖程序设计很复杂;使用通常局限于微处理机和只有优先物理内存且缺乏先进硬件支持的其它系统。
5.4 连续分配存储管理方式
连续分配存储管理方式分为4类:单一连续分配、固定分区分配、动态分区分配、动态重定位分区分配。
5.4.1 单一连续分配
早期的存储器管理方式把内分为系统区和用户区两部分。
系统区仅供OS使用,通常放在内存的低址部分。用户区中整个内存的用户区由该程序独占。
5.4.2 固定分区分配
早期的多道程序系统,将整个用户空间划分为若干个固定大小的区域(称为分区),内存中有几个用户分区,就允许几个程序并发运行。
1 分区划分
分区划分有两种方式。分区大小相等和分区大小不等。
2 内存分配
为了便于内存分配,通常将分区按其大小进行排队,并建立一张固定分区使用表,其中包含每个分区的起始地址、大小及状态(是否已分配)。
5.4.3 动态分区分配
动态分区分配涉及动态分区分配中所用的数据结构、动态分区分配算法以及分区的分配与回收操作这3方面的问题。
1 动态分区分配中的数据结构
常用的数据结构有两种形式。
(1)空闲分区表。系统中设置一张空闲分区表,用于记录每个空闲分区的情况。每个空闲分区占一个表目,表目中包括分区号、分区大小和分区起始地址等数据项。
(2)空闲分区链。 在每个分区的头部,设置一些用于控制分区分配的信息和连接各分区所用的前向指针,在每个分区尾部则设置一个后向指针。
2 动态分区分配算法
常见的分区分配算法按分区检索方式可分为顺序分配算法和索引分配算法。
(1)基于顺序搜索的动态分区分配算法(顺序分配算法)
基于顺序搜索的动态分区分配算法有四种:首次适应算法,循环首次适应算法,最佳适应算法,最坏适应算法。
a.首次适应算法(FF):首次适应算法要求空闲分区链以地址递增的次序链接。首次适应算法倾向于优先利用内存中低址部分的空闲分区,保留大部分高址空间分区。缺点:查找困难;低址部分不断划分出现很多碎片。
b.循环首次适应算法(NF):循环首次适应算法要求从上次找到的空闲分区的下一个空闲分区开始查找,找到满足要求的空闲分区,从中划出一块与请求的大小相等的内存空间分配给作业。(需要用指针)
c.最佳适应算法(BF):最佳适应算法要求将所有的空闲分区按其容量从小到大的顺序排成一个空闲分区链。
d.最坏适应算法(WF):最坏适应算法要求将所有的空闲分区按其容量从大到小的顺序排成一个空闲分区链,查找时只看第一个分区是否满足作业要求。
(2)基于索引搜索的动态分区分配算法(索引分配算法)
目前常用的基于索引搜索的动态分区分配算法有三种:快速适应算法、伙伴系统和哈希算法。
a.快速适应算法(QF):以空间换时间的做法。分为两步:第一步是根据进程长度,在索引表中找到能容纳它的最小空闲分区链表;第二步是从链表中取下第一块进行分配。
b.伙伴系统:规定无论已分配分区还是空闲分区,其大小均为2的k次幂,k为正整数。
c.哈希算法:建立哈希函数,构造一张以空闲分区为大小为关键字的哈希表,该表的每个表项均记录了一个对应的空闲分区链表表头指针。
3 分区的分配与回收
在动态分区存储管理方式中,主要的操作是分配内存和回收内存。
(1)分配内存
分配内存是指系统利用某种分配算法,从空闲分区链表中找到所需大小的分区。
(2)内存回收
进程运行完毕后释放内存时,系统会根据回收区的起始地址,从空闲分区链表中找到相应的插入点。
5.4.4 动态重定位分区分配
1 紧凑
连续分配方式的一个重要特点是,一个系统或用户程序必须被装入一个连续的内存空间中。
当一台计算机运行了一段时间后,它的内存空间将会被分割成许多小分区,这些被称之为“碎片”。
如果要将大作业装入内存,就可将内存中的所有作业进行移动,使他们全部都相邻接。
通过移动内存中作业的位置,把原来分散的多个小分区拼接成一个大分区的方法,称为“紧凑”。
2 动态重定位
程序在执行时,真正访问的内存地址是相对地址与重定位寄存器中的地址相加而形成的。
地址变换过程是在程序执行期间随着对每条指令或数据的访问自动进行的,因此称为动态重定位。
3 动态重定位分区分配算法
动态重定位分区分配算法与动态分区分配算法基本相同,不同仅在于:前者增加了“紧凑”功能。
5.5 分页存储管理方式
如果允许将一个进程直接分散地装入许多不相邻接的分区中,可充分利用内存空间而无须再进行“紧凑”。基于此思想产生了离散分配存储管理方式,离散分配存储管理方式有3种。
(1)分页存储管理方式。
(2)分段存储管理方式。
(3)段页式存储管理方式。目前应用较广泛的。
5.5.1 分页存储管理的基本方法
1 页面和物理块
(1)页面。分页存储管理将进程的地址空间分为若干个页,并为每页加以编号,从0开始;将内存空间分成若干个块,并为每块加以编号,如0#块。
(2)页面大小。页面的大小应选择得适中,且页面大小应是2的幂,通常为1KB,2KB,4KB,8KB。
2 地址结构
该结构包含两部分内容,前一部分为页号P,后一部分为位移量W(页内地址)。图中地址长度为32位,其中0~11位为页内地址,即每页的大小为4KB;12~31位为页号,地址空间最多允许有1M页。
页号P和页内地址d可以按上式求得。其中INT是向下取整函数,MOD是取余函数。
3 页表
为每个进程建立一张页面映像表。页表的作用是实现从页号到物理块号的地址映射。
5.5.2 地址变换机构
地址变换机构是为了将用户地址空间中的逻辑地址变换为内存空间中的物理地址。由于页大小等于快大小,因此页内地址和块内地址是一一对应的。地址变换机构就是将逻辑地址中的页号变换为内存中的物理块号。地址变换是借助页表来完成的。
1 基本的地址变换机构
当进程要访问某个逻辑地址中的数据时,分页地址变换机构会自动将有效地址(相对地址)分为页号和页内地址两部分,再以页号为索引去检索页表。具体看图即可。
2 基本快表的地址变换机构
页表是存放在内存中的,这使CPU在每次存取一个数据时都要访问内存两次。第一次是访问内存中的页表,从中找到指定页的物理块号,再将块号与页内偏移量拼接,形成物理地址。第二次访问是从第一次所得地址中获得所需数据。
为了提高地址变换速度,可在地址变换机构中增设一个具有并行查寻能力的高速缓冲寄存器,称为“快表”,在IBM系统中又被称为地址变换高速缓存。
5.5.3 引入快表后的内存有效访问时间
从进程发出指定逻辑地址的访问请求,经地址变换,到在内存中找到对应的实际物理地址单元并取出数据所经过的总时间,称为内存的有效访问时间(EAT)。计算公式如下:
EAT=2t+λ-t×a
其中λ表示查找块表所需的时间,a表示命中率,t表示访问一次内存所需要的时间。
5.5.4 两级页表和多级页表
1 两级页表
针对难以找到连续的大内存空间来存放页表的问题,可利用将页表进行分页的方法,使每个页面的大小与内存物理块的大小相同。
以上均为32位逻辑地址空间为例。
2 多级页表
对于32位的计算机,采用两级页表结构是合适的,但对于64位的计算机,采用两级页表是否仍然合适,需做简单分析。
对于64位的计算机,如果要求它能支持1844744TB(2的64B)即64位长度,规模的物理存储空间,则即使采用三级页表结构也是难以办到。但在现在的64位计算机中,把可直接寻址的存储器空间减少为48位长度,这样利用三级页表结构就可以实现分页存储管理。
5.5.5 反置页表
1 反置页表
反置页表是为每个物理块设置一个页表项,并将它们按物理块的编号进行排序,其中的内容则是页号和其所隶属进程的标识符。
2 地址变换
利用反置页表进行地址变换时,会根据进程标识符pid和页号p检索反置页表。
反置页表在进行地址变换时,随着内存的增大,页表项的数目会非常大,这时可利用哈希算法来进行检索,但要避免“哈希冲突”。
5.6 分段存储管理方式
5.6.1 分段存储管理方式的优点
1 方便编程
2 信息共享
3 信息保护
4 动态链接
5 动态增长
5.6.2 分段系统的基本原理
1 分段
在分段存储管理方式中,作业的地址空间被划分为若干段,每个段都定义了一组逻辑信息,如主程序段MAIN、子程序段X、数据段D及栈段S等。每个段都有自己的名字。
分段地址中的地址结构如下:
在该地址结构中,允许一个作业最长有64K个段,每个段最大长度为64KB。
2 段表
在分段存储管理系统中,为每个分段分配一个连续的分区。在系统中为每个进程建立一张段映射表,简称“段表”。段表是用于实现从逻辑段到物理内存区映射的。
3 地址变换机构
为了实现进程从逻辑地址到物理地址的变换功能,在系统中设置了段表寄存器,用于存放段表起始地址和段表长度TL。
当段表放在内存中时,每当访问一个数据,都须访问两次内存。要解决这个问题,和分页系统一样,也增加一个快表,用于保存最近常用的段表项。
4 分页和分段的主要区别
(1)页是信息的物理单位。分页存储管理方式只是系统管理的需要,完全是系统的行为,对用户是不可见的。分段存储管理方式中的段,则是信息的逻辑单位,它是为了更好为用户服务。
(2)页的大小固定且由系统决定。分页存储管理方式直接由硬件实现。分段存储管理方式是由用户编写程序实现。
(3)分页的用户程序地址空间是一维的。分页存储管理方式中,用户程序的地址属于单一的线性地址空间。分段存储管理方式中,用户程序的地址空间是二维的。
5.6.3 信息共享
1 分页系统中对程序和数据的共享
2 分段系统中对程序和数据的共享
5.7 段页式存储管理方式
分页系统以页面为内存分配的基本单位,能有效地提高内存利用率;分段系统以段位内存分配的基本单位,能更好地满足用户多方面的需要。可以各取所长,可以形成一种新的存储管理方式—段页式存储管理方式。
1 基本原理
段页式存储管理方式的基本原理,是分段和分页原理的结合,先将用户程序分成若干段,再把每段分成若干页,并为每一个程序赋予一个段名。
在段页式存储管理方式下,为了实现从逻辑地址到物理地址的变换,系统中需要同时配置段表和页表。
2 地址变换机构
在段页式存储管理方式下,为了实现进程从逻辑地址到物理地址的变换功能,在系统中设置了段表寄存器,用于存放段表起始地址和段表长度TL。
在段页式存储管理方式下,为了获得一条指令或数据,须三次访问内存。第一次访问是访问内存中的段表,从中获得页表起始地址;第二次访问是访问内存中的页表,从中取得该页所在的物理块号,并利用该物理块号与页内地址来一起构成指令或数据的物理地址;第三次访问才是真正地从第二次访问所得的地址中取出指令或数据。