基于可重定位分区分配算法的内存管理的设计与实现
- 格式:docx
- 大小:115.69 KB
- 文档页数:20
注意:1)“本章要点”部分,用红字标注的不是期末考试出题范围。
2)“习题部分”用蓝字标注的是重点习题,期末考试50%的题目是这些习题的原题。
红字标注的习题期末考试不考,仅供考研的同学参考。
3)大部分习题答案只给出要点,同学们可以自行适当补充,但一定要简明扼要。
4)如“本章要点”部分用红字标注的非考试内容,在“习题”部分有相关的重点习题,则对该部分内容只需做该习题即可。
------------------------------------------------------------第四章存储器管理要点4.1 存储器的层次结构理解P116图4-1的存储器层次结构,知道这种结构从经济上考虑,具有好的性能/价格比。
了解P117-118高速缓存CACHE和磁盘缓存,知道它们使用的淘汰算法与虚拟内存的页面置换算法是基本相同的。
4.2 程序的装入和链接这一小节的内容是一些重要的专业常识。
应了解本小节介绍的各种装入和链接方法,要求结合Windows操作系统及C 语言的实际去理解上述装入和链接方法(联系实际部分可上网查询)。
4.3 连续分配方式通用操作系统大都不用连续分配方式,有些嵌入式OS可能使用这种分配方式。
这一小节只需阅读P121-124即可。
4.4 基本分页存储管理方式这是本章最重要的一小节,要求全读。
重点理解页面、物理块、页表、页表的访存、物理地址、逻辑地址、快表(TLB)等概念及相互关系。
4.5 基本分段存储管理方式阅读4.5.1,知道为什么要分段。
阅读4.5.2 知道分段的原理。
考研的同学要知道段表、地址变换,知道分段和分页的主要区别。
阅读4.5.3 知道分段有利于信息共享,知道“纯代码”的概念。
阅读4.5.4 知道什么是段页式存储。
需要补充说明的是:教材说过,分段方便编程,主要是指方便汇编语言程序员,和设计高级语言编译器的程序员。
对使用高级语言进行应用编程的程序员来说,段是透明的,一般不能用高级语言代码去操作段。
操作系统-存储管理(4)段页式虚拟存储物理地址:⼜称绝对地址,即程序执⾏所使⽤的地址空间(处理器执⾏指令时按照物理地址进⾏)逻辑地址:⼜称相对地址,即⽤户编程所使⽤的地址空间,从0开始编号,有两种形式:⼀维逻辑地址(地址)⼆维逻辑地址(段号:段内地址)主存储器空间的分配与去配:分配:进程装⼊主存时,存储管理软件进⾏具体的主存分配操作,并设置⼀个表格记录主存空间的分配情况去配:当某个进程撤离或主动归还主存资源时,存储管理软件要收回它所占⽤的全部或者部分存储空间,调整主存分配表信息主存储器空间的共享:多个进程共享主存储器资源:多道程序设计技术使若⼲个程序同时进⼊主存储器,各⾃占⽤⼀定数量的存储空间,共同使⽤⼀个主存储器多个进程共享主存储器的某些区域:若⼲个协作进程有共同的主存程序块或者主存数据块多道程序设计需要复⽤主存:按照分区复⽤:主存划分为多个固定/可变尺⼨的分区,⼀个程序/程序段占⽤⼀个分区按照页架复⽤:主存划分成多个固定⼤⼩的页架,⼀个程序/程序段占⽤多个页架装载程序/加载器(loader)把可执⾏程序装⼊内存的⽅式有:绝对装载可重定位装载动态运⾏时装载地址转换:⼜称重定位,即把可执⾏程序逻辑地址转换成绝对地址,可分为:静态地址重定位:由装载程序实现装载代码模块的加载和地址转换(⽆需硬件⽀持),把它装⼊分配给进程的内存指定区域,其中所有指令代码和数据的逻辑地址在执⾏前⼀次全部修改为内存物理地址。
早期单任务单⽤户OS使⽤。
动态地址重地位:由装载程序实现装载代码模块的加载,把它装⼊进程的内存在指定区域,但对链接程序处理过的应⽤程序逻辑地址不做修改,程序内存起始地址被置⼊重定位寄存器(基址寄存器)。
程序执⾏过程中每当CPU访问程序和数据引⽤内存地址时,由硬件地址转换机构截取此逻辑地址并加上重定位寄存器的值。
运⾏时链接地址重定位存储保护:为避免主存中的多个进程相互⼲扰,必须对主存中的程序和数据进⾏保护。
操作系统原理试题题库含答案(7)1、在I/O子系统中,I/O请求的排队时间为10ms,而请求的服务时间为40ms,则I/O请求的总响应时间为()A、 10msB、 50msC、 30msD、 40ms正确答案: B2、下列哪项不是进行存储管理的目的( )。
A、提高存储利用率B、防止用户破坏操作系统C、防止用户相互干扰D、为了使用Spooling正确答案: D3、进程的基本状态转换中,哪一种是不可能发生。
A、就绪态变为阻塞态B、就绪态变为执行态C、阻塞态变为就绪态D、执行态变为阻塞态正确答案: A4、进程的动态、并发等特征是利用____________表现出来的。
A、程序B、数据C、程序和数据D、进程控制块正确答案: D5、要求进程一次性申请所需的全部资源,是破坏了死锁必要条件中的____条件。
A、不可剥夺B、互斥C、请求与保持D、环路等待正确答案: C6、在下面的I/O控制方式中,需要CPU干预最少的方式是()A、程序I/O控制方式B、中断驱动I/O控制方式C、直接存储器访问(DMA)控制方式D、 I/O通道控制方式正确答案: D7、在操作系统中,只能在系统态下运行的指令是()。
A、读时钟指令B、置时钟指令C、取数指令D、寄存器清零指令正确答案: D8、下列选项中,导致创建新进程的操作是()I.用户登录成功 II.设备分配 III.启动程序执行A、仅I和IIB、仅II和IIIC、仅I和IIID、 I、II和III正确答案: B9、某一作业8:00到达系统,估计运行时间为2小时,若11:00开始执行该作业,其响应比是()。
A、 3.5B、 3C、 2.5D、 2正确答案: C10、在外围设备和内存之间开辟直接的数据通道的是()。
A、程序直接控制B、 DMAC、通道控制D、中断正确答案: B11、在请求分页存储管理中,若采用FIFO页面淘汰算法,则当分配的页面数增加时,缺页中断的次数( )。
A、减少B、增加C、无影响D、可能增加也可能减少正确答案: D12、哪个属于抢占式调度___A、时间片轮转法;B、短作业优先调度;C、先来先服务;D、高响应比优先调度;正确答案: A13、在存储管理中,采用地址变换机构的目的是()A、加快进程空间寻址B、提高CPU效率C、进程空间保护和内存共享D、便于有效分配内存正确答案: A14、MS-DOS中的文件物理结构采用_________。
一、单项选择题1.测得某个采用按需调页(Demand-paging)策略的计算机系统部分状态数据为:CPU 利用率20%,用于对换空间的硬盘利用率97.7%,其它设备的利用率5%,由此断定系统出现异常。
此种情况下()能提高利用率。
a. 安装一个更快的硬盘b. 通过扩大硬盘容量增加对换空间c. 增加运行进程数d. 加内存条来增加物理空间容量2.具有虚拟存储功能的管理方法包括()。
a. 可变分区存储管理b. 页式存储管理c. 段式存储管理d. 段页式存储管理3.最佳适应算法的空白区是()。
a. 按大小递减顺序排列b. 按大小递增顺序排列c. 按地址由小到大排列d. 按地址由大到小排列4.存储管理方案中,()可采用覆盖技术。
a.单一连续区存储管理b. 可变分区存储管理c. 段式存储管理d. 段页式存储管理5.页式虚拟存储管理的主要特点是()。
a.不要求将作业装入主存的连续区域b.不要求将作业同时全部装入到主存的连续区域c.不要求进行缺页中断处理d.不要求进行页面置换6.在可变式分区分配方案中,某一作业完成后,系统收回其主存空间并与相邻空闲区合并,为此需修改空闲区表,造成空闲区数减1的情况是()。
a. 无上邻空闲区也无下邻空闲区b. 有上邻空闲区但无下邻空闲区c. 有下邻空闲区但无上邻空闲区d. 有上邻空闲区也有下邻空闲区7.为使虚存系统有效地发挥其预期的作用,所运行的程序应具有的特性是()。
a.该程序不应含有过多的I/O操作b.该程序的大小不应超过实际的内存容量c.该程序应具有较高的局部性(Locality)d.该程序的指令相关不应过多8.某虚拟存储器系统采用页式内存管理,使用LRU页面替换算法,考虑下面的页面访问地址流(每次访问在一个时间单位中完成):18 1 7 8 2 7 2 1 8 3 8 2 1 3 1 7 1 3 7假定内存容量为4个页面,开始时空的,则页面失效次数是()。
a. 4b. 5c. 6d. 79.在分区分配方案中,需要执行靠拢(或紧凑)的操作是()。
存储管理的基本原理内存管理方法内存管理主要包括内存分配和回收、地址变换、内存扩充、内存共享和保护等功能。
下面主要介绍连续分配存储管理、覆盖与交换技术以及页式与段式存储管理等基本概念和原理。
1.连续分配存储管理方式连续分配是指为一个用户程序分配连续的内存空间。
连续分配有单一连续存储管理和分区式储管理两种方式。
(1)单一连续存储管理在这种管理方式中,内存被分为两个区域:系统区和用户区。
应用程序装入到用户区,可使用用户区全部空间。
其特点是,最简单,适用于单用户、单任务的操作系统。
CP/M和DOS 2.0以下就是采用此种方式。
这种方式的最大优点就是易于管理。
但也存在着一些问题和不足之处,例如对要求内存空间少的程序,造成内存浪费;程序全部装入,使得很少使用的程序部分也占用—定数量的内存。
(2)分区式存储管理为了支持多道程序系统和分时系统,支持多个程序并发执行,引入了分区式存储管理。
分区式存储管理是把内存分为一些大小相等或不等的分区,操作系统占用其中一个分区,其余的分区由应用程序使用,每个应用程序占用一个或几个分区。
分区式存储管理虽然可以支持并发,但难以进行内存分区的共享。
分区式存储管理引人了两个新的问题:内碎片和外碎片。
前者是占用分区内未被利用的空间,后者是占用分区之间难以利用的空闲分区(通常是小空闲分区)。
为实现分区式存储管理,操作系统应维护的数据结构为分区表或分区链表。
表中各表项一般包括每个分区的起始地址、大小及状态(是否已分配)。
分区式存储管理常采用的一项技术就是内存紧缩(compaction):将各个占用分区向内存一端移动,然后将各个空闲分区合并成为一个空闲分区。
这种技术在提供了某种程度上的灵活性的同时,也存在着一些弊端,例如:对占用分区进行内存数据搬移占用CPU~t寸间;如果对占用分区中的程序进行“浮动”,则其重定位需要硬件支持。
1)固定分区(nxedpartitioning)。
固定式分区的特点是把内存划分为若干个固定大小的连续分区。
第4章存储器管理4.4自测题4.4.1基本题一.判断题(正确的在括号中记√,错误的记×)1.为了减少内部碎片,页应偏小为好。
( )2.为了减少缺页中断率,页应该小一些。
( )3.为提高对换空间的利用率,一般对其使用离散的分配方式。
( )4.用户程序中出错处理部分不必常驻内存。
( )5.使用预分页的原因是每个进程在最初运行时需要一定数量的页面。
( )6.可变分区法可以比较有效地消除外部碎片,但不能消除内部碎片。
()7.分页存储管理方案易于实现用户使用内存空间的动态扩充。
( )8.LRU页面调度算法总是选择在主存驻留时间最长的页面被淘汰。
( )9.最佳适应算法比首次适应算法具有更好的内存利用率。
( )10.请求分段存储管理中,分段的尺寸要受主存空间的限制。
( )二.单项选择题,在每小题的四个备选答案中选出一个正确答案,并将其代码写在题干后面的括号内。
不选、错选或多选者该题无分。
1.在可变式分区管理中,最佳适应算法是将空白区在空白区表中按______次序排列。
A.地址递增B.地址递减C.容量递增D.容量递减2.动态重定位技术依赖于_______.A.重定位装入程序B.重定位寄存器C.地址机构D.目标程序3.请求分页存储管理方案的主要特点是__________。
A.不要求将作业装入内存B.不要求将作业全部装入内存C.不要求使用联想存储器D.不要求缺页中断的处理4.在存储管理方案中,___________可与覆盖技术配合。
A.页式管理B.段式管理C.段页式管理D.可变分区管理5.一个计算机系统虚存的最大容量是由__________决定的。
A.主存的容量B.辅存的容量C.主存容量+辅存容量D.计算机的地址机构6.在存储管理中,采用覆盖与交换技术的目的是_________。
A.节省主存空间B.物理上扩充主存容量C.提高CPU效率D.实现主存共享7.在可变式分区分配方案中,只需要进行一次比较就可以判定是否满足作业对主存空间要求的是______。
第五章存储管理一. 选择最合适的答案1.分页存储管理的存储保护是通过( )完成的.A.页表(页表寄存器)B.快表C.存储键D.索引动态重定2.把作业地址空间中使用的逻辑地址变成内存中物理地址称为()。
A、加载B、重定位C、物理化D、逻辑化3.在可变分区存储管理中的紧凑技术可以()。
A.集中空闲区B.增加主存容量C.缩短访问时间D.加速地址转换4.在存储管理中,采用覆盖与交换技术的目的是( )。
A.减少程序占用的主存空间B.物理上扩充主存容量C.提高CPU效率D.代码在主存中共享5.存储管理方法中,( )中用户可采用覆盖技术。
A.单一连续区 B. 可变分区存储管理C.段式存储管理 D. 段页式存储管理6.把逻辑地址转换成物理地址称为()。
A.地址分配B.地址映射C.地址保护D.地址越界7.在内存分配的“最佳适应法”中,空闲块是按()。
A.始地址从小到大排序B.始地址从大到小排序C.块的大小从小到大排序D.块的大小从大到小排序8.下面最有可能使得高地址空间成为大的空闲区的分配算法是()。
A.首次适应法B.最佳适应法C.最坏适应法D.循环首次适应法9.硬盘容量1G,内存容量为1024k,那么虚拟存储器最大实际容量可能是( ) 。
A.1024KB.1024MC.10GD.10G+1M10.用空白链记录内存空白块的主要缺点是()。
A.链指针占用了大量的空间B.分配空间时可能需要一定的拉链时间C.不好实现“首次适应法”D.不好实现“最佳适应法”11.一般而言计算机中()容量(个数)最多.A.ROMB.RAMC.CPUD.虚拟存储器12.分区管理和分页管理的主要区别是()。
A.分区管理中的块比分页管理中的页要小B.分页管理有地址映射而分区管理没有C.分页管理有存储保护而分区管理没有D.分区管理要求一道程序存放在连续的空间内而分页管理没有这种要求。
13.静态重定位的时机是()。
A.程序编译时B.程序链接时C.程序装入时D.程序运行时14.通常所说的“存储保护”的基本含义是()A.防止存储器硬件受损B.防止程序在内存丢失C.防止程序间相互越界访问D.防止程序被人偷看15.能够装入内存任何位置的代码程序必须是( )。
组号 成绩 计算机操作系统 课程设计报告
题目 基于可重定位分区分配算法的内存管理的设计与实现
专业: 计算机科学与技术 班级: 学号+姓名: 指导教师: 2016年12月 23 日 一. 设计目的 掌握内存的连续分配方式的各种分配算法
二. 设计内容 基于可重定位分区分配算法的内存管理的设计与实现。本系统模拟操作系统内存分配算法的实现,实现可重定位分区分配算法,采用PCB定义结构体来表示一个进程,定义了进程的名称和大小,进程内存起始地址和进程状态。内存分区表采用空闲分区表的形式来模拟实现。要求定义与算法相关的数据结构,如PCB、空闲分区;在使用可重定位分区分配算法时必须实现紧凑。
三. 设计原理 可重定位分区分配算法与动态分区分配算法基本上相同,差别仅在于:在这种分配算法中,增加了紧凑功能。通常,该算法不能找到一个足够大的空闲分区以满足用户需求时,如果所有的小的空闲分区的容量总和大于用户的要求,这是便须对内存进行“紧凑”,将经过“紧凑”后所得到的大空闲分区分配给用户。如果所有的小空闲分区的容量总和仍小于用户的要求,则返回分配失败信息
四. 详细设计及编码 1. 模块分析 (1)分配模块 这里采用首次适应(FF)算法。设用户请求的分区大小为,内存中空闲分区大小为,规定的不再切割的剩余空间大小为size。空闲分区按地址递增的顺序排列;在分配内存时,从空闲分区表第一个表目开始顺序查找,如果≥且,说明多余部分太小,不再分割,将整个分区分配给请求者;如果≥且,就从该空闲分区中按请求的大小划分出一块内存空间分配给用户,剩余的部分仍留在空闲分区表中;如果到找到一个足够大的空闲分区;如果没有找到一个足够大的内存空闲分区,但所有的小的空闲分区的容量总和大于用户的要求,就进行紧凑,将紧凑后得到的大的空闲分区按上述的方式分配给用户;但如果所有的小的空闲分区的容量总和仍不能满足用户需要,则分配失败。
(2)内存回收模块 进行内存回收操作时,先随机产生一个要回收的进程的进程号,把该进程从进程表中中删除,它所释放的空闲内存空间插入到空闲分区表;如果回收区与插入点的前一个空闲分区相邻,应将回收区与插入点的前一分区合并,修改前一个分区的大小;如果回收区与插入点的后一个空闲分区相邻,应将回收区与插入点的后一分区合并,回收区的首址作为新空闲分区的首址,大小为二者之和;如果回收区同时与插入点的前、后空闲分区相邻,应将三个分区合并,使用前一个分区的首址,取消后一个分区,大小为三者之和。
(3)紧凑模块 将内存中所有作业进行移动,使他们全都相邻接,把原来分散的多个空闲小分区拼接成一个大分区。
2. 流程图
否 否
是 是
3. 代码实现 #include<>
#include<> #include<> #include<>
#define TURE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 #define SIZE 15 StartAddr>pList[j+1].pStartAddr){ temp=pList[j]; pList[j]=pList[j+1]; pList[j+1]=temp; } } } } StartAddr=0; StartAddr=pList[i].pStartAddr+pList[i].pOccupy; } StartAddr+pList[pLength-1].pOccupy; s->areaSize=sumEmpty; ListInsert(L,s); printf("\n紧凑后的>>>>\n"); pListPrint(pList); PrintList(L); }
void amalgamate(LinkList &L){No; delPSize=pList[index].pSize; delPOccupy=pList[index].pOccupy; delPStartAddr=pList[index].pStartAddr;
printf("________________________________________________________________________________");
printf("回收内存 进程 P%d: 始址:%d K 占用:%d KB\n",delPNo,delPStartAddr,delPOccupy);
printf("\n回收后>>>>\n"); ListDelete(pList,index); No,pList[i].pStartAddr,pList[i].pOccupy); } }
void distribute(LinkList &L,struct PCB *process){ LinkList p=L->next; while(p!=NULL) { if(p->areaSize>=process->pSize) break; p=p->next; } printf("%d KB < %d KB",process->pSize,p->areaSize); if(p->areaSize-process->pSize<=SIZE){ //不用分割全部分配 (直接删除此空闲分区结点) process->pStartAddr=p->aStartAddr; //进程始址变化 process->pState=1; //进程状态 process->pOccupy=p->areaSize; //进程实际占用内存 为改空闲分区的大小
pList[pLength++]= *process; //把进程加入进程列表 printf(" 且 %d KB - %d KB = %d KB < %d KB 则 整区分配\n",
p->areaSize,process->pSize,p->areaSize-process->pSize,SIZE);
pSort(pList); printf("\n分配后>>>>\n"); pListPrint(pList);//输出内存中空间占用情况 DeleteElem(L,p->aStartAddr); }else{//分割分配
process->pStartAddr=p->aStartAddr; //进程始址变化 process->pState=1; //进程状态 process->pOccupy=process->pSize; //进程实际占用内存 为该进程的大小
pList[pLength++]= *process; //把进程加入进程列表 printf(" 且 %d KB - %d KB = %d KB > %d KB 则 划分分配\n",
p->areaSize,process->pSize,p->areaSize-process->pSize,SIZE);
pSort(pList); //进程排序 printf("\n分配后>>>>\n"); pListPrint(pList);//输出内存中空间占用情况 //compact(L,pList); p->aStartAddr+=process->pSize; //空闲分区始址变化 p->areaSize-=process->pOccupy; //空闲分区大小 变化 } } int main(){ //0、创建一个进程,参数随机数方式产生 struct PCB p; int i,num,dele,k,stAddr,flag; LinkList s,L; printf("********************************可重定位分区分配********************************");
if(!InitList(L)) //初始化空闲分区表 printf("创建表失败\n"); while(1){ srand(time(0)); flag=rand()%100+1; if(flag%2==0){ creatP(&p);//初始化进程
printf("________________________________________________________________________________");
printf("待装入作业:%d Size = %d KB\n",,; //1、请求分配 size //2、检索空闲分区表(首次适应FF) PrintList(L); stAddr=search(L,;//得到足够大的分区的始址 ,没有则返回-1
if(stAddr==-1){//没有足够大的分区 if(add(L)>={//空闲区总和足够大 printf("没有足够大的空闲分区但空闲总和足够大\n");
//紧凑 compact(L,pList); //按动态分区方式分配 distribute(L,&p);