设计页式存储管理的分配与回收
- 格式:doc
- 大小:375.50 KB
- 文档页数:20
操作系统——页式存储管理分区式存储管理最⼤的缺点是碎⽚问题严重,内存利⽤率低。
究其原因,主要在于连续分配的限制,即它要求每个作⽤在内存中必须占⼀个连续的分区。
如果允许将⼀个进程分散地装⼊到许多不相邻的分区中,便可充分地利⽤内存,⽽⽆需再进⾏“紧凑”。
基于这⼀思想,产⽣了“⾮连续分配⽅式”,或者称为“离散分配⽅式”。
连续分配:为⽤户进程分配的必须是⼀个连续的内存空间。
⾮连续分配:为⽤户进程分配的可以是⼀些分散的内存空间。
分页存储管理的思想:把内存分为⼀个个相等的⼩分区,再按照分区⼤⼩把进程拆分成⼀个个⼩部分。
分页存储管理分为:实分页存储管理和虚分页存储管理⼀、实分页式存储管理实分页式存储最⼤的优点是内存利⽤率⾼,与⽬前流⾏的虚分页存储管理相⽐,具有实现简单,程序运⾏快的优点。
⽬前,飞速发展的硬件制造技术使得物理内存越来越⼤,因此我们认为,实分页式存储管理将是⼀种最有发展前途的存储管理⽅式。
1.1、基本原理假设⼀个⼤型饭店,所有的客房都是标准的双⼈间,部分客房已经住进客⼈,现在⼜有⼀个旅游团要求⼊住。
接待员统计了⼀下,对旅游团领队说:“贵团全体成员都能住下,两⼈⼀个房间,但是不能住在同⼀楼层了,因为每层空着的客房不够,更没有⼏个挨着的。
请原谅!”。
对于这样的安排,⼀般⼈不会感到奇怪。
因为旅游团本来就是由⼀位位个⼈或夫妻等组成的,⽽饭店的客房本来也是两⼈⼀间的,两⼈⼀组正好可住在⼀个客房⾥;另外,饭店⼏乎每天都有⼊住的和退房的客⼈,想在同⼀楼层找⼏间挨着的客房实在不容易。
①将整个系统的内存空间划分成⼀系列⼤⼩相等的块,每⼀块称为⼀个物理块、物理页或实页,页架或页帧(frame),可简称为块(block)。
所有的块按物理地址递增顺序连续编号为0、1、2、……。
这⾥的块相当于饭店的客房,系统对内存分块相当于饭店把⼤楼所有的客房都设计成标准的双⼈间。
②每个作业的地址空间也划分成⼀系列与内存块⼀样⼤⼩的块,每⼀块称为⼀个逻辑页或虚页,也有⼈叫页⾯,可简称为页(page)。
软件设计师必背知识点一、计算机组成与体系结构。
1. 数据的表示。
- 进制转换:- 二进制、八进制、十进制、十六进制之间的相互转换。
例如,十进制转二进制可以采用除2取余法,将十进制数不断除以2,取余数,直到商为0,然后将余数从右到左排列得到二进制数。
- 二进制数的运算,包括算术运算(加、减、乘、除)和逻辑运算(与、或、非、异或)。
- 原码、反码、补码:- 原码:最高位为符号位,0表示正数,1表示负数,其余位表示数值的绝对值。
- 反码:正数的反码与原码相同,负数的反码是在原码的基础上,符号位不变,其余位取反。
- 补码:正数的补码与原码相同,负数的补码是其反码加1。
计算机中通常采用补码来表示和运算数据,因为补码可以简化减法运算,将减法转换为加法。
2. 计算机的基本组成。
- 冯·诺依曼结构:由运算器、控制器、存储器、输入设备和输出设备五大部分组成。
- 运算器:进行算术和逻辑运算的部件,如加法器、乘法器等。
- 控制器:指挥计算机各部件协调工作的部件,它从存储器中取出指令,分析指令并产生相应的控制信号,控制计算机各部件执行指令。
- 存储器:用于存储程序和数据。
分为内存储器(主存)和外存储器(辅存)。
内存储器包括随机存取存储器(RAM)和只读存储器(ROM)。
RAM是可读可写的存储器,断电后数据丢失;ROM是只读存储器,断电后数据不丢失,常用于存储BIOS等基本系统程序。
- 输入设备:如键盘、鼠标等,用于向计算机输入数据和指令。
- 输出设备:如显示器、打印机等,用于将计算机处理的结果输出。
3. 指令系统。
- 指令的格式:一般包括操作码和操作数两部分。
操作码表示指令要执行的操作,操作数表示操作的对象。
- 指令的寻址方式:- 立即寻址:操作数直接包含在指令中。
- 直接寻址:操作数的地址直接包含在指令中。
- 间接寻址:指令中给出的是操作数地址的地址。
- 寄存器寻址:操作数存放在寄存器中,指令中给出寄存器编号。
实验四操作系统存储管理实验报告一、实验目的本次操作系统存储管理实验的主要目的是深入理解操作系统中存储管理的基本原理和方法,通过实际操作和观察,掌握内存分配、回收、地址转换等关键技术,提高对操作系统存储管理机制的认识和应用能力。
二、实验环境操作系统:Windows 10开发工具:Visual Studio 2019三、实验原理1、内存分配方式连续分配:分为单一连续分配和分区式分配(固定分区和动态分区)。
离散分配:分页存储管理、分段存储管理、段页式存储管理。
2、内存回收算法首次适应算法:从内存低地址开始查找,找到第一个满足要求的空闲分区进行分配。
最佳适应算法:选择大小最接近作业需求的空闲分区进行分配。
最坏适应算法:选择最大的空闲分区进行分配。
3、地址转换逻辑地址到物理地址的转换:在分页存储管理中,通过页表实现;在分段存储管理中,通过段表实现。
四、实验内容及步骤1、连续内存分配实验设计一个简单的内存分配程序,模拟固定分区和动态分区两种分配方式。
输入作业的大小和请求分配的分区类型,程序输出分配的结果(成功或失败)以及分配后的内存状态。
2、内存回收实验在上述连续内存分配实验的基础上,添加内存回收功能。
输入要回收的作业号,程序执行回收操作,并输出回收后的内存状态。
3、离散内存分配实验实现分页存储管理的地址转换功能。
输入逻辑地址,程序计算并输出对应的物理地址。
4、存储管理算法比较实验分别使用首次适应算法、最佳适应算法和最坏适应算法进行内存分配和回收操作。
记录不同算法在不同作业序列下的内存利用率和分配时间,比较它们的性能。
五、实验结果与分析1、连续内存分配实验结果固定分区分配方式:在固定分区大小的情况下,对于作业大小小于或等于分区大小的请求能够成功分配,否则分配失败。
内存状态显示清晰,分区的使用和空闲情况一目了然。
动态分区分配方式:能够根据作业的大小动态地分配内存,但容易产生内存碎片。
2、内存回收实验结果成功回收指定作业占用的内存空间,内存状态得到及时更新,空闲分区得到合并,提高了内存的利用率。
操作系统存储管理实验报告一、实验目的操作系统的存储管理是计算机系统中非常重要的组成部分,它直接影响着系统的性能和资源利用率。
本次实验的目的在于深入理解操作系统中存储管理的基本原理和方法,通过实际操作和观察,掌握存储分配、回收、地址转换等关键技术,并对不同存储管理策略的性能进行分析和比较。
二、实验环境本次实验在 Windows 10 操作系统下进行,使用 Visual Studio 2019 作为编程环境,编程语言为 C++。
三、实验内容(一)固定分区存储管理1、原理固定分区存储管理将内存空间划分为若干个固定大小的分区,每个分区只能装入一道作业。
分区的大小可以相等,也可以不等。
2、实现创建一个固定大小的内存空间数组,模拟内存分区。
为每个分区设置状态标志(已分配或空闲),并实现作业的分配和回收算法。
3、实验结果与分析通过输入不同大小的作业请求,观察内存的分配和回收情况。
分析固定分区存储管理的优缺点,如内存利用率低、存在内部碎片等。
(二)可变分区存储管理1、原理可变分区存储管理根据作业的实际需求动态地划分内存空间,分区的大小和数量是可变的。
2、实现使用链表或数组来管理内存空间,记录每个分区的起始地址、大小和状态。
实现首次适应、最佳适应和最坏适应等分配算法,以及分区的合并和回收算法。
3、实验结果与分析比较不同分配算法的性能,如分配时间、内存利用率等。
观察内存碎片的产生和处理情况,分析可变分区存储管理的优缺点。
(三)页式存储管理1、原理页式存储管理将内存空间和作业都划分为固定大小的页,通过页表将逻辑地址转换为物理地址。
2、实现设计页表结构,实现逻辑地址到物理地址的转换算法。
模拟页面的调入和调出过程,处理缺页中断。
3、实验结果与分析测量页式存储管理的页面置换算法(如先进先出、最近最少使用等)的命中率,分析其对系统性能的影响。
探讨页大小的选择对存储管理的影响。
(四)段式存储管理1、原理段式存储管理将作业按照逻辑结构划分为若干个段,每个段有自己的名字和长度。
昆明理工大学信息工程与自动化学院学生实验报告(2012 —2013 学年第二学期)一、实验目的存储管理的主要功能之一是合理地分配空间。
请求页式管理是一种常用的虚拟存储管理技术。
通过本次实验, 要求学生通过编写和调试地址转换过程的模拟程序以加强对地址转换过程的了解, 通过请求页式存储管理中页面置换算法模拟设计, 了解虚拟存储技术的特点, 掌握请求页式存储管理的页面置换算法。
二、实验原理及基本技术路线图(方框原理图)用C或C++语言模拟实现请求式分页管理。
要求实现: 页表的数据结构、分页式内存空间的分配及回收(建议采用位图法)、地址重定位、页面置换算法(从FIFO,LRU,NRU中任选一种)。
int subareaSize[num]={8,12,16,32,24,16,64,128,40,64};//分区大小Process *pro=NULL;//保持进程信息int ProcessNum=0;//进程数目int applyProcessNum=0;//每次申请进程数目int maxApplyNum=0;//最大可申请数目int *applyIndex=NULL;//申请进程队列int totalApplyNum=0;//申请总数int *assignPointer=NULL;//已分配内存的进程队列int assignFlag=0;//分配索引, 表示已申请队列已分配的进程数int exeIndex;//执行的进程号Node *subareaNode=new Node[3];//分区回收时, 进程所在分区及其前, 后分区信息LinkList createLinkList(int n );//建立空闲分区链Node firstFit(LinkList &head,Process pro);//首次适应算法Node nestFit(LinkList &head,Process pro,Node flag);//循环适应算法Node bestFit(LinkList &head,Process pro);//最佳适应算法Node worstFit(LinkList &head,Process pro);//最坏适应算法Node assign(LinkList &head,int orderIndex,int index,Node flagNode);//一次分区分配int assignMemory(LinkList &head);//内存分配void insertNode(LinkList &head,Node q,int index);//插入节点Node deleteNode(LinkList &head,int index);//删除节点int display(LinkList &head);//打印分区分配情况int lowAttemper(int *excursionPointer);//低级调度int findSubarea(LinkList &head,int index);//回收内存int creatProcess();//创建进程Process* randomCreatPro(int n);//随机产生进程下面是各种方法简述:(1) 最优替换算法, 即OPT算法。
实验三--动态分区存储管理方式的主(总10页)-CAL-FENGHAI.-(YICAI)-Company One1-CAL-本页仅作为文档封面,使用请直接删除实验三动态分区存储管理方式的主存分配回收一、实验目的深入了解动态分区存储管理方式主存分配回收的实现。
二、实验预备知识存储管理中动态分区的管理方式。
三、实验内容编写程序完成动态分区存储管理方式的主存分配回收的实现。
实验具体包括:首先确定主存空间分配表;然后采用最优适应算法完成主存空间的分配和回收;最后编写主函数对所做工作进行测试。
四、提示与讲解动态分区管理方式预先不将主存划分成几个区域,而把主存除操作系统占用区域外的空间看作一个大的空闲区。
当作业要求装入主存时,根据作业需要主存空间的大小查询主存内各个空闲区,当从主存空间中找到一个大于或等于该作业大小的主存空闲区时,选择其中一个空闲区,按作业需求量划出一个分区装入该作业。
作业执行完后,它所占的主存分区被收回,成为一个空闲区。
如果该空闲区的相邻分区也是空闲区,则需要将相邻空闲区合并成一个空闲区。
实现动态分区的分配和回收,主要考虑的问题有三个:第一,设计记录主存使用情况的数据表格,用来记录空闲区和作业占用的区域;第二,在设计的数据表格基础上设计主存分配算法;第三,在设计的数据表格基础上设计主存回收算法。
首先,考虑第一个问题:设计记录主存使用情况的数据表格,用来记录空闲区和作业占用的区域。
由于动态分区的大小是由作业需求量决定的,故分区的长度是预先不固定的,且分区的个数也随主存分配和回收变动。
总之,所有分区情况随时可能发生变化,数据表格的设计必须和这个特点相适应。
由于分区长度不同,因此设计的表格应该包括分区在主存中的起始地址和长度。
由于分配时空闲区有时会变成两个分区:空闲区和已分分区,回收主存分区时,可能会合并空闲分区,这样如果整个主存采用一张表格记录已分分区和空闲区,就会使表格操作繁琐。
主存分配时查找空闲区进行分配,然后填写已分配区表,主要操作在空闲区;某个作业执行完后,将该分区变成空闲区,并将其与相邻的空闲区合并,主要操作也在空闲区。
页式存储管理方案中简介页式存储管理是一种常见的存储管理方案,它利用固定大小的页面来组织和管理内存中的数据。
在页式存储管理方案中,内存被划分为多个固定大小的页框,应用程序中的数据被分割为同样大小的页面,并分配到对应的页框中。
这种分页的方式使得操作系统可以更加灵活地管理内存,提高系统的性能和资源利用率。
页式存储管理方案的原理页式存储管理方案主要由两个核心组件组成:页表和页表项。
页表页表是一个数据结构,用于记录每个页面在内存中的位置。
它通常是一个二维数组,第一维表示虚拟页面号,第二维表示物理页面号。
通过页表,操作系统可以根据虚拟页面号找到对应的物理页面号,从而实现页面的映射。
页表项页表项是页表中的一个元素,用于存储与页面相关的信息。
每个页表项通常包含以下几个字段:•有效位(Valid Bit):表示该页表项是否有效,即该页面是否在内存中。
•修改位(Dirty Bit):表示该页面是否被修改过。
•引用位(Reference Bit):表示该页面是否被访问过。
•页面框号(Page Frame Number):表示该页面在内存中的位置。
通过页表和页表项,操作系统可以根据虚拟页面号查找对应的页表项,进而获取页面在内存中的位置。
页式存储管理方案的优势相比于其他的存储管理方案,页式存储管理方案具有以下几个显著的优势:灵活的管理方式页式存储管理方案将内存划分为大小固定的页面,使得操作系统能够更加灵活地管理内存。
通过分页的方式,操作系统可以将不连续的物理页面映射到连续的虚拟页面中,从而提高内存的利用率,并能够更好地满足应用程序的需求。
高效的页面替换算法在页式存储管理方案中,当系统需要分配一个新的页面时,如果内存中没有空闲页框,就需要使用页面替换算法来选择一个合适的页面进行替换。
页式存储管理方案支持多种页面替换算法,如最近最少使用算法(LRU)、最不经常使用算法(LFU)等。
这些算法可以根据页面的引用位和修改位等信息,选择合适的页面进行替换,从而提高系统的性能和响应速度。
嵌入式系统设计师考试复习笔记之存储管理篇引言2007年下半年通过了嵌入式系统设计师的考试,一大堆的复习资料都不知道扔那里好,卖掉又有点可惜,送人又没人要。
与其让当时的复习笔记沉沦书架底部,还不如整理一下让大家评论评论。
2008年11月的考试也快到了,如果能帮到有需要的人,那我真是乐坏了。
看看06和07年的题目,在存储管理方面的题目蛮多的,应该是一个重要考点。
无论是概念、理论、分析和计算都相当容易出题。
在我当时的复习笔记中这方面算最多了。
这里就先拿这个点说说吧,其他的以后有时间再写了。
1、存储器系统的层次架构计算机系统的存储器被组织城一个金字塔的层次结构。
自上而下为:CPU内部寄存器、芯片内部高速缓存(cache)、芯片外部高速缓存(SRAM、SDRAM、DRAM)、主存储器(FLASH、EEPROM)、外部存储器(磁盘、光盘、CF卡、SD卡)和远程二级存储器(分布式文件系统、WEB服务器),6个层次的结构。
上述设备从上而下,依次速度更慢、容量更大、访问频率更小,造价更便宜。
2、高速缓存(cache)工作原理(参照教程126页,博客画不了图):主要利用了程序的局部性特点。
地址映象是指把主存地址空间映象到cache的地址空间。
地址变换是指当程序或数据已经装入到cache后,在实际运行过程中,把主存地址如何编程cache空间的地址。
常用的地址映象和地址变换的方式有:(教程127页)直接映象和变换:速度快,造价低,但有局限性,不能充分利用cache的好处。
组相联地址映象和变换:速度稍慢但是命中率高。
全相联地址映象和变换:可以任意映射。
常用的cache替换算法:轮转法和随机替换算法。
高速缓存的分类:统一cache和独立的数据/指令cache写通cache和写回cache读操作分配cache和写操作分配cache3、存储管理单元(MMU)MMU在CPU和物理内存之间进行地址转换,将地址从逻辑空间映射到物理空间,这个过程称为内存映射。
存储管理-页式管理存储管理-页式管理页式管理解决什么问题分区式管理,存在着严重的碎⽚问题使得内存的利⽤率不⾼1.固定分区,因为每⼀个分区只能分配给某⼀个进程使⽤,⽽该进程可能占不满这个分区,就会有内部碎⽚2.动态分区,会产⽣⼤量的外部碎⽚,虽然可以使⽤紧凑技术,但是这样时间成本过⾼了出现这种情况的原因是分区管理必须要求进程占⽤⼀块连续的内存区域,如果让⼀个进程分散的装⼊到不同的内存分区当中的话,这样就可以充分的利⽤内存,并且不需要紧凑这种技术了。
⽐如把⼀个进程离散的拆分放到零散的内存碎⽚中去,这样就可以更为⾼效的利⽤内存。
也就是产⽣了⾮连续的管理⽅式。
⽐如就是把⼀个进程拆分为若⼲部分,分别放到不同的分区中,⽐如⼀个进程23M,可以拆分为10M,10M,3M放到不同的分区中如果分区分的更⼩,23M拆分为11个2M的,和⼀个1M的,每个分区是2M,那么总共会装满11个分区,剩下⼀个分区装不满,也仅仅浪费1M的空间,也就是分区越⼩的话,那么就是内存利⽤率就会越⾼。
分区式管理时,进程的⼤⼩受分区⼤⼩或内存可⽤空间的限制分区式管理也不利于程序段和数据的共享页式管理的改进页式管理只在内存存放反复执⾏或即将执⾏的程序段与数据部分不经常执⾏的程序段和数据存放于外存待执⾏时调⼊。
页式管理的基本概念页框(页帧):将内存空间分成⼀个个⼤⼩相等的分区,每个分区就是⼀个页框。
页框号:每⼀个页框有⼀个编号,这个编号就是页框号,从0开始页(页⾯):将进程分割成和页框⼤⼩相等的⼀个个区域,也叫页页号:每⼀⼆个页⾯有⼀个编号,叫做页号,从0开始注意:由于最后⼀个页⾯可能没有页框那么⼤,所以页框不可以太⼤,否则会产⽣过⼤的内存碎⽚操作系统会以页框为单位为各个进程分配内存空间,进程的每⼀个页⾯分别放⼊⼀个页框中,也就是进程的页⾯和内存的页框具有⼀⼀对应的关系注意:各个页⾯不需要连续存放,可以放到不相邻的各个页框中如何实现地址的转化1.⾸先需要知道⼀个进程内的页对应物理内存中的起始地址a是多少2.其次要知道进程页内地址b是多少3.逻辑地址对应的实际物理地址就是c=a+b如何计算?⽐如逻辑地址80确定页号:页号=逻辑地址/页⾯长度 1=80/50页内偏移量:页内偏移量=逻辑地址%页⾯长度 30=80%50每个进程页⾯对应物理内存中页框的⾸地址:这是通过页表查询到的,⽐如查询到对应物理内存⾸地址是4500那么对应最终物理地址就是4500+30=4530页表页表的存在是为了让我们知道进程中的⼀个页的页号对应它存放在物理内存中的页框号,进⽽求出页框号对应的⾸地址逻辑地址的结构假如页号有k位,那么页数就是2^k个假如页内地址m位,那么页内地址有2^m个静态页⾯管理在作业或进程开始执⾏之前,把作业或进程的程序段和数据全部装⼊内存的各个页⾯中,并通过页表(page mapping table)和硬件地址变换机构实现虚拟地址到内存物理地址的地址映射。
习题5参考答案Ⅰ问答题1. 存储管理的主要功能是什么?答:(1)主存空间的分配与回收。
系统按照一定的算法把某一空闲的存储空间分配给作业或进程;用户不需要时,及时回收,以供其它用户程序使用。
(2)地址转换(地址重定位)。
把作业地址空间中使用的逻辑地址转换成内存空间中的物理地址。
(3)主存空间的共享和保护。
可用的主存空间可由两个或多个进程共享。
同时要保护系统程序区不被用户有意或无意的侵犯,不允许用户程序读写不属于自己地址空间的数据,避免各道程序间相互干扰。
特别是当一道程序发生错误时,不至于影响其它程序的运行。
(4)主存空间的扩充。
使用虚拟存储或自动覆盖技术提供比实际内存更大的空间。
2. 指出逻辑地址与物理地址的不同点。
答:用户的源程序一旦编译之后,每个目标模块都以0为基地址进行编址,这种地址称为逻辑地址或相对地址。
为了便于CPU访问,内存中的每个物理存储单元都有一个编号,这个编号称为内存地址,即物理地址(也称绝对地址)。
3. 何谓地址转换(重定位)?有哪些方法可以实现地址转换?答:当作业运行时,不能用逻辑地址在内存中读取信息,必须把作业地址空间中使用的逻辑地址转换成内存空间中的物理地址,这种转换称为地址转换。
实现地址转换的方法有:静态地址转换和动态地址转换。
4. 简述什么是覆盖?什么是交换?覆盖和交换的区别是什么?答:覆盖技术主要是指同一主存区可以被不同的程序段重复使用。
交换,就是系统根据需要把主存中暂时不运行的某个(或某些)作业部分或全部移到外存,而把外存中的某个(或某些)作业移到相应的主存区,并使其投入运行。
交换是由操作系统完成,用户并不知道。
操作系统按一定的策略采用“强占”和“礼让”的方法,把内存部分内容暂时放到硬盘交换区中。
覆盖是由用户控制,操作系统提供覆盖机制,用户给出该程序的覆盖结构。
覆盖机构将整个作业分为常驻和覆盖两部分。
子程序不会同时调入内存。
用户只要将最大的子程序作为覆盖区告诉系统即可。
存储管理练习题一一、单项选择题1.采用可重入程序是通过使用()的方法来改善响应时间的。
A 减少用户数目B改变时间片长短C 加快对换速度D 减少对换信息量( D可重入程序是指该程序被某进程调用,但还未结束,又被另一个进程调用。
可重入程序是通过减少对换信息量来改善系统响应时间的。
可重入程序主要通过共享来使用同一块存储空间的,或者通过动态链接的方式将所需的程序段映射到相关进程中去,其最大的优点是减少了对程序段的调入调出。
由此来减少对换信息量。
)2.段式存储管理中,用于记录作业分段在主存中的起始地址和长度的是()A基址寄存器和很长寄存器 B 段表C 界限寄存器D 上、下限寄存器答案:B3.固定分区存储管理中,CPU在执行作业的指令时,均会核对不等式()是否成立,若不成立,则产生地址越界中断事件,中止该指令的执行。
A界限寄存器≤绝对地址≤最大地址B下限地址≤绝对地址<上限地址C 基址寄存器内容≤绝对地址≤限长寄存器内容D基址寄存器内容<绝对地址<限长寄存器内容答案:B固定分区存储管理(适合多道程序设计)1.分区的定义固定分区存储管理是把主存储器中可分配的用户区域预先划分成若干个连续区,每一个连续区称为一个分区。
2.固定分区存储管理的特点(1)分区大小固定(2)分区数目固定。
3.主存空间的分配与回收存储管理设置“分区分配表”来说明各分区的分配和使用情况。
表中指出各分区的起始地址和长度,并为每个分区设置一个标志位。
标志位为“0”表示分区空间,非“0”表示分区已被占用。
当有作业要装入分区,存储管理分配主存区域时,根据作业地址空间的长度与标志为“0”的分区的长度比较,当有分区长度能容纳该作业时,则把作业装入该分区,且把作业名填到占用标志位上。
否则,该作业暂时不能装入。
作业运行结束后,根据作业名查分区分配表,把该分区的占用标志置成“0”以示空闲。
4.地址转换和存储保护因作业存放区域不会改变,可采用静态重定位方式把作业装入所在的分区号,且把该分区的下限地址和上限地址分别送入下限寄存器和上限寄存器中。
一、实验目的1. 理解操作系统存储管理的概念和作用。
2. 掌握存储管理的基本算法和策略。
3. 通过实验,加深对存储管理原理的理解,提高实际操作能力。
二、实验环境1. 操作系统:Windows 102. 软件环境:虚拟机软件VMware Workstation 153. 实验平台:Linux系统三、实验内容1. 存储管理概述2. 页式存储管理3. 段式存储管理4. 分段分页存储管理5. 存储管理算法四、实验步骤1. 页式存储管理实验(1)设置虚拟内存:在Linux系统中,使用`cat /proc/meminfo`命令查看内存信息,然后使用`vmstat`命令查看虚拟内存的使用情况。
(2)编写实验程序:使用C语言编写一个简单的程序,模拟页式存储管理过程。
(3)运行实验程序:编译并运行实验程序,观察程序运行过程中页面的分配、置换和回收过程。
2. 段式存储管理实验(1)设置虚拟内存:同页式存储管理实验。
(2)编写实验程序:使用C语言编写一个简单的程序,模拟段式存储管理过程。
(3)运行实验程序:编译并运行实验程序,观察程序运行过程中段页的分配、置换和回收过程。
3. 分段分页存储管理实验(1)设置虚拟内存:同页式存储管理实验。
(2)编写实验程序:使用C语言编写一个简单的程序,模拟分段分页存储管理过程。
(3)运行实验程序:编译并运行实验程序,观察程序运行过程中段页的分配、置换和回收过程。
4. 存储管理算法实验(1)编写实验程序:使用C语言编写一个简单的程序,模拟不同的存储管理算法(如FIFO、LRU、LFU等)。
(2)运行实验程序:编译并运行实验程序,观察不同算法在页面分配、置换和回收过程中的表现。
五、实验结果与分析1. 页式存储管理实验实验结果表明,页式存储管理可以将大程序离散地存储在内存中,提高内存利用率。
但页式存储管理也存在页面碎片问题,导致内存碎片化。
2. 段式存储管理实验实验结果表明,段式存储管理可以将程序按照逻辑结构划分为多个段,提高了内存的利用率。
可变就是指分区的大小和位置不是固定的,而是根据作业要求的主存量来分配分区的大小。
1、主存的分配和去配(回收)在系统初始化时,主存除了操作系统所占部分外,整个用户区是一个大的空闲区,可以按作业需要的空间大小顺序分配空闲区直到不够时为止。
当作业结束时,它的占用分区被收回。
这个空闲区又可以根据新作业的大小重新用于分配,所以主存中的已占分区和空闲区的数目和大小都是在变化的。
可以用两张表“已分配区表”和“空闲区表”来记录和管理。
2、常用的分配算法最先适应分配算法:简单地说,就是在分区表中顺序查找,找到够大的空闲区就分配。
但是这样的分配算法可能形成许多不连续的空闲区,造成许多“碎片”,使主存空间利用率降低。
最优适应分配算法:这种算法总是挑选一个能满足作业要求的最小空闲区。
但是这种算法可能形成一些极小的空闲区,以致无法使用,这也会影响主存利用率。
最坏适应分配算法:这种算法和上面的正好相反,它总是挑一个最大的空闲区分给作业使用,使剩下的空间不至于太小。
3、地址转换与存储保护采用可变分区方式管理时,一般均采用动态重定位方式装入作业。
也就是每读一条指令,都要变换一次地址。
变换要靠硬件支持,主要是两个寄存器:基址寄存器和限长寄存器,限长寄存器存放作业所占分区的长度,基址寄存器则存放作业所占分区的起始地址,这两个值确定了一个分区的位置和大小。
转换时根据逻辑地址与限长值比较,如果不有超过这个值,表示访问地址合法,再加上基址寄存器中的值就得到了绝对地址了,否则形成“地址越界”中断。
达到存储保护的目的。
对于共享程序,则硬件提供两组限长寄存器和基址寄存器。
访问时对访问区享区和作业区的地址分别进行转换。
4、移动技术的应用移动技术要“移动”的是主存空间中的作业。
把某个作业移到另一处主存空间去(在磁盘整理中我们应用的也是类似的移动技术),这样的最大好处就是可以合并一些空闲区。
但是移动技术的应用也要注意以下问题。
移动会增加系统开销。
所以要尽量减少移动。
学号:课程设计题目模拟设计页式存储管理的分配与回收学院计算机科学与技术专业班级姓名指导教师吴利军2013 年01 月09 日课程设计任务书学生姓名:指导教师:吴利军工作单位:计算机科学与技术学院题目: 模拟设计页式存储管理的分配与回收初始条件:1.预备内容:阅读操作系统的内存管理章节内容,理解有关虚拟存储器、页式存储管理等概念,掌握页式管理内存的分配和回收过程。
2.实践准备:掌握一种计算机高级语言的使用。
要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1.采用页式管理方案实施内存分配和回收。
能够处理以下的情形⑴能够输入给定的内存页面数,页面大小,进程的个数及每个进程的页数。
⑵当某进程提出申请空间的大小后,显示能否满足申请,以及为该进程分配资源后内存空间的使用情况(被进程占用的页面,空闲的页面);⑶当某进程撤消时,显示内存回收后内存空间的使用情况。
2.设计报告内容应说明:⑴需求分析;⑵功能设计(数据结构及模块说明);⑶开发平台及源程序的主要部分;⑷测试用例,运行结果与运行情况分析;⑸自我评价与总结:i)你认为你完成的设计哪些地方做得比较好或比较出色;ii)什么地方做得不太好,以后如何改正;iii)从本设计得到的收获(在编写,调试,执行过程中的经验和教训);iv)完成本题是否有其他方法(如果有,简要说明该方法);时间安排:设计安排一周:周1、周2:完成程序分析及设计。
周2、周3:完成程序调试及测试。
周4、周5:验收、撰写课程设计报告。
(注意事项:严禁抄袭,一旦发现,一律按0分记)指导教师签名:年月日系主任(或责任教师)签名:年月日模拟设计页式存储管理的分配与回收1需求分析图2 基本页表示例静态分页管理的第一步是为要求内存的作业或进程分配足够的页面。
系统通过存储页面表、请求表以及页表来完成内存的分配工作。
页表指的是内存中的一块固定存储区。
页式管理时每个进程至少有一个页表。
请求表指的是用来确定作业或进程的虚拟空间的各页在内存中的实际对应位置;另外整个系统有一个存储页面表,其描述了物理内存空间的分配使用状况。
图3 请求表的示例存储页面表有两种构成方法:1、位示图法2、空闲页面链表法模拟设计页式存储管理的分配与回收要求能够满足如下的要求:(1)输入给定的内存页面数,页面大小,进程的个数及每个进程的页数。
(2)要求当某进程提出申请空间的大小后,显示能否满足申请,以及为该进程分配资源后内存空间的使用情况(被进程占用的页面,空闲的页面)。
2 功能设计2.1 算法分析首先,请求表给出进程或作业要求的页面数。
然后,由存储页面表检查是否有足够的空闲页面,如果没有,则本次无法分配。
如果有则首先分配设置页表,并请求表中的相应表项后,按一定的查找算法搜索出所要求的空闲页面,并将对应的页好填入页表中。
图4 分配页面的算法流程2.2 数据结构页式管理把内存空间按页的大小划分成片或者页面,再按照一定的规律建立起页表,并通过请求表将分配内容显示出来.将页表和请求表的内容使用结构体来定义是比较方便的.//页表项结构typedef struct _pagetableitem{pageid pagenum; //页号blockid blocknum; //块号}pgtabitem; //页表typedef pgtabitem * pagetable;//请求表结构typedef struct _reqtable{unsigned pid; //进程号unsigned reqpagenum; //请求页面数pagetable pgtabadr; //页表始址bool state; //状态} reqtabitem;请求表还引入了支持快速插入和删除的list顺序容器来进行相关操作.list<reqtabitem> reqtable因为模拟设计的关系,页面的起始地址均应该为随机的数值,所以程序在设计过程中加入了随机数类的编写.class RandomNumber{private:unsigned long randseed;public:RandomNumber(unsigned long s=0);unsigned short Random(unsigned long n);double fRandom(void);};采用当前系统的时间值来生成伪随机数分配地址.定义随机数产生器:RandomNumber random定义内存页面数:int pagenum定义页面大小:int pagesize定义进程个数:int pnum用整数数组模拟分配的内存页面数int * mempage=new int[pagenum]2.3模块说明2.3.1 主函数主函数依次运行了程序中所实现的关键函数.int main(){InitSys(); //初始化系统MainChoice();//输出系统菜单Destroy(); //释放申请的动态内存return 0;}2.3.2 各个功能函数初始化内存页面:void Init_Mempage(void)获取内存使用情况:int Get_Mempagenum(void) 初始化默认的请求表:void Init_Reqtable(void)为默认的进程分配内存:void Init_DistMem(void) 手动创建进程,并分配内存:void Dist_Mem(void) 释放申请的动态内存:void Destroy(void)结束指定进程:void Kill(void)2.3.3 打印函数打印出进程请求表:void PrintReqtable(void)打印出页表:void PrintPageTable(void)打印出内存使用情况:void PrintMem(void)打印出物理块的大小:void PrintBlockSize(void) 2.3.4 其他函数初始化系统: void InitSys(void)输出主菜单:void MainMenu(void)选择运行分支:void MainChoice()3开发平台3.1开发平台(1)使用系统:Windows 7(2)使用语言:C++(3)开发工具:Visual C++ 6.04测试用例,运行结果与运行情况分析4.1测试方法通过输入正常数据以及非正常数据对程序进行全方位测试4.2测试结果(1)程序主界面(2)输入进程号和页面数:(3)显示进程页表:(4)显示请求表(5)显示内存使用情况以及物理块大小(6)错误检验5源程序的主要部分#include <iostream>#include <cstdlib>#include <iomanip>#include <list>#include "page.h"#include "Random.h"using namespace std;list<reqtabitem> reqtable;RandomNumber random; //随机数产生器unsigned pagenum=random.Random(80)+21; //内存页面数21-100 unsigned pagesize=random.Random(16)+5; //页面大小5-20 unsigned pnum=random.Random(4)+5;//进程的个数5-8int * mempage=new int[pagenum]; //用整数数组模拟内存页面数void Init_Mempage(void){int i=0;for(i=0;i<int(pagenum);i++)mempage[i]=0; //数组全部赋初值}int Get_Mempagenum(void){int sum=0;for(int i=0;i<int(pagenum);i++)if(mempage[i]==0)sum++;return sum; //判断有多少内存页面已经被使用}void Init_Reqtable(void){int i;for(i=1;i<=int(pnum);i++){reqtabitem preq;preq.pid=i;preq.reqpagenum=random.Random(4)+2;//进程请求的页面大小-5preq.state=false;preq.pgtabadr=NULL;reqtable.push_back(preq); //依次压入容器}}/*为默认的进程分配内存*/void Init_DistMem(void){int reqpnum; //进程请求页面数int i;list<reqtabitem>::iterator pos=reqtable.begin();for(;pos!=reqtable.end();pos++){reqpnum=(*pos).reqpagenum;if(reqpnum>int(Get_Mempagenum())) //判断请求的内存页面数目是否大于剩余的{cout<<"没有足够的内存!"<<endl;cout<<endl;}else{(*pos).state=true;pagetable temp = new pgtabitem[reqpnum]; //新建临时页表项数组if(temp==NULL){cout<<"内存分配失败!"<<endl;exit(0);}(*pos).pgtabadr=temp;for(i=0;i<reqpnum;i++){temp[i].pagenum=i; //页表的页号int randnum=random.Random(pagenum)+1;//随机产生一个块号while(mempage[randnum]==1)randnum=random.Random(pagenum)+1;temp[i].blocknum=randnum;//页表的块号mempage[randnum]=1;}}}}/*手动创建进程,并分配内存*/void Dist_Mem(void){int i;reqtabitem preq; //新创建进程记录int pid; //进程号int reqpnum; //请求页面数bool flag=false;do{cout<<"请输入进程号:";flag=false;cin>>pid;for(list<reqtabitem>::iteratorpos=reqtable.begin();pos!=reqtable.end();pos++){if((*pos).pid==pid){flag=true;cout<<"该进程号已经存在,请重新输入"<<endl;cout<<endl;break;}}}while(flag==true); //循环直到输入的Pid满足条件preq.pid=pid;cout<<"请输入需要的页面数:";cin>>reqpnum;preq.reqpagenum=reqpnum;preq.state=false;preq.pgtabadr=NULL;reqpnum=preq.reqpagenum;if(reqpnum>Get_Mempagenum()){cout<<"没有足够的内存,进程创建失败!"<<endl;cout<<endl;}else{preq.state=true;pagetable temp = new pgtabitem[reqpnum];if(temp==NULL){cout<<"内存分配失败!"<<endl;exit(0);}preq.pgtabadr=temp;for(i=0;i<int(reqpnum);i++){temp[i].pagenum=i; //页表的页号int randnum=random.Random(pagenum)+1;//随机产生一个块号while(mempage[randnum]==1)randnum=random.Random(pagenum)+1;temp[i].blocknum=randnum;//页表的块号mempage[randnum]=1;}}reqtable.push_back(preq); //将该进程的记录加入请求表}/*程序结束时,释放申请的动态内存*/void Destroy(void){list<reqtabitem>::iterator pos=reqtable.begin();for(pos=reqtable.begin();pos!=reqtable.end();pos++){if((*pos).state==true)delete [](*pos).pgtabadr;}reqtable.clear();}/* 打印出进程请求表*/void PrintReqtable(void){cout<<endl;cout<<"|--------------------------------------------------------------------|"<<endl;cout<<"| 进程请求表|"<<endl;cout<<"|--------------------------------------------------------------------|"<<endl;cout<<"|"<<setw(8)<<"进程号"<<setw(16)<<"请求页面数"<<setw(16)<<"页表起始地址"<<setw(16)<<"页表长度"<<setw(16)<<"状态|"<<endl;cout<<"|---------------------------------------------------------------------|"<<endl;list<reqtabitem>::iterator pos=reqtable.begin();for(pos=reqtable.begin();pos!=reqtable.end();pos++){cout<<"|"<<setw(8)<<(*pos).pid<<setw(16)<<(*pos).reqpagenum<<setw(16)<<(*pos).pgtabadr<<setw(16)<<((*pos).reqpagenum) * pagesize;if((*pos).state)cout<<setw(4)<<"已分配|"<<endl;elsecout<<setw(4)<<"未分配|"<<endl;if((*pos).pid!=reqtable.back().pid)cout<<"|--------------------------------------------------------------------|"<<endl;elsecout<<"|--------------------------------------------------------------------|"<<endl;}}/*打印页表*/void PrintPageTable(void){unsigned pid;int i;bool flag=false;cout<<"请输入进程号:";cin>>pid;list<reqtabitem>::iterator pos=reqtable.begin();for(pos=reqtable.begin();pos!=reqtable.end();pos++){if((*pos).pid==pid&&(*pos).state==true){flag=true;cout<<"|---------------------------|"<<endl;cout<<"| 此进程的页表|"<<endl;cout<<"|---------------------------|"<<endl;cout<<"|"<<setw(16)<<"页号"<<setw(6)<<"块号|"<<endl;cout<<"|---------------------------|"<<endl;int reqpagenum=(*pos).reqpagenum;for(i=0;i<reqpagenum;i++){cout<<"|"<<setw(16)<<(*pos).pgtabadr[i].pagenum<<setw(6)<<(*pos).pgtabadr[i].blocknum<<" |"<<endl;if(i!=reqpagenum-1)cout<<"|---------------------------|"<<endl;elsecout<<"|---------------------------|"<<endl;}}}if(flag==false)cout<<"系统中不存在该进程或者该进程还没有被分配内存!\n";cout<<endl;}void PrintMem(void){cout<<"内存总块数为"<<pagenum<<",已经使用了"<<pagenum-Get_Mempagenum()<<"块!"<<endl;cout<<"现在还有"<<Get_Mempagenum()<<"块内存区域空闲!"<<endl;cout<<endl;}void PrintBlockSize(void){cout<<"物理块大小为:"<<pagesize<<"KB"<<endl;cout<<endl;}/*结束指定进程*/void Kill(void){bool flag;int i;reqtabitem temp;list<reqtabitem>::iterator pos=reqtable.begin();int pid;do{cout<<"请输入进程号:";flag=false;cin>>pid;for(pos=reqtable.begin();pos!=reqtable.end();pos++){if((*pos).pid==pid){flag=true;temp=*pos;break;}}if(flag==false)cout<<"系统中不存在该进程!"<<endl;cout<<endl;}while(flag==false);for(i=0;i<int(temp.reqpagenum);i++)mempage[temp.pgtabadr[i].blocknum]=0;reqtable.remove(temp);//重新为没有分配到内存的进程分配内存for(pos=reqtable.begin();pos!=reqtable.end();pos++){if((*pos).state==false){int reqpnum;reqpnum=(*pos).reqpagenum;if(reqpnum<=Get_Mempagenum()){(*pos).state=true;pagetable temp = new pgtabitem[reqpnum];if(temp==NULL){cout<<"内存分配失败!"<<endl;cout<<endl;exit(0);}(*pos).pgtabadr=temp;for(i=0;i<int(reqpnum);i++){temp[i].pagenum=i; //页表的页号int randnum=random.Random(pagenum)+1;//随机产生一个块号while(mempage[randnum]==1)randnum=random.Random(pagenum)+1;temp[i].blocknum=randnum;//页表的块号mempage[randnum]=1;}}}}}/*初始化系统*/void InitSys(void){cout.setf(ios::left);//左对齐Init_Mempage();Init_Reqtable();Init_DistMem();}/*输出主菜单*/void MainMenu(void){cout<<"页式存储管理的分配与回收"<<endl;cout<<"1.手动创建进程"<<endl;cout<<"2.显示进程页表"<<endl;cout<<"3.显示请求表"<<endl;cout<<"4.撤销进程"<<endl;cout<<"5.显示内存使用情况"<<endl;cout<<"6.显示物理块大小"<<endl;cout<<"7.退出系统"<<endl;cout<<"请输入您的选择(0--7):";}/*选择函数*/void MainChoice(){int choice;do{MainMenu();cin>>choice;switch(choice){case 1:Dist_Mem();break;case 2:PrintPageTable();break;case 3:PrintReqtable();break;case 4:Kill();break;case 5:PrintMem();break;case 6:PrintBlockSize();break;case 7:break;default :cout<<"输入有误,请重新输入.\n";cout<<endl;break;}}while(choice!=7);}int main(){InitSys();//初始化系统MainChoice();//输出系统菜单Destroy();//释放申请的动态内存return 0;}6总结这次课程设计比较成功,程序运行没有出什么大错误,只是一些需要注意的细节方面的错误,程序的编写还算比较简,我做的是页式存储管理的分配与回收的设计是一个不难的程序,编写的时候没有出现不会的地方,只是细节方面有一些麻烦。