一、存储器管理的基础知识
(在计算机的存储系统,存储器是计算机的重要组成部分,它可分为:计算机内部的存储器(简称内存),计算机外部的存储器(简称外存)。内存储器从功能上又可以分为:读写存储器RAM,只读存储器ROM两大类)
1. 层次结构:
1)主存储器(简称内存)
作用:保存进程运行时的程序和数据
- 寄存器和高速缓存
作用:缓和内存的访问速度与CPU指令执行速度不匹配的矛盾
2.磁盘缓存
作用:缓和磁盘I/O速度与内存的访问速度不匹配的矛盾
- 程序的装入和链接
- 对用户程序的处理和步骤
compile Link Load
源程序 目标模块 装入模块 内存
compiler Linker Loader
- 几个重要概念(地址的分类):
- 物理地址(绝对地址):计算机内存单元的真实地址
- 内存空间:物理内存是各程序共享的物质基础,由0-(m-1)个物理地址组成
- 逻辑地址(相对地址):用户的程序地址
- 逻辑空间:程序地址均从“0”开始
- 名地址:源程序地址
- 程序的装入的分类及依据
- 绝对装入方式
装入模块被装入后,程序中的逻辑地址与实际物理地址完全相同
缺点:只适用于单道系统,要求程序员熟悉内存的使用情况等
2.可重定位装入方式
3.动态运行时装入方式
在把装入模块装入到内存后,并不立即把装入模块中的相对地址转换成绝对地址,而是把这种地址转换推迟到程序真正执行时才进行。因此,装入内存后的所有地址都仍然是相对地址。
- 程序的链接的分类及依据
- 静态链接方式
对相对地址的修改,变换外部调用符号
2.装入时动态链接
将几个目标模块装入内存时边装入边连接
优点:便于修改和更新;便于实现对目标模块的共享
3.运行时动态链接
将某些目标模块的链接,推迟到执行时才进行
优点:加快程序的装入过程;节省内存空间
- 重定位
- 定义:对地址部分的调整过程
- 类型:
①静态重定位
映射时间:装入内存时,地址映射一次完成
特点:运行过程中不可移动位置;内存利用率低
优点:不需要硬件支持。
缺点:使用静态重定位方法进行地址变换无法实现虚拟存储器。
必须占用连续的内存空间,这就难以做到程序和数据的共享。
②动态重定位
映射时间:执行期间,地址映射由“硬件地址变换机构”动态完成
特点:运行过程中可移动位置;需附加硬件支持
优点:可以对内存进行非连续分配。
动态重定位提供了实现虚拟存储器的基础。
有利于程序段的共享。
缺点:需要硬件支持
实现存储管理的软件算法比较复杂
- 连续分配方式
1.连续分配存储管理分配的定义:
是指为一个用户程序分配一个连续的内存空间
2.分类:
1)单一连续分配
基本思想:内存划分为:系统区和用户区
只能用于单用户,单任务的操作系统中
特点:方法简单,易于实现
单道程序:内存和CPU利用率低,难于实现共享
- 固定分区分配
基本思想:把内存用户空间划分为若干个固定大小的分区
每个分区只装入一道作业
划分分区的方法:分区大小相等;分区大小不等
具体实现:将分区按大小排队
建立分区使用表
表项包括:①分区号 ②分区起始地址 ③分区大小 ④分区状态
当程序装入时,由内存分配程序检索分区使用表
若找到符合要求的分区,则完成内存分配,并进行标记
若未找到,则拒绝内存分配
缺点:内碎片问题;限制了并发执行的程序数目
2.动态分区分配
基本思想:作业装入时,根据实际需要和内存空间的使用情况进行动态分配
特点:分区个数,分区大小不固定
分区分配中的数据结构:空闲分区表,已分配分区表
空闲分区链
内存分配和回收过程:
分区分配算法:
①基于顺序搜索的动态分区分配算法
- 首次适应算法(FF)
算法思想:
空闲分区表或空闲分区按照分区起址递增的次序排序。顺序查找,若找到第一个大小满足要求的空闲分区,则从中划出一块内存空间分配给作业;若未能找到,则此次内存分配失败
2.循环首次适应算法(NF)
算法思想:
从上次分配的空间区位置之后开始查找。若找到一个满足要求的空闲分区,则从中划出一块内存空间分配给作业。若最后一块空闲分区大小仍不能满足要求,则返回到第一个空闲分区继续查找
3.最佳适应算法(BF)
算法思想:
从满足要求的,最小的空闲分区中划出一块空间分配给作业,要求空闲分区表或空闲分区链按照分区容量递增的次序排序,顺序查找第一个满足要求的空闲分区
4.最坏适应算法(WF)
算法思想:
从满足要求的,最大的空闲分区中划出一块空间分配给作业。要求空闲分区表或空闲分区链按照扥去容量递增的次序排序
优点:查找速度快,分配后剩下的可用空间较大
缺点:一段时间后会缺乏较大空闲区
②基于索引搜索的动态分区分配算法
- 快速适应算法
算法思想:
将空闲分区按照进程常用的空间大小进行分类,分配时,根据进程长度,寻找到能容纳它的最小空闲链表,并取下第一块进行分配
优点:查找效率高
缺点:分区归还主存时算法复杂
(2)伙伴算法
算法思想:
该算法规定,无论已分配分区或空闲分区,其大小均为2的k次幂(k为整数,l≤k≤m)。通常2m是整个可分配内存的大小(也就是最大分区的大小)。在伙伴系统中,对于一个大小为2k,地址为x的内存块,其伙伴块的地址则用buddyk(x)表示,其通式为:
(3)哈希算法
算法思想:
哈希算法就是利用哈希快速查找的优点,以及空闲分区在可利用空间表中的分布规律,建立哈希函数,构造一张以空闲分区大小为关键字的哈希表,该表的每一个表项记录了一个对应的空闲分区链表表头指针。当进行空闲分区分配时,根据所需空闲分区大小,通过哈希函数计算,即得到在哈希表中的位置,从中得到相应的空闲分区链表,实现最佳分配策略。
优点:快速查找
- 可重定位分区分配
- 紧凑:
连续分配方式的一个重要特点是,一个系统或用户程序必须被装入一片连续的内存空间中。当一台计算机运行了一段时间后,它的内存空间将会被分割成许多小的分区,而缺乏大的空闲空间。即使这些分散的许多小分区的容量总和大于要装入的程序,但由于这些分区不相邻接,也无法把该程序装入内存。
2.动态重定位:
为使地址的转换不会影响到指令的执行速度,必须有硬件地址变换机构的支持,即须在系统中增设一个重定位寄存器,用它来存放程序(数据)在内存中的起始地址。程序在执行时,真正访问的内存地址是相对地址与重定位寄存器中的地址相加而形成的。随着对每条指令或数据的访问自动进行的,故称为动态重定位。
3.内存分配和回收过程
4.分配算法同动态分区分配算法
动态重定位分区分配算法与动态分区分配算法基本上相同,差别仅在于:在这种分配算法中,增加了紧凑的功能。通常,当该算法不能找到一个足够大的空闲分区以满足用户需求时,如果所有的小的空闲分区的容量总和大于用户的要求,这时便须对内存进行“紧凑”,将经“紧凑”后所得到的大空闲分区分配给用户。如果所有的小的空闲分区的容量总和仍小于用户的要求,则返回分配失败信息。
3.碎片的定义及分类
1)内部碎片:内存某存储区间大于其存放作业空间的部分。
2)外部碎片:内存某存储区间容不下要运行的作业时。
- 对换
1.定义:
是指把内存中暂时不能运行的进程或暂时不用的程序和数据调出外存,以腾出空间把已具备运行那个条件的进程或程序数据调入内存。
2.为何引入对换,对换对应进程管理中哪一个操作?
目的:解决内存不足的问题
对应管理中的操作:进程的换入和换出
3.类型:
1)整体对换:以进程为单位的对换,用于分时系统
2)部分对换:以“页”或“段”为单位的对换,支持虚拟存储系统
4.对换区的管理方式是什么?其相应的管理数据结构是什么?
1)外存划分:
(1)文件区:存放文件,采用离散分配方式,管理目标是提高文件存储空间的利用率
(2)对换区:存放从内存换出的进程,采用连续分配方式,目标是提高进程换入和换 出的速度
2)数据结构:为了实现对对换区中的空闲盘块的管理,在系统中应配置相应的数据结构,用于记录外存对换区中的空闲盘块的使用情况。其数据结构的形式与内存在动态分区分配中所用数据结构相似,即相同可以用空闲分区表或空闲分区链,在空闲分区表的每个表目中,应包含两项:对换区的首址及其大小,分别用盘块号和盘块数表示。
- 基本分页存储管理方式
1.离散分配方式概述:
基本思想:一个用户程序(进程)直接分散地装入到很多不相邻接的分区中
两种形式:分页存储管理方式;分段存储管理方式
2.页,块(页框)的定义?页的大小为何必须为2的幂?
1)页面的定义:分页存储管理,是将一个进程的逻辑地址空间分成若干个大小相等的片,称为页面或页
2)块(页框)的定义:把内存空间分成与页面相同大小的若干个存储块,称为块或页框
3)页的大小为何必须为2的幂:在分页系统中的页面大小应该适中,页面若太小,一方面虽然可使内存碎片减小,从而减少了内存碎片的总空间,有利于提高内存利用率,但另一方面也会使每个进程占用较多的页面,从而导致进程的页表过长,占用大量内存,此外,还会降低页面换进换出的效率,因此,页面的大小应选择的适中,且页面大小应是2的幂。
3.地址结构:
1)组成:由页号P和位移量W(或称为页内地址)组成
2)各组成部分的意思:地址长度为32位,其中0-11位为页内地址,即每页的大小为4KB;12-31位为页号,地址空间最多允许有1M页
3)如何将一个逻辑地址分解为(页号,页内地址)
对某特定机器,其地址结构是一定的。若给定一个逻辑地址空间中地址为A,页面的大小为L,则页号P和页内地址d可按下式求得:
P= INT[A/L]
d= [A] MOD L
4.页表
1)作用:实现从页号到物理块号的地址映射
2)结构:
5.如何完成重定位(地址转换)
当进程要访问某个逻辑地址中的数据时,分页地址变换机构会自动地将有效地址(相对地址)分为页号和页内地址两部分,再以页号为索引去检索页表,查找操作由硬件执行。在执行检索之前,先将页号与页表长度进行比较,如果页号大于或等于页表长度,则表示本次所访问的地址已超越进程的地址空间于是,这一错误将被系统发现并产生一地址越界中断。若未出现越界错误,则将页表始址与页号和页表项长度的乘积相加,便得到该表项在页表中的位置,于是可从中得到该页的物理块号,将之装入物理地址寄存器中。与此同时,再将有效地址寄存器中的页内地址送入物理地址爱寄存器的块内地址字段中。这样便完成了从逻辑地址到物理地址的变换。
6.快表
1)原因:由于页表放在内存,使得CPU存取一个数据时,要两次访问内存,为了提高速度,增设快表(高速寄存器)。
2)定义:用来保存正在运行进程的页表的子集
3)若有快表,重定位如何完成?
7.访问内存有效时间计算
1)内存的有效时间(EAT)的定义:
从进程发出指定逻辑地址的访问请求,经过地址变换,到在内存中找到对应的实际物理地址单元并取出数据,所需要花费的总时间,称为内存的有效访问时间(Effective Access Time,EAT)。
2)计算
假设访问一次内存的时间为t
(1)在基本分页存储管理方式中,有效访问时间:
EAT = t + t = 2t
(2)在引入快表的分页存储管理方式中,有效访问时间的计算公式即为:
EAT=а×λ+(t+λ)(1—а)+t=2t+λ—t×а
上式中,λ表示查找快表所需要的时间,а表示命中率,t表示访问一次内存所需要的时间。
8.两级页表的地址结构:
9.两级页表的重定位的过程:
为了地址变换实现上的方便起见,在地址变换机构中,同样需要增设一个外层页表寄存器,用于存放外层页表的起始地址,并利用逻辑地址中的外层页号,作为外层页表的索引,从中找到指定页表分页的地址,再利用P2作为指定页表分页的索引,找到指定的页表项,其中含有该页在内存的物理块号,用该块号和页内地址d即可构成访问的内存物理地址。
10.反置页表的定义:
反置页表一般被视为使用正常的系统内存的TLB的片外扩展,与真正的页表不同,它不需要容纳目前所有的映射
11.在反转页表支持下,地址变换过程:
当利用反置页表进行地址变换时,用进程的标识符和页号,去检索反置页表;若找到,则该表项的序号就是该页所在的物理块号;若找不到,说明此页未调入内存,此时产生缺页中断。
- 基本分段存储管理
1.为何引入分段存储管理:
1)方便编程(逻辑完整)
2)信息共享
3)信息保护
4)动态增长
5)动态链接
2.段
1)定义:每个段在表中占有一个表项,其中记录了该段在内存中的起始地址(又称为“基址”)和段的长度
2)大小:段的长度由相应的逻辑信息组的长度决定,每个段的最大长度为64KB
3.地址结构
1)组成:
由段号和段内地址组成
2)各部分组成的意思:
每个段都有自己的名字,可用一个段号来代替段名,每个段都从0开始编址,并采用一段连续的地址空间。
4.段表
1)作用:
用于实现从逻辑段到物理内存区的映射
2)结构:
从物理内存中找出每个逻辑段所对应的位置,在系统中为每个进程建立一张段映射表,简称“段表”
5.如何完成重定位(地址转换):
6.分段与分页的异同:
1)页是信息的物理单位,分页是为实现离散分配方式,以消除内存的外零头,提高内存的利用率,或者说,分页仅仅是由于系统管理的需要而不是用户的需要,段则是信息的逻辑单位,它含有一组其意义相对完整的信息。分段的目的是为了能更好的满足用户的需要。
2)页的大小固定且由系统决定,由系统把逻辑地址划分为页号和页内地址两部分,是由机器硬件实现的,因而在系统中只能有一种大小的页面;而段的长度却不固定,决定于用户所编写的程序,通常由编译程序在对源程序进行编译时,根据信息的性质来划分。
3)分页的作业地址空间是一维的,即单一的线性地址空间,程序员只需利用一个记忆符,即可表示一个地址;而分段的作业地址看是二维的,程序员在标识一个地址时,既需给出段名,又需给出段内地址。
7.信息共享
1)如何实现:
在分段系统中,由于是以段为基本单位的,不管该段有多大,我们都只需为该段设置一个段表项,因此使实现共享变得非常容易。
2)可重入代码(Reentrant Code):
又称为“纯代码”(Pure Code),是一种允许多个进程同时访问的代码,并且是一种不允许任何进程对它进行修改的代码。
六、段页式存储管理
1.为何引入段页式存储管理
因为前面所介绍的分页和分段存储管理方式都各有其优缺点,如果能对两种管理方式“各取所长”,则可以将两者结合成一种新的存储管理方式系统,这种新系统既具有分段系统的便于实现,分段可共享,易于保护,可动态链接等一系列优点,又能像分页系统那样很好地解决内存的外部碎片问题,以及可为各个分段离散地分配内存等问题。
2.地址结构
1)组成:
由段号(S),段内页号(P)及页内地址(W)三部分所组成
3.地址转换:
4.段表与页表的对应关系:
1)页表是内存的地址表,里面存放的是内存的地址,段表存放的是段的描述符
2)段表中包括段的类型,例如代码段,数据段,堆栈段等,包括段的界限,包括段的访问限制等
3)段表和页表没有直接的关系