3存储器管理Word文档格式.docx
《3存储器管理Word文档格式.docx》由会员分享,可在线阅读,更多相关《3存储器管理Word文档格式.docx(20页珍藏版)》请在冰豆网上搜索。
![3存储器管理Word文档格式.docx](https://file1.bdocx.com/fileroot1/2023-1/2/a646514b-a550-4b23-a2af-96c8969d6471/a646514b-a550-4b23-a2af-96c8969d64711.gif)
§
1中的概念;
5的请求式分页也称为单段式虚拟存储器;
6的分段存储也称为多段式虚拟存储器;
而§
7的段页式存储也属虚拟存储器管理.
1.概述
一:
存储器管理的目的和功能
1.内存的分配,管理和回收:
包括:
用户申请内存时是否响应?
如何分配?
(分配多少,分配哪部分)能否多次分配?
要记录哪些分配信息?
用完了是否回收等等.其中分配策略是本章的重点.
2.提高内存利用率:
#1使多道程序共享内存.(互不干扰,各占一段)
#2使多道程序共享某一段内存.(代码/数据的共用)
3.内存扩充
这里的扩充不是指硬扩充,而是指借助覆盖,交换和虚拟等软件技术来向用户提供比实际内存还要大的存储空间.
4.内存保护
#1各作业使用各自内存区域,互不干扰.
#2防止一作业的故意/无意破坏,保护其他作业的运行.
在286以上CPU都有硬件保护机制(地址保护),各OS和应用软件都可使用这些机制来保护.
二:
存储分配
所谓存储分配,主要讲述的是多道作业之间划分内存空间的问题,由于内存资源的有限,存储分配要解决如何把多个作业放入内存,是全部还是部分,以及放入的时间,地点,而这些问题的解决对用户必须是透明的(即用户不用考虑这些问题).常见的有三种方式:
1.直接指定方式
#1编程或编译后直接使用实际的存储地址,目前常用于工业实时控制.
#2直接控制方式有:
早期的独占;
多道作业的分区和覆盖三种.
其中覆盖是指把一个作业切分为几部分,每次调用一段运行于同一内存区域.
#3显然,为了直接指定存储地址,必须知道内存的容量和编址规则,对用户的要求比较高,尤其是对稍大点软件.因此目前几乎无人使用.
2.静态分配(StaticAllocation)
#1编程/编译后的地址空间从零开始,仅当装入内存时才由装配程序缺点其运行空间,即存储分配在装入前完成.
#2在运行时,不再进行存储分配,也不能在内存中移动.
3.动态分配(DynamicAllocation)
#1存储分配在装入时完成
#2在运行时可进行再分配,如增加,减少,移动等.
以上三种方式,其每次进行分配的内存必须是连续的.
三:
重定位(Relocation)
1.地址空间和存储空间
#1用高级语言编制的程序,其使用的是名字空间.如:
intx=0;
#2经编译链接后的目标程序,其使用的是一所限定的地址编号范围,称为地址空间,每个地址编号称逻辑地址.通常该地址编号的下限为零,然后按字节/字递增,所以这些地址都是相对于起始地址的,因而也称为相对地址.
#3内存中物理的记录单元集合称为存储空间,其单元编号称为物理地址/绝对地址.
总之,存储空间是"
实"
的,地址空间是"
虚"
的,而名字空间是地址空间的逻辑代号,更"
.
2.重定位
#1把作业地址空间中的逻辑地址变换成存储空间中的物理地址的地址变换过程称地址重定位,或地址映射.
0......
100xxxx
.......
0......1000......
10LoadAX,1001010LoadAX,1100
............
100xxxx1100xxxx
............物理空间
地址空间......
(图4-1)
#2如图,某作业装入物理空间后,取地址[100]的值要变换成现在的[1100],而不能再取现在的[100].
3.重定位的类型
#1静态重定位:
通过重定位装配程序在作业装入时就完成的地址变换过程.
如:
上例LoadAX,100变成LoadAX,1100.
优点:
由于地址变换在作业执行前一次集中完成,无需硬件机构参与,简单.
缺点:
A>
作业运行期不能移动,内存利用率不高.
B>
用户必须事先知道所需内存是否超过存储空间,若超过,则需用户考虑覆盖.
C>
作业间不能共享内存中的同一程序/数据区.
#2动态重定位:
作业执行时,当访问指令和数据时,由硬件地址变换机制实现地址变换的方式.算法是:
实际地址=有效地址+重定位寄存器值[RR]
上例LoadAX,100不变,但重定位寄存器值=1000.
由于指令/数据的实际地址在运行时确定,所以在运行时再进行存储分配是允许的.----可进行动态存储分配
作业间可共享内存中的某一公用段.
可向用户提供比物理存储空间大很多的地址空间.
需硬件机构参与
事先分配策略的软件比较复杂.
四:
存储管理的方式
1.常见的有分区式(静态/动态),分页式(纯/请求式),分段式(纯/请求式),段页式几种。
2.他们基本过程包括:
设计数据结构记录内存状况→确定分配算法→实现内存的分配与回收→逻辑地址与物理地址的转换→内存的共享与保护
3.以下各节描述也包括这些内容:
思想、数据结构、算法、操作、地址转换、内存保护。
2.分区式分配
一、单一连续区分配
1.这是早期的面向单用户,单任务OS的存储分配策略,如DOS,其把整个物理空间分成两部分:
#1系统区:
存放OS的驻留部分和其所需的内部数据结构,(如中断向量表)一般置于内存的低址部分.
#2用户区:
系统区以外的所有内存都可供用户使用.
2.早期的单用户,单任务OS有些配置了存储器保护机制,但常见的如CP/M,DOS都无保护机制,因为用户独占内存,不存在其他用户干扰问题,出问题是自己的责任,而OS被破坏则可重新启动来恢复.
3.分区式分配是早期的多用户OS的存储分配技术,包括:
固定式分配,可变分区分配,可重定位分区分配和多重分区分配四种.
固定式分区
1.把内存划分为若干个固定大小的区域,每区的边界固定不变.有两种形式:
#1分区大小相同:
对不同大小程序适应性差.
#2分区大小不同.
2.为实现分区,要建立一张分区说明表.
struct{
intnumber;
分区号大小起址状态
longStartAddr,size;
112K20K已分配
intstatus;
232K32K已分配
}AREA;
364K50K未分配
......
(图2-2)
3.由于分区是固定不变的,因此不能保证程序所需的内存恰好等于某一分区而必然有一部分的内存浪费----称为"
内零头"
(InternalFragmention).典型的OS例子是IBM/360机的MFT操作系统.
4.固定式分区不灵活,但是简单,因此在一台主机控制多台同种设备的控制领域仍有一定的使用.
可变式分区
1.指根据作用的实际需要,动态为之分配所需的内存空间,即分区边界可移动.
有两种:
①分区数固定,分区大小可变;
②分区数和分区大小都可变.
显然,方案一的分区说明表可用数组表示,简单;
方案二灵活,但是分区数不定,需用链表组织分区说明表.下面以方案二为例说明数据结构,算法和操作.
2.数据结构
两个链表:
已分配分区表和未分配分区表;
每记录包括始址,大小,状态和指针四项;
其链接的顺序与算法有关,可按大小有序/按始址有序/任意.
structarea{
structarea*next;
AREA*AllocTable,*FreeTable;
设立两个表:
已分配分区表AllocTable和空闲分区表FreeTable.
3.算法
设S是空闲分区的大小,R是要求分配的分区大小.
#1最佳适应算法
从空闲分区链表(最好能按分区大小有序)选择((S>
=R)&
&
(S-R最小))的分区,分配R内存给作业,剩余的S-R仍留在空闲链中以供下次分配;
若无满足条件的空闲分区,则不分配.
显然经多次S-R划分后,空闲链中的分区会越来越小而无法再用,形成分区碎片叫外零头.解决办法有①拼接边界邻接的碎片;
②修正条件,设置一个阀值G,若S-R<
G,则分配整个分区S给作业而不再切分以减少碎片.
#2最坏适应算法
与最佳适应算法相反,是选择((S>
(S-R最大))的分区划分.显然其划分后的剩余部分被再次切分的可能性更大,这是其优点;
但缺点是大作业找不到能满足的分区.
#3首次适应算法
这是对最佳和最坏适应算法的折中,空闲分区链接按起始地址有序,每次分配时,从链始查找,第一个满足的分区则分配之,且用碎片替换原位置.
本法的最大优点是简单,速度快.(如碎片不插入而是替换)而且链尾(即内存高端)有大的空闲分区.
缺点是经多次使用,碎片集中在链首,平均查找次数增大.
#4下次适应算法(循环适应算法)
为解决平均查找次数增大的缺点,下次查找从上次成功的下一结点始,空闲链为循环型,这样内存的利用更为均衡,但大空闲区随之减少.
总之:
每个算法都有优缺点.
4.操作
#1分配:
查找匹配分区,按算法分配内存,若有剩余则加到空闲链.
#2回收:
运行完后,回收内存,加到空闲链
查找插入位置,插入本空闲块.
若同某一空闲区与前邻接,则拼接.(修改大小,删除结点)
若同某一空闲区与后邻接,也拼接.(修改大小,删除结点)
5.地址转换和存储保护
四:
可重定位分区分配
1.固定式分区形成"
可变式分区形成"
外零头"
零头只要拼接起来就可再用,条件是:
前一分区始址+前一分区大小==后一分区的始址
2.为满足这个条件,只要把已分配分区按始址序向前移动即可,这种移动技术称为存储器紧凑(Compaction).
3.紧凑完成两个任务:
①把作业区内的数据搬家.
②设置重定位寄存器的值.
4.紧凑技术的好处是以增加相同延迟和其他开销为代价的,只能隔一定时间做一次;
或当内存紧张,碎片太多时才做.
5.所以可重定位分区:
是指可借助紧凑技术对可变分区进行重新定位的分区分配方法.
五:
多重分区分配
1.以上所述的作业所需内存都是指连续的区域,若一个作业所需的内存能按其所起的作用分成几段,则"
零头"
可能还有用.即一个作业的运行内存由几个分区组合,这种分配策略称多重分区策略.
2.显然这样分配后,作业的地址生成更复杂,要多个重定位寄存器,编译器也要能区分目前要使用哪个分区,哪个始址.
3.这种分配的另一好处是可以多作业的数据共享,某一分区作公用.
六:
分区的存储保护
防止一作业有意/无意破坏另一作业的运行,一般需硬件机制支持.
1.界限寄存器
设置上,下界限寄存器,若分配ADDR1到ADDR2之间的存储空间给作业X,则把ADDR1和ADDR2放入上下界限寄存器,作业X运行时的取地址值若在界限器内,则有效,否则发生中断.类似于xBASE语言中的GETxRANGEy1,y2
2.基址+限长寄存器
基址寄存器起到重定位寄存器RR的作用,而限长寄存器限制取址的最大偏移量,相当于界限寄存器的ADDR1=[基址],ADDR2=[基址]+[限长]
3.保护键方法
每个分区有一把锁,要使用这个分区必须要有相应的钥匙,否则拒绝访问.
3.分页存储管理
前叙除"
多重分区"
分配方法外,都属连续分区分配,会产生"
和"
而通过"
紧凑"
技术又会牺牲CPU时间,因而产生了离散分区分配.
纯分页系统(PurePagingSystem)
1.页面与页框
#1把作业的地址空间划分成大小相等的片,称为页面/页,Page.
#2把内存的物理空间划分成同页大小的片,称为页框/存储块,PageFrame.
#3分页存储分配是指对作业的内存分配以页为单位,且不要求页框邻接.
#4纯分页分配指作业分配时,一次分配给所需要的全部页框,若页框数不足,则等待.
#5显然最后一个页框不一定会装满而形成碎片,称"
页内碎片"
因此为减少碎片,似乎页大小应尽量小以减少浪费;
但每页太小,则所需的页数会增加,需更多内存存放页表(下面叙述),同样会浪费内存利用率.
所以,一般页的大小在512-->
4K之间,且是2的幂.
#6分页相同的地址结构如图,显然下图页大小=2**10=1K,总页数=2**10=1K.
191090
页号Pi页内偏移
2.页表
#1一作业被离散地置于内存的多个页框中,为使作业能方便地找到各页面对应的页框位置,下台为每个作业建立一张页面映射表,称页表PT.
页表内存
用户程序页号页框号0
0051
1112
2233
......4
5
页表项......
(图2-3)
每个页在页表中占一项,页表的作用是实现页号到页框号的地址映射,另外,页表若是数组,页号字段可省略.
#2每个作业有一个页表,对中小作业,其页表一般可放入内存,而对大型作业,如VAX机允许作业大小为2GB,若每页大小为512BYTE,则页表项数=2GB/512=8M,若全部装入内存显然不可行,为此其页表也需采用内外存交换技术,且页表需用多级目录结构组织起来.
一般为节省页表在内存的占用空间,所有作业的页表共用一块内存区,每个作业表内通过指针+长度确定其页表在该块内存区的位置。
3.地址变换
#1即通过页表把作业的逻辑地址变换为内存的物理地址.由于页内地址和页框内地址一一对应,所以地址变换实质上是将页号变为页框号而已.
页号偏移量页框号偏移量
页表
页号超界则中断
...
查找得页框号
(图2-4)
#2用程序描述
#defineNUM...
intPageFrameNum;
charstatus;
}PageTable[NUM];
BooleanAddrChange(intPnum,intPoff,int*PFunm,int*PFoff){
if(Pnum>
=NUM)returnFALSE;
//页号超界
if(PageTable[Pnum].status==NoAccess)returnFALSE;
//无权存取
*PFnum=PageTable[Pnum].PageFrameNum;
*PFoff=Poff;
returnTRUE;
}
4.快表
#1地址变换要先访问内存中页表,再访问内存相应页框,显然其内存访问次数加倍,降低了系统性能.
#2通过把页表置于CACHE中,可提高访问页表的速度,因此CACHE中的页表称为快表.
#3由于CACHE容量有限,只能置页表的一部分于CACHE中,因此产生了快表访问的命中率和快表更新问题.
#4快表的地址变换机制
若页号超界则返回
由页号从快表中查对应页框号,若找到转D>
从内存中找对应的页表项,把其置于快表中,若快表已满,则置换快表中最久未使用的页表项.
D>
若页描述子不能存取,则返回,否则获取页框号,与原偏移量组合形成物理地址.
#5由于对程序/数据的访问具有局部性,因此快表的命中率可达90%以上,即由于分页式地址变换引起的速度损失可降低到1%以下,这是可容忍的.关于页面大小和命中率的关系分析见。
#6开销
每作业的内存分配以页为单位,因此最后页平均有半页浪费,称"
页表本身存储所需的内存开销,称"
由于一次分配作业所须全部内存,导致有些作业不能被分配而长时间等待,同时内存有平均作业长度的1/2被闲置,所以引入请求式分页。
请求式分页系统
1.概念
也称单段式虚拟存储器,提出的缘由有二:
①多作业共享小内存;
②特大作业使用小内存.
指导思想:
只调入当前运行所需的页面到内存,若需要其他页面时,通过自动页面交换技术,把内存的一部分页面与外存所需的页面进行交换而解决.即内存与外存通过页表构成一个整体----虚拟地址空间.
2.数据结构
#1页表:
页号页框号状态位访问字段修改位外存地址
在原页表结构上增加四个字段:
状态位:
标志该页是否在内存.
访问字段:
记录本页已被访问的参数,用于置换算法.
修改位:
本页内容是否更改,因为内存中的每页在外存中都有副本,若未被更改过则在置换时不必写外存.
外存地址:
内外存置换时用
#2存储分配表MBT:
整个系统一张,记录内存页框的使用情况。
#3快表/页面映象表PMT:
整个系统一张,当前运行作业的快表使用情况。
#4作业表JT:
整个系统一张,存放当前运行作业,通过PCB等。
#5文件映象表FMT:
每个作业一张,存放在外存整个页表。
应用程序请求访问一页缺页中断处理
页号>
页表长度?
超界中断保留CPU现场
NY
页号在快表否?
从外存中找到缺页
YN
内存满否?
N
页号在内存页表否?
Y
YN按算法置换
修正快表缺页中断处理
N被换出页改过否?
修改访问位和修改字段Y
写换出页内容到副本
形成物理地址
从外存中读缺页到内存相应位置
返回
修改页表/快表
(图2-5)
恢复CPU现场
退出
4.硬件支持
除内,外存外,还需以下两个:
#1缺页中断机构:
当发现内存缺页时,产生缺页中断信号,OS检测该信号并进行缺页中断处理(调用例程).页面
本中断在指令执行时B6
产生,并马上处理,这有别于一5
般的中断,它们在一指令执行完A4
的间隙产生.3(图2-6)
一指令在执行时,会COPYA2
引发多次缺页中断,如左图:
toB1
一拷贝指令引起6次缺页中断,导致CPU在页面交换时花费大量时间,引起系统性能下降----此状况称系统的"
颤动"
(Trashing,抖动Jitter),应预防以避免.
#2地址变换机构:
其在一般的地址变换机构基础上,增加了一些特殊功能,如产生缺页中断,置换算法机制,修改标志等.
5.提取页面问题----调页策略
解决页面在何时装入内存.
#1预调页策略(Prepaging):
以预测为基础,事先一次调入若干相邻的页,用于进程首次调入.若预测准确,可提高效率,否则降低效率.
#2请求调页策略(DemandFetching):
当作业请求时,才将所需页面调入内存.易实现,但每次调一页,系统开销大.
6.放置页面问题----分配策略
即页面置于内存何处.
#1固定分配策略:
基于作业类型分配其固定页数的内存空间,在运行其不变.简单,但不灵活,内存利用率不高.
#2可变分配策略:
基于作业类型分配一定页数的内存空间.若运行时缺页中断频繁则追加页数,反之则减少页数.
7.置换页面问题----置换策略
即当内存满而又要从外存中调入页时,按何种原则置换内存中的某页面.
#1最优化算法(OPT)
把内存中永远不会被使用或很长时间不会被用到的页置换出去,是理想算法,无实用价值,仅作参照系(坐标)使用.
#2先进先出算法(FIFO)
淘汰进入内存最早的页面,简单但效率低劣.
#3最近最久未使用算法(LRU:
LeastRecentlyUsedReplacement)
在页表项中的访问字段记录上次该页面访问以来所经历的时间T,当需置换时,选择该记录T最大的页面.
#4最近未用算法(NRU:
NotRecentlyUsed)
是LRU算法的退化,访问页面后置访问字段值为1,同时系统周期性地(每隔T时间)把访问字段清零,因此在T时间内,置零的都是未被访问过的,选择一个淘汰之.
#5最少使用置换算法(LFU:
LeastForUsed)
每访问一次,访问字段加1,置换时,淘汰其值最小的页面.
8.另外:
在汤子嬴教材中P143-147还讲述了以下三个问题:
#1修改页面的处理:
定期把内存中页面内容改变了的页面写到副本中,这样在缺页中断时可提高处理速度.
#2页面共享问题:
把多作业的共享页面单独组成一个页表.
#3外存的管理:
有直接映射和按需分配两种,以类似一种文件的形式来管理.
请求式分页系统的优缺点
解决了存储