存储器管理.docx
《存储器管理.docx》由会员分享,可在线阅读,更多相关《存储器管理.docx(26页珍藏版)》请在冰豆网上搜索。
存储器管理
第四章存储器管理
第0节存储管理概述
一、存储器的层次结构
1、在现代计算机系统中,存储器是信息处理的来源与归宿,占据重要位置。
但是,在现有技术条件下,任何一种存储装置,都无法从速度、容量、是否需要电源维持等等多方面,同时满足用户的需求。
实际上它们组成了一个速度由快到慢,容量由小到大的存储装置层次。
图4-1计算机系统存储器层次示意图
2、各种存储器
•寄存器、高速缓存Cache:
容量很小、非常快速、昂贵、需要电源维持、CPU可直接访问;
•内存RAM:
容量在若干KB、MB、GB,中等速度、中等价格、需要电源维持、CPU可直接访问;
•磁盘高速缓存:
一般设于主存中;
•多种类型的磁盘:
容量在数MB或数GB,低速、价廉、不需要电源维持、CPU不可直接访问;
由操作系统协调这些存储器的使用。
二、存储管理(主存管理)的目的
1、尽可能地方便用户;提高主存储器的使用效率,使主存储器在速度、规模和成本之间获得较好的权衡。
(注意CPU和主存储器,这两类资源管理的区别)
2、存储管理的主要功能:
•地址重定位
•主存空间的分配与回收
•主存空间的保护和共享
•主存空间的扩充
三、逻辑地址与物理地址
1、逻辑地址(相对地址,虚地址):
用户源程序经过编译/汇编、链接后,程序内每条指令、每个数据等信息,都会生成自己的地址。
●一个用户程序的所有逻辑地址组成这个程序的逻辑地址空间(也称地址空间)。
这个空间是以0为基址、线性或多维编址的。
2、物理地址(绝对地址,实地址):
是一个实际内存(字节)单元的编址。
●计算机内所有内存单元的物理地址组成系统的物理地址空间,它是从0开始的、是一维的;
●将用户程序被装进内存,一个程序所占有的所有内存单元的物理地址组成该程序的物理地址空间(也称存储空间)。
四、地址映射(变换、重定位)
当程序被装进内存时,通常每个信息的逻辑地址和它的物理地址是不一致的,需要把(程序中的)逻辑地址转换为对应的物理地址----地址映射;
例如指令LOADL,2500/*将2500号单元内的数据送入寄存器L*/----P123
图4-3作业装进内存时的情况
地址映射分静态和动态两种方式。
1、静态地址重定位
是程序装入时集中一次进行的地址变换计算。
物理地址=重定位的首地址+逻辑地址
•优点:
简单,不需要硬件支持;
•缺点:
一个作业必须占据连续的存储空间;装入内存的作业一般不再移动;不能实现虚拟存储。
2、动态地址重定位:
在程序执行的过程中,每当CPU访问一个内存地址之前对要访问的地址进行地址变换计算。
图4-12动态地址重定位示意图
•优点:
一个作业可以使用非连续存储空间;能实现虚拟存储;有利于程序段的共享。
•缺点:
需要硬件支持。
五、存储分配与回收
在程序运行开始时、运行过程中,OS根据一定的存储管理方法,在内存中为程序及其数据找到合适的位置,将它们装入内存;
程序运行结束后,OS收回程序释放的内存资源,并进行适当的整理,以便再分配给其他的程序使用。
六、存储保护
为多道并发程序共享内存提供保障,使在内存中的各道程序“各行其道”,只能访问属于自己的区域(自己的物理地址空间),避免各道程序间相互干扰。
特别是当一道程序发生错误时,不致于影响其他程序的运行。
通常由硬件完成保护功能,由软件辅助实现。
存储保护可以实现:
•保护系统程序区不被用户侵犯(有意或无意的);
•不允许用户程序读写不属于自己地址空间的数据(系统区地址空间、其他用户程序的地址空间),出现地址越界;
地址越界存储保护的过程:
每个进程都有自己独立的进程空间。
如果一个进程在运行时所产生的要访问的地址落在其地址空间之外,称为发生了地址越界。
每当程序要访问某个内存单元时,由硬件检查是否允许,如果允许则执行,否则产生地址越界中断,由操作系统进行相应处理。
•程序只能在自己的访问权限范围内读/写内存。
七、存储共享
•内存共享:
多道环境中,两个或多个并发进程共用内存中相同区域。
•目的:
节省内存空间,提高内存利用率,实现进程通信(数据共享)。
•共享内容:
代码共享(要求代码为纯代码);
数据共享。
八、存储“扩充”
为了给大作业提供方便,由OS把内存和外存统一管理起来,实现自动覆盖。
当一个大作业在执行时,有一部分逻辑地址空间的内容在内存,另一部分在外存。
当要访问的信息不在内存时,由OS(而不是程序员安排的I/O指令)自动把它们从外存调入内存。
从效果上看,这样的OS好象为这个用户作业提供了一个容量比实际内存大的存储器,从而实现了存储“扩充”。
扩充后的存储器称为虚拟存储器。
九、存储管理方法
1、连续分配方式
(1)单一连续存储区管理(单道环境下)
(2)分区式存储管理
2、离散分配方式
(1)分页式存储管理
(2)分段式存储管理
(3)段页式存储管理
3、实现虚拟存储的分配方式
主要是一些请求式的分配方式,如请求分页式存储管理、请求分段式存储管理等。
对于以上每一种存储管理方法我们应该掌握:
•基本原理(思想方法)
•存储管理使用的数据结构
•逻辑地址的格式
•地址变换的方式
•存储的分配和回收过程
•特点(优、缺点)
第1节程序的装入(和链接)
一、程序的装入
就是OS的装入程序(Loader)将用户程序的装入模块装入内存。
1、绝对装入方式
编译时产生绝对地址的目标代码。
程序被装入内存后,逻辑地址与实际装入的内存地址完全相同,故执行过程中,不需对指令和数据进行地址变换。
程序中所使用的绝对地址,可在编译或汇编时给出,也可由程序员直接赋予。
但在由程序员直接给出绝对地址时,不仅要求程序员熟悉内存的使用情况,而且一旦程序或数据被修改后,可能要改变程序中的所有地址。
因此,通常是宁可在程序中采用符号地址,然后在编译或汇编时,再将这些符号地址转换为绝对地址。
2、可重定位装入方式
编译时产生相对地址的目标代码。
程序被装入内存时,进行地址变换,然后在访问时直接取指令和数据。
3、动态运行时装入方式
编译时产生相对地址的目标代码。
程序被装入内存后,并不立即把装入模块中的相对地址转换为绝对地址,而是把这种地址转换推迟到程序真正要执行时才进行。
当要对一条指令或一个数据进行访问时,才对它的地址进行转换。
因此,装入内存后的所有地址都仍是相对地址。
第2节连续分配存储管理方式
一、单一连续分配
1、基本原理
把内存分为系统区和用户区两部分,系统区提供给OS使用(通常是内存的低址部分);用户区(指除系统区以外的全部内存空间)提供给用户使用。
用户区是一个连续的存储区,每次装入一道用户作业,整个系统的用户空间被一道用户作业独占。
2、存储分配和回收过程
如下图所示的主存分配与回收法。
并且由装入程序进行静态地址重定位,检查其绝对地址是否超越,即可达到保护系统的目的。
工作流程:
3、特点:
•存储管理简单,只适用于单道环境
•内存利用率很低
•程序的运行受主存容量限制
•基本不需要管理的数据结构
二、固定分区分配
固定分区式存储管理是满足多道程序的最简单的存储管理方案。
它的基本思想是:
将内存的用户区划分成若干个固定的空间,称为分区。
当程序到达时,由系统给它分配一个适当大小的分区,将程序和数据连续存入,使进程得以并发执行。
每个分区只能存储一个程序,而且程序也只能在它所驻留的分区中运行;作业的逻辑地址空间是线性的,物理地址空间是连续的;主要采用静态地址重定位方式进行地址变换。
1、基本原理
系统生成时,把可分配的主存储器空间分割成若干个区域,每个区域称为一个分区(每个分区的内部是连续的)。
每个分区的大小可以相同也可以不同,但分区大小、地址固定不变,每个分区能装一个且只能装一个作业。
2、管理使用的数据结构
分区说明表:
记录系统中的现有内存分区及其使用状态。
3、存储分配与回收过程
当有一个用户作业请求装入时,由OS检索分区说明表,从中找一个大小能满足要求的、空闲的分区,将用户作业装入,并在分区说明表中将该分区的状态置为“已分配”;若没有找到大小足够的分区,则拒绝为该程序分配内存。
当一个用户作业完成后,由OS将其占有的分区收回,将该分区的状态改为“未分配”。
4、特点
•可以支持多道程序运行
•程序的运行受主存容量和分区大小限制
•内存利用率仍很低
三、动态分区分配
1、基本思想
系统在启动时,除了OS常驻内存部分占用的内存空间外,系统中只有一个空闲分区;当有作业要装入内存时,检索空闲分区表,找一个能满足作业要求的空闲分区,从中划出一个大小正好满足要装入作业要求的存储区,分配给这一作业,剩下的部分被作为一个新的空闲分区记录在空闲分区表中。
2、存储管理的数据结构(二选一)
(1)空闲区表--记录目前系统中每个空闲区的起始地址和长度;
(2)空闲分区链--将目前系统中的空闲分区按一定的顺序链接起来。
在每个分区的头、尾设置指向前后分区的指针,并记录本分区的一些分配控制信息。
系统设立一个链首指针,指向第一个空闲块。
图4-7空闲分区链
3、存储分配与回收过程
(1)分配--每当有一个作业申请内存空间时:
图4-8内存分配流程
(2)回收----会出现四种情况
图4-9内存回收时的情况
•回收区与它前面的一个空闲区相邻(a)
•回收区与它后面的一个空闲区相邻(b)
•回收区与它前、后的两个空闲区相邻(c)
•回收区前后都没有相邻的空闲区
当某一块归还后,要根据不同的情况,前后空间合并,再分别处理存储管理的数据结构。
4、存储分配的算法----当满足条件的空闲分区多于一个时,选哪一个?
取决于空闲分区表或空闲分区链中分区排列顺序的组织方法
(1)首次适应算法:
按空闲区首地址从低到高来组织空闲分区表或空闲分区链;每次分区时,总是从表头或链首开始扫描,找到第一个足够大的空白区分配。
(2)循环首次适应算法(下次适应算法):
类似首次适应法的数据组织。
每次分区时,总是从上次查找结束的地方开始扫描,找到一个足够大的空白区分配,并循环查找。
(3)最佳适应算法:
按空闲区容量大小从小到大来组织组织空闲分区表或空闲分区链。
每次分区时,总是从表头或链首开始扫描。
所以,接到内存申请时,会在空闲区中找到一个满足要求的最小空闲区进行分配。
(4)最坏适应算法:
与最佳适应法相反,它在作业选择存储块时,总是寻找一个满足要求的最大的空闲分区。
讨论以上算法的优缺点….
6、动态分区方式中的“碎片”问题
经过一段时间的分配回收后,内存中会出现很多很小的空闲块。
它们每一块都较小,不足以满足一般作业的分配要求;但其容量总和却有着相当的规模。
这些空闲块被称为碎片。
碎片的存在造成了存储资源的浪费。
解决办法:
碎片整理--紧凑,通过在内存移动程序,将所有小的空闲区域合并为大的空闲区域。
问题:
系统开销大(?
)。
图4-11碎片整理
四、动态可重定位分区分配
1、动态重定位引入的原因
在动态分区分配中,“碎片”整理,是定时进行或在存储回收时进行的,所有用户程序的存储分区都要进行改动,并重新进行静态地址重定位。
这样的“碎片”整理工作将花费较多的系统开销。
2、动态重定位分区分配处理流程
可重定位分区分配,与动态分区方法基本相同,但它的碎片整理是在存储分配时进行的,以满足新作业需求为目的,并采用动态地址重定位。
图4-13动态可重定位分区分配示意图
五、对换(交换)技术
“对换”引入的原因:
----P135
所谓“对换”,是指系统允许在一个作业已经进入内存执行的过程中,仍能把它调出内存、再调入内存。
把内存中暂时不能运行的进程或者暂时不用的程序和数据,调出到外存上,以便腾出足够的内存空间,再把已具备运行条件的进程或进程所需要的程序和数据,调入内存。
对换是提高内存利用率的有效措施。
可以将整个进程换入、换出,也可以将进程的一部分(页、段)换入、换出。
前者主要用于缓解目前系统中内存的不足,后者主要用于实现虚拟存储。
----P136
对换空间的管理:
在具有对换功能的OS中,通常把外存分为文件区和对换区。
前者用于存放文件,后者用于存放从内存换出的进程。
P136-137
进程(整体)的换出:
系统首先选择处于阻塞状态且优先级最低的进程作为换出进程,然后启动磁盘,将该进程的程序和数据传送到磁盘的对换区上。
若传送过程未出现错误,便可回收该进程所占用的内存空间,并对该进程的PCB做相应的修改。
当目前没有阻塞进程时,也可将优先级低的就绪进程换出。
进程(整体)的换入:
系统定时查看所有进程的状态,从中找出“就绪”状态但已换出的进程,将其中换出时间(换出到磁盘上)最久的进程作为换入进程,将之换入,直至已无可换入的进程或无可换出的进程为止。
以上谈到的是整体交换,部分交换在虚拟存储中介绍。
六、动态分区式存储管理特点的讨论
1、作业连续存放(作业的逻辑地址空间和物理地址空间都是一维的)
2、有限的虚拟存储
分区式管理不能实现那种用户进程所需空间只受内外存容量之和限制的虚拟存储,只能使用覆盖和交换等存储扩充技术,实现进程挂起,这是一种有限的虚拟存储----并发进程的总容量可以大于内存容量,但每一个进程的容量小于内存。
3、存储保护:
使用界限寄存器。
一般由硬件提供一对寄存器:
基址寄存器:
存放起始地址,限长寄存器:
存放长度(或上界寄存器/下界寄存器)
4、主要优缺点:
•实现了多进程对内存的共享,支持多道程序设计;
•要求较少的硬件支持,管理方法简单,容易实现。
•内存利用率仍不高(碎片问题);
•用户作业的大小受分区大小的限制;
•不能实现信息的共享。
第3节基本分页存储管理方式
一、基本原理
将系统的物理地址空间划分成大小相同的片,称为块;
将作业的逻辑地址空间划分成和块大小一样的片,称为页(最后不足一页的也算一页);
给作业进行存储分配时,将作业的一页存入存储器的一块中。
逻辑上相邻的页,物理上可以不相邻。
块的大小与页的大小一致,与系统内存的大小以及内、外存间数据的传输速度相关,通常是2nB。
二、逻辑地址的格式
作业的逻辑地址空间是从0开始、一维的,每个逻辑地址由页号和页内地址组成,见下图左;
对某特定机器,其地址结构是一定的,页的大小固定为L(应该是2的幂,通常为1KB~8KB)。
若给定一个逻辑地址A,则页号P和页内地址d可按下式解析而求得,见下图右。
三、存储管理的数据结构
1、页表:
每个进程一张,在初次为进程分配内存时建立进程的页表。
一个进程分为多少页,它的页表就有多少行(表目)。
每一行中记录着进程的一页对应存放的块。
另外,页表的每一个表目还包括一个存取控制字段。
页表用于进行地址变换。
2、存储分块表:
整个系统一张,每一项对应一个内存存储块,记录该存储块的使用状态:
已分配或空闲。
通常用位示图来表示存储分块表。
四、地址变换
进程的页表一般是常驻内存、连续存放的,页表的首地址和长度存在进程的PCB中。
系统为执行态的用户进程提供了一个页表寄存器,用来存放这个进程的页表首地址和长度。
采用动态地址重定位。
1、基本的地址变换过程:
例:
0100:
LOAD2452,‘A’
(1)指令的逻辑地址0100,它存在0页,第100号单元中;
查页表:
0页→10块→算出指令的物理地址:
10100→到内存单元10100中取指令LOAD2452,‘A’;
(2)目的操作数的逻辑地址2452,它排在2页第452号单元中;
查页表:
2页→8块→算出操作数的物理地址:
08452→将‘A’送入08452号内存单元。
2、引入快表:
由于页表也存放在主存中,这样,每读写一个内存单元,首先必须读内存一次,访问页表,之后根据形成的实际地址再访问内存,这样使访问主存的次数加倍,因而使总的处理速度明显下降。
为了解决这个问题人们采用一组寄存器,存放最近访问过的页的页表表项----引入“快表”
每次地址变换时,首先查找快表,若找到所需页的表项,则快速形成物理地址。
否则,再去页表中查找后形成物理地址,同时把该页的表项写入快表。
如果设计得当,快表的命中率可以很高。
五、存储的分配和回收
1、存储分配
•计算一个作业所需要的总块数N
•查位示图,看看是否还有N+1个空闲块,如果不够,就拒绝分配
•如果有足够的空闲块,则首先申请一块,为整个作业建立页表,将页表的首地址和长度N存入进程的PCB中
•分配N个空闲块给该作业,依次装入作业的N个页,将页号和对应的块号填入页表
•修改位示图
2、存储回收
进程执行结束,系统对照页表,依次收回分给它的N个块,修改位示图;撤消它的页表,收回页表所占块,修改位示图。
六、两级和多级页表
现代的大多数计算机系统,都支持非常大的逻辑地址空间(232~264)。
页表就变得非常大,超过了1页可以容纳的范围。
可采用两个方法来解决这一问题:
①采用离散分配方式来解决难以找到一块连续的大内存空间的问题;②只将当前需要的部分页表项调入内存,其余的页表项仍驻留在磁盘上,需要时再调入。
1、两级页表
逻辑地址的格式为:
2、多级页表
字长32位的计算机,进程页表多大?
用户逻辑地址空间最大232=4GB
设:
页面大小为212=4KB
则:
一个进程最多220页
设:
页表的每个表项占4B
则:
进程页表最长为4B×220=210×212B=1024页
外页表最长1024×4B=4KB,正好一页。
当计算机的字长增加到64位时,如果仍以4KB为一页,一个作业可以有252页。
页表与外页表的长度将是……。
此时,必须采用多级页表,将外层页表再进行分页,再将各分页离散地装入到不相邻接的物理块中,再利用第2级的外层页表来映射它们之间的关系……。
此即多级页表。
七、反智页表简述----P144
八、基本(静态)页式存储管理的特点
1、作业的逻辑地址空间是一维的;
2、是一种离散式分配的存储管理方法,用户作业不要求连续的存储空间,碎片的规模小于1页,而且数量很少,存储利用率高;
3、要求进程在执行前全部装入内存,所以进程的大小仍受内存空间的限制;
4、“页”是存储的单位,在逻辑上没有意义,很难实现有效的信息共享、存储保护、动态增长、动态链接等。
第4节基本分段存储管理方式
一、分段式存储管理的引入
在分页式存储管理中:
•进程的逻辑地址空间是连续的。
一个进程(程序与数据)是一个整体;
•“页”是一个存储的单位,在逻辑上没有意义,不便进行程序段或数据段的共享;
•进程所需的存储块是一次性、静态分配的,程序和数据都不能动态增长。
引入分段存储管理方式,主要是为了满足用户和程序员的下述一系列需要:
----P145-146
(1)方便编程
(2)信息共享
(3)信息保护(4)动态增长(5)动态链接
二、基本原理
一个用户作业的程序和数据按其逻辑结构可以分为若干段,每一段在逻辑上都是完整的,每段内有从0开始的、连续的逻辑地址空间。
在存储分配时,系统为每一段分配一个连续的存储区,而不同段之间的存放的空间可以是不连续的。
三、逻辑地址格式
分段式存储管理中,用户作业的逻辑地址空间是二维的(可能不连续),一个单元的逻辑地址格式为:
每一个段号和一个逻辑段的名称对应。
四、存储管理的数据结构
段表:
每个进程设置一个,属于进程的现场信息。
段表的格式:
段表中的每一行对应一个逻辑段。
作业有几逻辑段,段表的长度就有几行。
段表中最重要的信息是它的前三项,依靠它进行地址重定位。
五、地址变换
进程的段表一般是常驻内存、连续存放的,段表的首地址和长度存在进程的PCB中。
系统为执行态的用户进程提供了段表寄存器,用来存放这个进程的段表首地址和长度。
六、存储分配与回收
在段式存储管理中,内存的空闲空间,采用类似动态分区式存储管理的方式组织、分配和回收。
只是在这里,存放在分区中的对象是进程的一个逻辑段,而不是整个进程。
1、存储分配
首先,程序开始的若干逻辑段,按照类似动态分区分配的方法被逐一放入内存。
伴随着存储访问(地址变换),存储分配逐步完成。
2、存储回收
当作业执行完毕时,系统将段表中各行记录的分区,采用类似动态分区分配的回收方法进行逐一回收,然后撤消段表,回收段表占用的分区。
七、分页和分段的主要区别
1、页是信息的物理(存储)单位,分页是为实现离散分配方式,以消减内存的零头,提高内存的利用率。
或者说,分页仅仅是由于系统管理的需要而不是用户的需要。
段则是信息的逻辑单位,它含有一组其意义相对完整的信息。
分段的目的是为了能更好地满足用户的需要。
2、页的大小固定且由系统决定,由系统把逻辑地址划分为页号和页内地址两部分,是由机器硬件实现的,因而在系统中只能有一种大小的页面;而段的长度却不固定,决定于用户所编写的程序的逻辑,通常由编译程序在对源程序进行编译时,根据信息的性质来划分。
3、分页的作业地址空间是一维的,即单一的线性的逻辑地址空间,程序员只需利用一个记忆符,即可表示一个地址;而分段的作业地址空间则是二维的,程序员在标识一个地址时,既需给出段名,又需给出段内地址。
八、信息共享的实现
当多个进程都要执行某一程序段或访问某一数据段时,可以在内存中只保留该段的一个副本,在不同进程的段表中分别记录该段的起始地址和长度,就可以实现共享。
九、分段式存储管理的特点
1、作业的逻辑地址空间是二维的;
2、管理和使用统一化;
3、可以方便地实现完整逻辑段的共享、地址空间的动态增长和动态链接;
4、需要较多的硬件支持;
5、碎片问题。
十、段页式存储管理
1、基本原理:
一个进程中逻辑上相对独立的程序段或数据段被划分成一段,每个段有自己的段号S。
整个作业的逻辑地址空间是二维的。
只需将程序起始的若干段装入内存,程序就可以开始运行。
这反映和继承了分段式管理的特征。
每个段S,段内地址是连续(一维)的,将每段内的逻辑地址空间划分成大小相等的页,段尾不足一页的占一页;
将系统内存的物理地址空间划分为与页大小相同的块。
在存储分配时将进程逻辑段中的一页放入内存的一块中。
在内存分配时不需要给一段分配连续的存储空间。
这反映和继承了分页式存储管理的特征。
图4-23作业地址空间和地址结构
图4-24存储管理的数据结构
空闲空间利用位示图管理
图4-25段页式系统中的地址变换机构
存储保护和存储共享的实现……
2、“快表”的使用:
由于在段页式存储管理中,一次读取内存中的指令或数据要三次访问内存,这大大降低了程序的执行速度,于是引进快速联想存储器(寄存器)----快表。
将一个表存放在寄存器或高速缓存中,其中记录常用页的段号、页号、块号,它的功能类似于分页式存储管理中的快表。
3、存储分配和回收:
结合分段和分页式的分配、回收过程
4、段页式存储管理的特点:
具有段式和页式存储管理二者的优点,但是管理软件、复杂性和系统开销也随之增大,管理需要的硬件支持和占用的内存也增加。
如果不引进快速联想寄存器,则对内存的访问速度会大大下降。
本章作业:
P1522、8、13、19、23