内存管理命题重点
【命题重点】
1.程序装入的过程与原理,编译与链接,逻辑地址与物理地址。
2.连续分配方式的原理与特点,动态分区分配算法的原理。
3.分页存储管理的页表机制,分段存储管理的段表机制,分页与分段的比较
4.虚拟存储器的原理、特征,缺页中断的处理过程和特点,虚拟地址和物理地址的变换,引入快表后的页氏虚拟存储器的地址变换过程,各种页面置换算法的原理,页面分配策略,工作集的定义,抖动产生的原因和解决方法。
内存管理的概念
【考点笔记1】程序运行的基本原理
将用户源程序变为可在内存中执行的程序,通常需要以下几个步骤:
- 编译,由编译程序将用户源代码编译成若干个目标模块,每个模块具有各自的逻辑地址空间。
- 链接,由链接程序将上述目标模块,以及所需库函数链接,形成具有完整的逻辑地址空间的装入模块。
- 装入,由装入程序将装入模块装入内存。
连续分配管理方式
【考点笔记2】连续分配方式
先了解两个概念:
内部碎片: 是指已分配给作业,但不能被利用的存储空间。
eg. 某个作业所占用的内存区域,如果没有装满,就是内部碎片
外部碎片: 系统中还没有分配给作业,但由于碎片太小而无法分配给申请内存空间的新进程的存储块。
eg.作业与作业之间,如果有内存区域没有分配给某个作业,但又不能分配给任何作业,就是外部碎片
分配方式 | 单一连续分配 | 固定分区分配 | 动态分区分配 |
---|---|---|---|
说明 | 分为系统区和用户区。系统区仅提供给操作系统使用,通常在低地址部分。用户区是为用户提供的除了系统外的内存空间 | 将内存用户空间划分为若干个固定大小的区域,每个分区只装入一道作业。当有空闲分区时,便可以再从外存的后备作业队列中选择适当大小的作业装入该分区,如此循环 | 是一种动态划分内存的分区方法。不预先将内存划分,而是在进程装入内存时,根据进程的大小动态地建立分区,并使分区的大小正好适合进程的需要。因此系统中分区的大小和数目是可变的 |
碎片 | 内部碎片 | 内部碎片 | 外部碎片 |
作业道数 | 1 | <=N(用户空间划分为N块) | 不确定 |
硬件 | 界地址寄存器、越界检查机构 | 上下界寄存器、越界检查机构、基地址寄存器、长度寄存器、动态地址转换机构 | 上下界寄存器、越界检查机构、基地址寄存器、长度寄存器、动态地址转换机构 |
解决空间不足 | 覆盖 | 覆盖/交换 | 交换 |
特点 | 采用静态分配;只适用于单用户、单任务的操作系统;内存只装入一道作业运行,从而导致各类资源的利用率都很低;产生内部碎片;作业一旦装入内存,要等到其运行结束才能释放内存 | 采用静态重定位方式;适用于一台计算机控制多个相同对象的场合;产生内部碎片 | 采用动态重定位技术,实现了多道程序共用主存;管理方案相对简单,不需要更多开销;实现存储保护的手段比较简单;主存利用不充分,产生外部碎片;无法实现多进程共享存储器信息 |
【考点笔记3】动态分区分配算法
算法 |
|
|
---|---|---|
首次适应算法 | 空闲分区以地址递增的顺序链接。分配内存时,从链首开始顺序查找,直至找到大小能满足要求的第一个空闲分区。 | 实现方法简单;查找速度快,平均性能最好;碎片多出现于低地址空间。 |
循环首次适应算法 | 空闲分区以地址递增的次序链接。分配内存时,从上次查找结束的位置开始继续查找,直到找到第一个满足要求的空闲分区 | 平均性能比首次适应算法差;碎片多出现于高地址空间 |
最佳适应算法 | 空闲分区以容量递增的次序链接。分配内存时,从链首开始顺序查找,直到找到第一个满足要求的空闲分区 | 需要对分区排序,开销大;形成许多难以利用的小碎片 |
最差适应算法 | 空闲分区以容量递减的次序链接。分配内存时,从链首开始顺序查找,直到找到第一个能满足要求的空闲分区,也就是挑选出最大的分区 | 需要对分区进行排序,开销大;使系统缺少大的连续空闲地址空间。 |
非连续分配管理方式
【考点笔记4】分页存储管理方式
把主存空间划分为大小相等且固定的块,块相对较小,作为主存的基本单位。每个进程也以块为单位进行划分,进程在执行时,以块为单位逐个申请主存中的块空间。进程中的块称为页,内存中的块称为页框(页帧)。外存也以同样单位进行划分,直接成为块。
分页存储管理的逻辑地址结构包含两部分:页号P,页内偏移量W。如图3-3所示。
系统为每个进程都建立一张页表,记录页面在内存中的物理块号。如图3-4所示。(页表项连续存放,因此页号可以是隐含的,不占用内存空间)
硬件支持:页表寄存器(PTR),存放页表在内存的始址和页表长度 (页表项的个数/页的个数)。
逻辑地址与物理地址的转变过程:
1)查页表
①先将页号P与页表长度M比较:若越界,即P>=M,则表示地址越界并中段。
②若未越界,则将页表始址与页号和页表项长度的乘积相加,变得到该表项在页表中的位置,从中得到该页的物理块号,将之装入物理地址寄存器中。
2)根据页表项算出物理地址
将有效地址中的页内偏移量送入物理寄存器的块内地址字段中,即可得到要访问的内存物理地址。
【考点笔记5】分段存储管理方式
分段存储管理方式的逻辑地址由两部分组成:段号S与段内偏移量W,如图3-6所示。段号字段决定了作业的最大段数,段内偏移量字段决定了最大段长。
系统为每个进程都建立了一张逻辑空间与主存空间映射的段表,每一个段表项对应进程的一个段,段表项纪录该段在内存中的起始地址和段的长度。段表的内容如图3-7所示。
硬件支持:段表寄存器,用于存放段表始址和段表长度。
逻辑地址与物理地址的转变过程:
1)查段表
系统将逻辑地址中的段号S,与段表长度M进行比较。
①若越界,即S>TL,表示段号太大,访问越界,于是产生越界中断信号。
②若未越界,则根据段表的始址和该段的段号(段表始址+段号×段表项长度),计算出该段对应段表项的位置,从中读出该段在内存中的起始地址。
2)根据段表项算出物理地址
检查段内地址偏移量W是否超过该段的段长C。
①若超过,即W>SL,同样发出越界中断信号。
②若未越界,则将该段的基址b与段内地址偏移量W相加,即可得到要访问的主存物理地址
【考点笔记6】分页式与分段式对比
|
|
---|---|
是从计算机的角度考虑设计的,以提高内存的利用率,提升计算机的性能为目标 | 考虑了用户关于方便编程、信息保护和共享、动态增长及动态链接等多方面的需要 |
在页式系统中,分页通常通过硬件机制实现,逻辑地址的页号和页内偏移量对用户是透明的 | 段号和段内偏移量必须由用户显示提供,在高级程序设计语言中,这个工作由编译程序完成 |
逻辑地址是一维结构 | 逻辑地址是二维结构 |
产生内部碎片 | 产生外部碎片 |
页面大小一致 | 段长大小不等 |
地址空间的一维结构与二维结构的理解
一维结构: 基本分页存储管理方式中,进行逻辑地址与物理地址的转换时,低位页内地址与低位块内地址是完全对应的,照抄即可,仅需进行页号与块号的转换,无论是逻辑地址还是物理地址,均为高位地址与地位地址的结合。
二维结构: 基本分段存储管理方式中,低位段内地址可以看做线性函数f(x)=ax+b中的b,因而进行地址转换时,需要首先找到高位段号对应的该段起始地址ax,然后与b做相加。(这也是分页与分段中地址转换最大的不同之处)
注意: 一个进程中,段表只能有一个,而页表可能有多个。
【考点笔记7】基本段页式存储管理方式
在段页式存储管理系统中,作业的地址空间首先被分成若干个逻辑分段,每段都有自己的段号,然后再将每一段分成若干个大小固定的页。对于主存空间的管理仍然和分页管理一样,将其分成若跟个和页面大小相同的物理块,对主存的分配以物理块为单位。
硬件支持:段表寄存器、页表寄存器
段表:至少包括段号、页表始址(该段的页表在主存中的其实位置)、页表长度
页表:页号、块号
逻辑地址到物理地址的转换:
注:两次越界检查。
段页式结合了段式和页式的有点,而且克服了外部碎片问题,但是内部碎片并没有做到像页式那样好。
分页式存储管理方式平均一个程序有半页碎片
段页式存储管理方式平均一段就有半页碎片
虚拟页式存储管理
【考点笔记8】虚拟存储器的定义和特征
基于局部性原理,在程序装入时,可以将程序的一部分装入内存,而将其余部分留在外存,就可以启动程序执行。在程序的执行过程中,由操作系统将所需要的部分调入内存。另一方面,操作系统将内存中暂时不使用的内容换出到外存上。这样,系统好像为用户提供了一个比实际大得多的存储器,称为虚拟存储器。
局部性原理:
1.时间局部性。一条指令的一次执行和下次执行,一个数据的一次访问和下次访问,都集中在一个较短的时期内。
2.空间局部性。当前指令和邻近的几条指令,当前访问的数据和邻近访问的数据,都集中在一个较小的区域内。
虚拟存储器有以下三种实现方式:请求分页;请求分段;请求段页式。
请求分页=基本分页+请求调页功能+页面置换功能
虚拟存储器有以下三个主要特征:多次性;对换性;虚拟性。
多次性:一个作业可以分成多次调入内存。
对换性:作业在运行过程中可以换入、换出。
虚拟性:从逻辑上扩充内存内容,用户可以使用的空间远大于实际内存空间。
虚拟存储器的容量取决于地址空间的大小,而不是由实际内存容量决定。
【考点笔记9】缺页中断机构
在页式虚拟存储管理系统中,程序是部分装入的,还有部分是处于外存上的,因此,当需要访问那部分位于外存上的代码或数据时,系统就会产生缺页中断。
产生缺页中断的目的是要将位于外存上的代码或数据装入内存,此时应将缺页的进程阻塞(调页完成唤醒),如果内存中有空闲块,则分配一个块,并修改页表中相应页表项,若此时内存中没有空闲块,则需要淘汰某页面。
缺页中断作为中断同样要经历,诸如保护CPU环境、分析中断原因、转入缺页中断处理程序、恢复CPU环境等几个步骤。但与一般的中断相比,它有以下两个明显的区别:
- 在指令执行期间产生和处理中断信号,而非一条指令执行完后。
- 一条指令在执行期间,可能产生多次缺页中断。
【考点笔记10】快表
在地址变换机构中增设了一个具有并行查找能力的高速缓冲存储器——快表,又称联想寄存器(TLB),用以存放当前访问的若干页表项。
在具有快表的分页机制中,地址的变换过程如下:
【考点笔记11】请求分页存储管理
请求分页存储管理只要求当前需要的一部分页面装入内存,便可以启动作业运行。在作业执行过程中,当所要访问的页面不在内存时,再通过请求调页功能将其调入,同时还可以通过页面置换功能将暂时不用的页面换到外存上,以便腾出内存空间。如图3-8所示。
|
|
---|---|
页表机制 | 请求分页系统页表项中增加了四个字段,如下入所示。![]() 增加的四个字段说明如下: - 状态位P:用于指示该页是否已调入内存 -访问字段A:用于记录本也在一段时间内被访问的情况。 -修改位M:标识该页在调入内存后是否被修改过。 -外存地址:用于指出该页在外存上的地址,通常是物理块号 |
缺页中断机构 | 在请求分页系统中,当索要访问的页面状态位P无效时,便产生一个缺页中断,此时硬件陷入内核,操作系统将所缺的页面调入内存,并更新页表,中断后返回产生缺页中断的那条指令继续执行。 |
地址变换机构 | ①现根据逻辑地址高位的页号检索快表 ②若找到要访问的页,便修改页表项中的访问位(写指令还须重置修改位),然后利用页表项中给出的物理块号和页内地址形成物理地址。 ③否则,再到内存中查找页表,找到该页表项后检查状态位P,看该页是否已调入内存, a)若已存在在内存中,则修改页表项中的访问位和快表,并根据页表项中的物理块号和逻辑地址地位的页内地址形成物理地址。 b)若未调入内存,则产生缺页中断,请求从外存把该页调入内存,并修改页表和快表。然后返回原指令重新执行,再次寻址。 |
【考点笔记12】页面置换算法
假定系统为某个进程分配三个物理块,并考虑有以下页面号引用串:
7
,
0
,
1
,
2
,
0
,
3
,
0
,
4
,
2
,
3
,
0
,
3
,
2
,
1
,
2
,
0
,
1
,
7
,
0
,
1
7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 2, 1, 2, 0, 1, 7, 0, 1
7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1
1.最佳置换算法
置换原则:选择的被淘汰页面将是以后永不使用的,或者是在最长时间内不在被访问的页面。
①最佳置换算法可以保证获得最低的缺页率
②最佳置换算法可以用来评价其他算法。
2.先进先出页面置换(FIFO)算法
置换原则:优先淘汰最早进入内存的页面,亦即在内存中驻留时间最久的页面。
①FIFO算法可能会产生当所分配的物理块数增大而页故障数不减反增的Belady异常
3.最近最久未使用(LRU)置换算法
置换原则:选择最近最长时间未访问过的页面予以淘汰。
4.时钟(CLOCK)置换算法
系统为每一帧关联一个附加位,称为使用位。
置换原则:
①将候选帧集合看做一个循环缓冲区
②当需要替换一页时,从当前指针位置开始查找首个使用位为0的帧。查找过程重复以下操作直至找到为止:
- 若帧的使用位为0,则该帧中的页被替换,其使用位被置为1,并将指针指向缓冲区的下一帧。
- 若帧的使用位为1,操作系统就将该位重置为0,并查找缓冲区的下一帧。
eg.系统为某个进程一次分配了页框好为“7,9,2,4”总共4个页框(进程驻留集大小为4),刚开始所有页面都没有调入内存。进程按0->3->2->1->5->3->2->6的顺序访问页面,采用CLOCK算法。
选择一个页面最多需要扫描两轮
要点1:根据驻留集大小、页面调入内存的先后顺序来确定循环队列的顺序。
要点2:扫描指针初始时指向第一个到达的页面(有的题目会单独说明指针的指向)
要点3:分配给进程的页框不够时,需要换出一个页面,再将新的页面调入相应的页框中。页面放入后,访问位设置为1,且扫描指针指向循环队列的下一个页面。
改进的CLOCK置换算法
选择一个页面最多四轮扫描
在使用位的基础上再增加一个修改位。
置换原则:
①从指针的当前位置开始,扫描帧缓冲区,选择遇到的第一个帧(使用位=0,修改位=0)用于替换。
②如果第一步失败,则重新扫描,选择遇到的第一个(使用位=0,修改位=1)帧用于替换。在这个扫描过程中,对每个跳过的帧,把它的使用位设置为0。
③如果第二步失败,指针将回到它的最初位置,并且集合中所有帧的使用位均为0。重复第一步,并且如果有必要,重复第二步。这样将可以找到供替换的帧。
最近未被访问过,也未被修改过(访问位=0,修改位=0)
最近被访问过,未被修改过(访问位=1,修改位=0)
最近未被访问过,但被修改过(访问位=0,修改位=1)
最近被访问过,也被修改过(访问位=1,修改位=1)
访问位同为0的进程间,优先淘汰没有修改过的页面,因为没有修改过的页面可以被直接淘汰掉,而修改过的页面需要写回到外存。
【考点笔记13】页面分配策略
固定分配局部置换。 它为每个进程分配一定数量的物理块,在整个运行期间都不改变。若进程在运行时发生缺页,则只能从该进程在内存的页面中选出一个换出,然后再调入需要的页面。实现这种策略难以确定为每个进程应分配的物理块数量:太少会频繁出现缺页中断,太多会使CPU和其他资源利用率下降。
可变分配全局置换。这是最易于实现的物理块分配和置换策略,为系统中的每个进程分配一定数量的物理块,操作系统自身也保持一个空闲物理块队列。当某个进程发现缺页时,系统从空闲物理块队列中取出物理块分配给该进程,并将欲调入的页装入其中。
可变分配局部置换。它为每个进程分配一定数目的物理块,当某个进程发现缺页时,只允许从该进程在内存的页面中选出一页换出,这样就不会影响其他进程的运行。如果进程运行中频繁地缺页,系统需再为该进程分配若干附加物理块,直至该进程缺页率趋于适当程度为止;反之,若一个进程在运行过程中缺页率特别低,则此时可适当减少分配给该进程的物理块。
【考点笔记14】工作集(驻留集)
在某段时间间隔内,进程要访问的页面集合。经常被使用的页面需要在驻留集中,而长期不被使用的页面需要从驻留集中被丢弃。驻留集模型使用较为简单:操作系统跟踪每个进程的驻留集,并为进程分配大于其驻留集(工作集)的空间。如果还有空闲,那么可启动另一个进程,将其页面调出并且将其物理块分配给其他进程。
正确选择驻留集的大小,对存储器的有效利用和系统吞吐量的提高,都将产生重要的影响。
抖动
【考点笔记13】抖动现象
在进程的页面置换过程中,频繁的页面调度行为成为抖动或颠簸。如果一个进程在换页上用的时间多于执行时间,那么这个进程就在颠簸。
使用虚拟存储技术,操作系统中进程通常只有一部分位于主存中,从而可以在内存中保留更多的进程以提高系统效率。产生抖动后,使得系统吞吐量下降,缺页中断迅速增长,由于处理机差不多花费所有时间在进行内外存页面置换,因此几乎不做任何工作。
引起系统抖动的原因是信息量过大、内存容量不足、置换算法选择不当,所以解决的方法就是降低交换页面的数量、加大内存容量、改变置换选择算法。但是降低交换页面数量和改变置换选择算法对于一个应用系统来讲是不可能的,只能增加内存容量,或者降低进程数量(相对地增加内存)。而增加交换区容量并不能解决物理内存不足的问题。