主存空间的分配与回收

合集下载

实验报告二主存空间的分配和回收

实验报告二主存空间的分配和回收
temp=freeTab; /*寻找空闲表中对应登记项*/
if(strcmp(PName,"OS")==0)
{ printf("ERROR!");
return;
}
while((strcmp(temp->proID,PName)!=0||temp->flag==1)&&temp)
temp=temp->next;
四、程序中使用的数据结构及符号说明
结构1:
typedef struct freeTable
{
char proID[6];
int startAddr; /*空闲区起始地址*/
int length; /*空闲区长度,单位为字节*/
int flag; /*空闲区表登记栏标志,用"0"表示空表项,用"1"表示未分配*/
freeNode=freeNode->next;
}
getchar();
break;
default:printf("没有该选项\n");
}/*case*/
}/*while*/
}/*main()*/
六、运行调试结果
初始界面:
分配主存,五个作业名:P1、P2、P3、P4、P5
显示主存使用情况:
回收主存P2:
if(front->flag==1&&rear->flag==1)
/* 上邻空闲区,下邻空闲区,三项合并*/
{
front->length=front->length+rear->length+temp->length;

第四章 复习题 计算机操作系统概论复习资料习题答案

第四章 复习题  计算机操作系统概论复习资料习题答案

第四章复习题一、单项选择题1. 在可变分区存储管理中,若采用最先适应分配算法宜将空闲区按(B)次序登记在空闲区表中。

A. 地址递减B. 地址递增C. 长度递减D. 长度递增2. 采用固定分区存储管理的计算机系统中(D)的做法是错误的。

A. 为作业分配的分区不能小于作业长度B. 可同时在多个分区中各装一个作业C. 不允许多个作业同时存放在一个分区中D. 一个分区中可同时装入多个作业3. 不适宜采用虚拟存储管理技术的存储管理方式是(D)。

A. 页式B. 段式C. 段页式D. 可变分区4. 在多道程序设计系统中,采用了页式存储管理。

如果允许并行工作的道数为n(n>1),则系统中同时建立的页表数一定为(C)。

A. 1B. nC. <=nD. n+15. 在单用户连续存储管理中,可供用户使用的主存区域起始地址存放在(B)。

A. 基址寄存器B. 界限寄存器C. 限长寄存器D. 相联寄存器6. 重定位的含义是(C)。

A. 把主存中的一个程序从一个区域重新定位到另一个区域B. 把绝对地址转换成逻辑地址C. 把逻辑地址换砖成绝对地址D. 把辅助存储器中的程序定位到主存的某个区域7. 在分页式存储管理中,逻辑地址由页号和页内地址两部分组成。

因而,分页的工作是在(C)时进行的。

A. 用户编制程序B. 地址转换C. 操作系统装入作业D. 系统初始化8. 采用固定分区存储管理的计算机系统中(D)的做法是错误的。

A. 为作业分配的分区不能小于作业长度B. 可同时在多个分区中各装一个作业C. 不允许多个作业同时存放在一个分区中D. 一个分区中可同时装入多个作业9. 在分页式虚拟存储管理中,若发现所要访问的页面不在主存储器中,则硬件要产生一个(C)中断。

A. I/OB. 缺段C. 缺页D. 访管10. 主存储器的每个存储单元都有一个地址与其对应,假定这些地址用n个二进制位来区分,则主存储器的容量为(D)。

A. 2n个字B. 2n-1个字C. 2n-1个字节D. 2n个字节11. LRU页面调度算法总是选择(C)页面调出。

动态分区存储管理方式的主存分配回收总结

动态分区存储管理方式的主存分配回收总结

动态分区存储管理方式的主存分配回收总结动态分区存储管理是一种常见的主存分配回收技术,它通过动态创建并分配大小不等的存储块来管理主存空间,以满足不同进程的需求。

这种管理方式在操作系统中起着至关重要的作用,因此本文将对动态分区存储管理的主存分配回收进行总结,从原理、特点、优缺点及其在实际应用中的情况进行阐述。

一、原理动态分区存储管理是基于分区的主存管理机制,它将主存空间划分为多个不等大小的分区,每个分区可以被分配给一个进程使用。

当系统收到一个新进程的请求时,它会根据需要的主存大小为进程分配一个合适大小的分区。

当进程执行完毕,系统会回收该进程所占用的分区,使得该空间可以再次被分配给其他进程使用。

在动态分区存储管理中,主要有两种分配方式:首次适应算法和最佳适应算法。

首次适应算法是从第一个满足大小要求的分区开始进行分配;而最佳适应算法是从所有满足大小要求的分区中选择最小的分区进行分配。

这两种分配方式都有自己的优点和局限性,但它们都是基于动态分区存储管理的基本原理。

二、特点1.灵活性动态分区存储管理可以根据进程的需求动态地分配和回收主存空间,提高了主存的利用率和效率。

进程可以根据需要申请和释放主存空间,而无需预先分配固定大小的空间。

2.节省空间动态分区存储管理可以尽可能地利用主存中的碎片空间,减少了外部碎片的浪费。

这种管理方式能够充分利用主存空间,提高了主存的利用率。

3.多样性动态分区存储管理可以适应不同大小的进程需求,能够根据进程的大小灵活地进行分区分配,满足了不同进程的需求。

三、优缺点1.优点(1)提高了主存的利用率和效率。

(2)灵活地分配和回收主存空间,满足不同进程的需求。

(3)节省了主存空间,减少了碎片的浪费。

2.缺点(1)会产生外部碎片,影响了分区空间的利用率。

(2)分配和回收过程中可能产生较大的开销,影响了系统的性能。

四、在实际应用中的情况动态分区存储管理在操作系统中得到了广泛的应用,特别是在多道程序设计和实时系统中。

计算机操作系统作业3(含答案).

计算机操作系统作业3(含答案).

一、单项选择题1.联想存储器在计算机系统中是用于______的。

A.存储文件信息B.与主存交换信息C.内存地址变换D.内存管理信息2.作业在执行中发生了缺页中断,经操作系统处理后,应该执行的指令是______。

A.被中断的前一条B.被中断的后一条C.作业的第一条D.被中断的指令在请求分页存储管理中,当指令的执行所需要的内容不在内存中时,发生缺页中断,当缺页调入内存后,应执行被中断指令。

另:缺页中断作为中断与其它中断一样要经历如保护CPU环境,分析中断原因,转入缺页中断处理程序进行处理,恢复CPU环境等几个步骤,但缺页中断又是一种特殊的中断,它与一般中断相比,有着明显的区别,主要表现在下面两个方面:(1)缺页中断是在指令执行期间产生和处理中断信号的。

(2)一条指令的执行期间,可能产生多次缺页中断。

3.实现虚拟存储器的目的是______。

A.实现存储保护B.实现程序浮动C.扩充外存容量D.扩充内存容量4.在段页式存储系统中,一个作业对应______。

A.多个段表B.一个段表,一个页表C.一个段表,多个页表D.多个段表,多个页表5.在虚拟页式存储管理方案中,完成将页面调入内存的工作的是______。

A.缺页中断处理B.页面淘汰过程C.工作集模型应用D.紧缩技术利用6.采用分页式内存管理时,重定位的工作是由______完成的。

A.操作系统B.用户C.地址转换机构D.内存空间分配程序7.在分页式内存管理系统中可能出现的问题是______。

A.颠簸B.不能共享C.外部碎片D.动态链接8.在下列有关分页式内存管理的叙述中正确的是______。

A.程序和数据是在开始执行前一次性和装入的B.产生缺页中断一定要淘汰一个页面C.一个被淘汰的页面一定要写回外存D.在页面中有“访问位”和“修改位”等消息9. 在可变式分配方案中,最佳适应算法是将空白区在空白区表中按______次序排列。

A.地址递增B.地址递减C.容量递增D.容量递减10. 在可变分区分配方案中,将空白分区按地址递增次序排列是要采用______。

2022年西安外事学院计算机科学与技术专业《操作系统》科目期末试卷B(有答案)

2022年西安外事学院计算机科学与技术专业《操作系统》科目期末试卷B(有答案)

2022年西安外事学院计算机科学与技术专业《操作系统》科目期末试卷B(有答案)一、选择题1、现代操作系统中,文件系统都有效地解决了重名(即允许不同用户的文件可以具有相同的文件名)问题。

系统是通过()来实现这一功能的。

A.重名翻译结构B.建立索引表C.树形目录结构D.建立指针2、位示图可用于()A.实现文件的保护和保密B.文件目录的查找C.磁盘空间的管理D.主存空间的共享3、某系统中有11台打印机,N个进程共享打印机资源,每个进程要求3台打印机。

当N的取值不超过()时,系统不会发生死锁。

A.4B.5C.6D.74、使用TSL(TestandSetLock)指令实现进程互斥的伪代码如下所示。

do{while(TSL(&lock));criticalsection;lock=FALSE;}while(TRUE);下列与该实现机制相关的叙述中,正确的是()A.退出临界区的进程负责唤醒阻塞态进程B.等待进入临界区的进程不会主动放弃CPUC.上述伪代码满足“让权等待”的同步准则D.while(TSL(&lock))语句应在关中断状态下执行5、在个交通繁忙的十字路口,每个方向只有一个车道,如果车辆只能向前直行,而不允许转弯和后退,并未采用任何方式进行交通管理。

下列叙述正确的是()。

A.该十字路口不会发生死锁,B.该十字路口定会发生死锁C.该上字路口可能会发生死锁,规定同时最多3个方向的车使用该十字路是最有效的方法D.该十字路口可能会发生死锁,规定南北方向的两个车队和东西方向的两个车队互斥使用十字路口是最有效的方法6、适合多道程序运行的存储管理中,存储保护是为了()A.防止一个作业占用同个分区B.防止非法访问磁盘文件C.防止非法访问磁带文件D.防止各道作业相互干扰7、在下述存储管理方案中,()管理方式要求作业占用连续的存储空间。

A.分区B.分页C.分段D.段页式8、()不是操作系统的功能。

A.CPU管理B.存储管理C.网络管理D.数据管理9、执行系统调用的过程包括如下主要操作:①返回用户态②执行陷入(trap)指令③传递系统调用参数④执行相应的服务程序正确的执行顺序是()A.②->③->①->④B.②->④->③->①C.③->②->④->①D.③->④->②->①10、在采用SPOOLing技术的系统中,用户暂时未能打印的数据首先会被送到()存储起来。

存储管理

存储管理

第五章存储管理1存储管理的主要功能是什么?【解答】①主存的分配和回收存储管理的一个主要功能就是实现主存的分配和回收。

多个进程同时进入主存,怎样合理分配主存空间,哪些区域是已分配的,哪些区域未分配,按什么策略和算法进行分配使得主存空间得到充分利用。

当一个作业撤离或执行完后,系统必须收回它所占用的主存空间②地址变换用户在程序中使用的是逻辑地址,而处理器执行程序时是按物理地址访问主存,要把逻辑地址变换为物理地址,存储管理软件必须配合硬件进行地址转换工作,把逻辑地址转换成物理地址,以保证处理器的正确访问。

③存储共享内存共享的原因有两个:一是为了更有效地使用内存空间;二是为了实现两个协同工作的进程所共享的内存缓冲区。

使多个进程能动态地共享内存,以及多个进程可以共同使用同一软件,如编译程序,存放编译软件的内存即为共享内存区。

④“扩充”主存容量它借助于提供虚拟存贮器或其他自动覆盖技术,来达到“扩充”主存容量的目的。

即为用户提供比主存的存储空间还大的地址空间。

⑤存储保护保证各道作业都在自己所属的存储区内操作,必须保证它们之间不能相互干扰、相互冲突和相互破坏,特别要防止破坏系统程序。

为此,一般由硬件提供保护功能,软件配合实现。

2什么是地址重定位?动态重定位如何实现?【解答】为了保证作业的正确执行,必须根据分配给作业的主存区域对作业中指令和数据的存放地址进行重定位,即要把逻辑地址转换成绝对地址。

把逻辑地址转换成绝对地址的工作称“重定位”或“地址转换”。

重定位的方式可以有“静态重定位”和“动态重定位”两种。

动态重定位由软件和硬件相互配合来实现。

硬件要有一个地址转换机构,该机构可由一个基址寄存器和一个地址转换线路组成。

存储管理为作业分配主存区域后,装入程序把作业直接装到所分配的区域中并把该主存区域的起始地址存入相应作业进程的进程控制块中。

当作业进程被调度去占用处理器时,随同现场信息的恢复,作业所占的主存区域的起始地址也被存放到“基址寄存器”中。

操作系统实验指导书

操作系统实验指导书

操作系统实验指导书一、实验说明1、实验目的实验是操作系统原理课程中不可缺少的重要教学环节,实验目的是使学生理论联系实际,使学生在实践探索中去发现问题、去解决问题,提高了学生获取知识和应用技术的能力,培养了学生分析和解决问题的能力。

《操作系统原理》要求理论与实践相结合,本门实验课程是对《操作系统原理》课堂教学的一个重要补充,与理论学习起着相辅相成的作用,是实施《操作系统原理》教学的一个重要组成部分。

通过本实验课的实践学习,可以增强本专业的学生对系统实现的认识。

对加深理解和掌握操作系统相关原理有重要帮助。

2、实验要求进一步了解和掌握操作系统原理,提高系统设计的能力。

对每一实验题目,应独立完成,并要求:·上机前,学生必须做好充分的实验准备工作,掌握与实验相关的背景知识,用任一种高级语言编写程序。

·上机时,认真调试,并观察、记录程序运行过程中出现的现象和问题。

·上机后,分析实验结果并写出实验报告。

3、实验报告要求每个实验(包括选做的)均应编写实验报告,学生实验后要写出严谨的、实事求是的、文字通顺的、字迹公整的实验报告。

实验报告应包括以下内容:(1)实验题目(2)实验目的(3)实验内容●程序中使用的数据结构及符号说明●流程图●源程序清单并附上注释(4)实验结果及分析●运行结果(必须是上面程序清单所对应输出的结果)●对运行情况所作的分析以及本次调试程序所取得的经验。

如果程序未能通过,应分析其原因。

二、实验内容实验一熟悉使用计算机系统一、实验名称:熟悉使用计算机系统二、实验目的与要求通过对Windows操作系统的使用,熟悉Windows操作系统中的基本概念,如单用户、多任务、进程和文件等,熟悉Windows中命令行方式下常用命令的使用方法;进一步熟悉TC语言与开发环境,为以后的实验打好基础。

三、实验内容1.开机后,熟悉Windows的界面(桌面、任务栏、开始按钮<点击后出现“开始”菜单>、我的电脑图标、回收站、我的文档)。

linux主存空间分配与回收

linux主存空间分配与回收

在Linux操作系统中,主存空间(内存)的分配和回收是由内核管理的。

当应用程序或系统需要更多的内存时,它们会向内核请求,内核会根据可用内存的情况来分配内存。

同样,当应用程序或系统不再需要某块内存时,它们会将其释放给内核,内核会将其回收以供将来使用。

1. 内存分配:
在Linux中,当一个进程需要更多的内存时,它会调用`malloc()`或`alloc()`等函数。

这些函数会向内核发送请求,要求分配一块指定的内存大小。

内核会查看当前可用内存的情况,并根据需要分配一块内存。

内核分配内存的过程包括以下几个步骤:
* 找到可用的物理内存页框。

* 将页框标记为已分配状态。

* 更新内存管理数据结构。

* 将页框地址返回给进程。

2. 内存回收:
当一个进程不再需要某块内存时,它会调用`free()`或`release()`等函数来释放该内存。

这些函数会将该内存标记为未分配状态,并通知内核回收该内存。

内核回收内存的过程包括以下几个步骤:
* 标记该页框为未分配状态。

* 更新内存管理数据结构。

* 如果该页框中有数据,则将其写回到磁盘或其他存储设备中。

* 将该页框标记为可用状态,以供将来使用。

需要注意的是,Linux采用了先进的内存管理技术,如分页和段页式管理,以及虚拟内存技术等,使得内存的分配和回收更加高效和灵活。

同时,Linux还具有强大的内存监控和管理工具,如`top`、`htop`、`free`等,可以帮助管理员监控和管理系统的内存使用情况。

主存空间的分配与回收实验报告

主存空间的分配与回收实验报告

主存空间的分配与回收实验报告附录:源代码#include<stdio.h>#include<stdlib.h>#define OK 1 //完成#define ERROR 0 //出错typedef int Status;typedef struct free_table//定义一个空闲区说明表结构{int num; //分区序号long address; //起始地址long length; //分区大小int state; //分区状态}ElemType;typedef struct Node// 线性表的双向链表存储结构{ElemType data;struct Node *prior; //前趋指针struct Node *next; //后继指针}Node,*LinkList;LinkList first; //头结点LinkList end; //尾结点int flag;//记录要删除的分区序号Status Initblock()//开创带头结点的内存空间链表{first=(LinkList)malloc(sizeof(Node)); end=(LinkList)malloc(sizeof(Node)); first->prior=NULL;first->next=end;end->prior=first;end->next=NULL;end->data.num=1;end->data.address=40;end->data.length=600;end->data.state=0;return OK;}void sort()//分区序号重新排序{Node *p=first->next,*q;q=p->next;for(;p!=NULL;p=p->next){f or(q=p->next;q;q=q->next){if(p->data.num>=q->data.num){q->data.num+=1;}}}}//显示主存分配情况void show(){ int flag=0;//用来记录分区序号Node *p=first;p->data.num=0;p->data.address=0;p->data.length=40;p->data.state=1;sort();printf("\n\t\t》主存空间分配情况《\n");printf("********************************** ************************\n\n");printf("分区序号\t起始地址\t分区大小\t分区状态\n\n");while(p){printf("%d\t\t%d\t\t%d",p->data.num,p->data. address,p->data.length);if(p->data.state==0) printf("\t\t空闲\n\n");else printf("\t\t已分配\n\n");p=p->next;}printf("********************************** ************************\n\n");}//首次适应算法Status First_fit(int request){//为申请作业开辟新空间且初始化Node *p=first->next;LinkListtemp=(LinkList)malloc(sizeof(Node));temp->data.length=request;temp->data.state=1;p->data.num=1;while(p){if((p->data.state==0)&&(p->data.length==reque st)){//有大小恰好合适的空闲块p->data.state=1;return OK;break;}else if((p->data.state==0) && (p->data.length>request)){//有空闲块能满足需求且有剩余temp->prior=p->prior;temp->next=p;temp->data.address=p->data.address;temp->data.num=p->data.num;p->prior->next=temp;p->prior=temp;p->data.address=temp->data.address+temp->da ta.length;p->data.length-=request;p->data.num+=1;return OK;break;}p=p->next;}return ERROR;}//最佳适应算法Status Best_fit(int request){int ch; //记录最小剩余空间Node *p=first;Node *q=NULL; //记录最佳插入位置LinkListtemp=(LinkList)malloc(sizeof(Node));temp->data.length=request;temp->data.state=1;p->data.num=1;while(p) //初始化最小空间和最佳位置{if((p->data.state==0) && (p->data.length>=request) ){if(q==NULL){q=p;ch=p->data.length-request;}else if(q->data.length > p->data.length){q=p;ch=p->data.length-request;}}p=p->next;}if(q==NULL) return ERROR;//没有找到空闲块else if(q->data.length==request){q->data.state=1;return OK;}else{temp->prior=q->prior;temp->next=q;temp->data.address=q->data.address;temp->data.num=q->data.num;q->prior->next=temp;q->prior=temp;q->data.address+=request;q->data.length=ch;q->data.num+=1;return OK;}return OK;}//最差适应算法Status Worst_fit(int request){int ch; //记录最大剩余空间Node *p=first->next;Node *q=NULL; //记录最佳插入位置LinkListtemp=(LinkList)malloc(sizeof(Node));temp->data.length=request;temp->data.state=1;p->data.num=1;while(p) //初始化最大空间和最佳位置{if(p->data.state==0 && (p->data.length>=request) ){if(q==NULL){q=p;ch=p->data.length-request;}else if(q->data.length <p->data.length){q=p;ch=p->data.length-request;}}p=p->next;}if(q==NULL) return ERROR;//没有找到空闲块else if(q->data.length==request){q->data.length=1;return OK;}else{temp->prior=q->prior;temp->next=q;temp->data.address=q->data.address;temp->data.num=q->data.num;q->prior->next=temp;q->prior=temp;q->data.address+=request;q->data.length=ch;q->data.num+=1;return OK;}return OK;}//分配主存Status allocation(int a){int request;//申请内存大小printf("请输入申请分配的主存大小(单位:KB):");scanf("%d",&request);if(request<0 ||request==0){printf("分配大小不合适,请重试!");return ERROR;}switch(a)case 1: //默认首次适应算法if(First_fit(request)==OK)printf("\t****分配成功!****");else printf("\t****内存不足,分配失败!****");return OK;break;case 2: //选择最佳适应算法if(Best_fit(request)==OK)printf("\t****分配成功!****");else printf("\t****内存不足,分配失败!****");return OK;break;case 3: //选择最差适应算法if(Worst_fit(request)==OK) printf("\t****分配成功!****");else printf("\t****内存不足,分配失败!****");return OK;break;}Status deal1(Node *p)//处理回收空间{Node *q=first;for(;q!=NULL;q=q->next){if(q==p){if(q->prior->data.state==0&&q->next->data.s tate!=0){q->prior->data.length+=q->data.length;q->prior->next=q->next;q->next->prior=q->prior;q=q->prior;q->data.state=0;q->data.num=flag-1;}if(q->prior->data.state!=0&&q->next->data.stat e==0){q->data.length+=q->next->data.length;q->next=q->next->next;q->next->next->prior=q;q->data.state=0;q->data.num=flag;}if(q->prior->data.state==0&&q->next->data.sta te==0){q->prior->data.length+=q->data.length;q->prior->next=q->next;q->next->prior=q->prior;q=q->prior;q->data.state=0;q->data.num=flag-1;}if(q->prior->data.state!=0&&q->next->data.state!=0){q->data.state=0;}}}return OK;}Status deal2(Node *p)//处理回收空间{Node *q=first;for(;q!=NULL;q=q->next){if(q==p){if(q->prior->data.state==0&&q->next->data.s tate!=0){q->prior->data.length+=q->data.length;q->prior->next=q->next;q->next->prior=q->prior;q=p->prior;q->data.state=0;q->data.num=flag-1;}if(q->prior->data.state!=0&&q->next->data.stat e==0){q->data.state=0;}if(q->prior->data.state==0&&q->next->data.sta te==0){q->prior->data.length+=q->data.length;q->prior->next=q->next;q->next->prior=q->prior;q=q->prior;q->data.state=0;q->data.num=flag-1;}if(q->prior->data.state!=0&&q->next->data.stat e!=0){q->data.state=0;}}}return OK;}//主存回收Status recovery(int flag){Node *p=first;for(;p!=NULL;p=p->next){if(p->data.num==flag){if(p->prior==first){if(p->next!=end)//当前P指向的下一个不是最后一个时{if(p->next->data.state==0) //与后面的空闲块相连{p->data.length+=p->next->data.length;p->next->next->prior=p;p->next=p->next->next;p->data.state=0;p->data.num=flag;}else p->data.state=0;}if(p->next==end)//当前P指向的下一个是最后一个时{p->data.state=0;}}//结束if(p->prior==block_first)的情况else if(p->prior!=first){if(p->next!=end){deal1(p);}else{deal2(p);}}//结束if(p->prior!=block_first)的情况}//结束if(p->data.num==flag)的情况}printf("\t****回收成功****");return OK;}//主函数void main(){int i; //操作选择标记int a;//算法选择标记printf("**********************************************************\n");printf("\t\t用以下三种方法实现主存空间的分配\n");printf("\t(1)首次适应算法\t(2)最佳适应算法\t(3)最差适应算法\n");printf("******************************** **************************\n");printf("\n");printf("请输入所使用的内存分配算法:");scanf("%d",&a);while(a<1||a>3){printf("输入错误,请重新输入所使用的内存分配算法:\n");scanf("%d",&a);}switch(a){case 1:printf("\n\t****使用首次适应算法:****\n");break;case 2:printf("\n\t****使用最佳适应算法:****\n");break;case 3:printf("\n\t****使用最坏适应算法:****\n");break;}Initblock(); //开创空间表while(1){show();printf("\t1: 分配内存\t2: 回收内存\t0: 退出\n");printf("请输入您的操作:");scanf("%d",&i);if(i==1)allocation(a); // 分配内存else if(i==2) // 内存回收{printf("请输入您要释放的分区号:");scanf("%d",&flag);recovery(flag);}else if(i==0){printf("\n退出程序\n");break; //退出}else //输入操作有误{printf("输入有误,请重试!");continue;}}}。

2022年东北林业大学数据科学与大数据技术专业《操作系统》科目期末试卷B(有答案)

2022年东北林业大学数据科学与大数据技术专业《操作系统》科目期末试卷B(有答案)

2022年东北林业大学数据科学与大数据技术专业《操作系统》科目期末试卷B(有答案)一、选择题1、在下列选项中,()不属于操作系统提供给用户的可使用资源。

A.中断机制B.处理机C.存储器D.I/O设备2、中断处理和子程序调用都需要压栈以保护现场。

中断处理一定会保存而子程序调用不需要保存其内容的是()。

A.程序计数器B.程序状态字寄存器C.通用数据寄存器D.通用地址寄存器3、下面关于管程的叙述错误的是()。

A.管程是进程的同步工具,解决信号量机制大量同步操作分散的问题B.管程每次只允许一个进程进入管程,C.管程中V操作的作用和信号量机制中V操作的作用相同D.管程是被进程调用的,是语法范围,无法创建和撤销4、系统中有3个不同的临界资源R1,R2和R3,被4个进程pl,p2,p3 及p4共享。

各进程对资源的需求为:pl申请RI和R2,p2申请R2和R3,p3申请R1和R3,p4申请R2。

若系统出现死锁,则处于死锁状态的进程数至少是()。

A.1B.2C.3D.45、有两个并发执行的进程P1和P2,共享初值为1的变量x。

P1对x加1,P2对x减1。

加1操作和减1操作的指令序列分别如下所示://加1操作load R1,x ① //取x到寄存器R1中inc R1 ②store x, R1:③ //将R1的内容存入x//减1操作load R2,x ① //取x到寄存器R1中inc R2 ②store x, R2:③ //将R1的内容存入x两个操作完成后,x的值()。

A.可能为-1或3B.只能为1C.可能为0,1或2D.可能为-1,0,1或26、提高单机资源利用率的关键技术是()。

A.SPOOLing技术B.虚拟技术C.交换技术D.多道程序设计技术7、下列关于SPOOLing技术的叙述中,错误的是()A.需要外存的文持B.需要多道程序设计技术的支持C.可以让多个作业共享一台独占设备D.由用户作业控制设备与输入/输出之间的数据传送8、磁盘高速缓存设在()中。

可变分区分配与回收——采用最坏算法-操作系统课程设计

可变分区分配与回收——采用最坏算法-操作系统课程设计

哈尔滨理工大学课程设计(操作系统)题目:可变分区分配与回收—采用最坏算法班级:计算机科学与技术学院计算机系10-8班姓名:张兢 1004010813指导教师:高雪瑶系主任:林克正2013年03月01日一、课程设计目的1、背景主存是CPU可直接访问的信息空间,合理而有效的使用贮存将在很大程度上影响整个计算机系统的性能。

本课题要求模拟实现分区式主存管理机制。

模拟实现各种分区管理方法以及相应的主存分配以及回收算法。

2、目的通过该课题进一步加深对可变分区存储机制的理解。

加深对存储器动态分区分配算法的认识。

掌握“首次适应算法”、“下次适应算法”、“最佳适应算法发”、“最坏适应算法”的内存分配过程。

掌握内存的回收策略。

二、课题任务描述1、设计可用的内存空闲空间,并能动态输入用户作业所需的内存大小。

2、编程模拟各种分配算法的实施过程,允许自行选择如“首次适应算法”、“下次适应算法”、“最佳适应算法发”、“最坏适应算法”等常用算法,要求实现不少于三种算法。

3、实现内存的回收。

要求考虑回收时的内存合并问题。

三、课题研发相关知识(包含所用库函数的介绍)1、首次适应算法(first fit)FF算法要求空闲分区链以地址递增的次序链接。

在分配内存时,从链首开始顺序查找,直至找到一个大小能男足要求的空闲分区位置;然后再按照作业的大小,从该分区中划出一块内存空间分配给请求者,余下的空闲分区仍留在空闲链中。

若从链首直至链尾都不能找到一个能满足要求的分区,则此次内存分配失败,返回。

但是,低址部分不断被划分,会留下许多难以利用的很小的空闲分区。

2、最佳适应算法(best fit)所谓“最佳”是指每次为作业分配内存时,总是把能满足要求、又是最小的空闲分区分配给作业,避免“大材小用”。

为了加速寻找,该算法要求将所有的空闲分区按其容量以从小到大的顺序形成一空闲分区链。

这样,第一次找到的能满足要求的空闲区,必然是最佳的。

这样,在存储器中会留下许多难以利用的小空闲区。

主存空间的分配与及回收实验报告

主存空间的分配与及回收实验报告

主存空间的分配与及回收实验报告一、实验目的:1.了解主存空间的分配与回收的基本原理;2.掌握主存空间分配与回收的常用算法;3.学会利用实验方法验证主存空间分配与回收的效果。

二、实验原理:1.主存空间的分配:静态分配是指在程序编译时,为程序分配固定大小的存储空间。

这种分配方式的缺点是无法适应不同大小的程序需求,造成了存储空间的浪费。

动态分配是指在程序运行时,根据需要动态分配存储空间。

常见的动态分配方式有两种:堆和栈。

堆是由程序员自行分配和释放的,栈是由系统自动分配和释放的。

动态分配的优点是能够根据需要分配合适的存储空间,减少了空间的浪费。

2.主存空间的回收:常见的回收方式有两种:手动回收和自动回收。

手动回收是指由程序员手动释放不再需要的存储空间。

这种回收方式的优点是能够具体控制存储空间的回收时间,但缺点是容易出现程序员忘记手动回收的情况,导致存储空间的浪费。

自动回收是指由系统自动回收不再需要的存储空间。

系统根据程序的运行情况自动判断哪些存储空间可以回收,并进行回收操作。

自动回收的优点是减少了程序员的工作量,保证存储空间的合理利用,但缺点是可能会出现不准确的判断,导致存储空间的泄漏。

三、实验步骤:本实验以C语言为例,通过编写一个简单的程序,模拟主存空间的分配与回收过程。

1.编写程序代码:#include <stdio.h>#include <stdlib.h>int maiint *p;p = (int *)malloc(sizeof(int) * 10);if (p == NULL)printf("内存分配失败!\n");exit(1);}int i;for (i = 0; i < 10; i++)p[i]=i*10;}for (i = 0; i < 10; i++)printf("%d ", p[i]);}printf("\n");free(p);return 0;2.编译并运行程序:在命令行中输入以下命令,编译并运行程序:gcc -o memory_allocation memory_allocation.c./memory_allocation3.实验结果分析:程序运行后,首先使用malloc函数分配了一块大小为sizeof(int)* 10的存储空间,用于存储10个整数。

2022年华北电力大学(北京)计算机科学与技术专业《操作系统》科目期末试卷B(有答案)

2022年华北电力大学(北京)计算机科学与技术专业《操作系统》科目期末试卷B(有答案)

2022年华北电力大学(北京)计算机科学与技术专业《操作系统》科目期末试卷B(有答案)一、选择题1、如果当前读写磁头正在53号柱面上执行操作,依次有4个等待访问的请求,柱面号,依次为98,37,124,65,当采用()算法时,下一次磁头才可能到达37号柱面。

A.先来先服务B.最短寻道时间优先C.电梯调度(初始磁头移动方向向着小磁道方向)D.循环扫描(磁头移动方向向着大磁道方向)2、如果文件采用直接存取方法,且文件大小不固定,则应采用()物理结构。

A.直接B.索引C.随机D.顺序3、下面关于管程的叙述错误的是()。

A.管程是进程的同步工具,解决信号量机制大量同步操作分散的问题B.管程每次只允许一个进程进入管程,C.管程中V操作的作用和信号量机制中V操作的作用相同D.管程是被进程调用的,是语法范围,无法创建和撤销4、与单道程序相比,多道程序系统的优点是()I.CPU 利用率高II.系统开销小III.系统吞吐量大IV. I/O设备利用率高A.仅I、IIIB.仅I、IVC. 仅II、IIID.仅I、III,IV5、进程资源静态分配方式是指一个进程在建立时就分配了它需要的全部资源,只有该进程所要资源都得到满足的条件下,进程才开始运行。

这样可以防止进程死锁。

静态分配方式破坏死锁的()为必要条件。

A.互斥条件B.请求和保持条件(占有并等待条件)C.非剥夺式等待条件D.循环等待条件6、在分页虚拟存储管理中,“二次机会”调度策略和“时钟”调度策略在决定淘汰哪一页时,都用到了()。

A.虚实地址变换机构B.快表C.引用位D.修改位7、在可变分区分配管理中,某一作业完成后,系统收回其内存空间,并与相邻区合并,为此修改空闲区说明表,造成空闲分区数减1的情况是()。

A.无上邻空闲分区,也无下邻空闲分区B.有上邻空闲分区,但无下邻空闲分区C.无上邻空闲分区,但有下邻空闲分区D.有上邻空闲分区,也有下邻空闲分区8、下面叙述中,错误的是()A.操作系统既能进行多任务处理,又能进行多重处理B.多重处理是多任务处理的子集,C.多任务是指同一时间内在同一系统中同时运行多个进程D.一个CPU的计算机上也可以进行多重处理9、下列选项中,在用户态执行的是()。

简述内存空间的分配和回收的含义与处理方法。

简述内存空间的分配和回收的含义与处理方法。

内存空间的分配和回收是操作系统存储管理的重要功能。

内存空间的分配是指将内存空间分配给进程或程序的过程。

在分配内存空间时,操作系统需要确定申请者的需求,并根据一定的策略和规则找出足够的空间进行分配。

这些策略和规则可以包括按需分配、最先适应、最佳适应和最坏适应等。

内存空间的回收则是指当进程或程序结束运行时,操作系统需要将其所占用的内存空间收回,以便重新分配给其他进程或程序使用。

回收内存空间时,操作系统需要进行一系列操作,例如将回收的内存空间标记为空闲区域,以便后续的分配使用。

对于内存空间的分配和回收,操作系统通常会设置一张表格来记录内存的使用情况,包括哪些区域尚未分配,哪些区域已经分配以及分配给哪些进程等。

这样,系统可以根据申请者的要求和表格记录的信息,快速有效地进行内存空间的分配和回收。

以上信息仅供参考,如有需要,建议查阅相关书籍或咨询专业人士。

存储管理练习题一(带答案)

存储管理练习题一(带答案)

存储管理练习题一一、单项选择题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.地址转换和存储保护因作业存放区域不会改变,可采用静态重定位方式把作业装入所在的分区号,且把该分区的下限地址和上限地址分别送入下限寄存器和上限寄存器中。

作业4——精选推荐

作业4——精选推荐

作业41、存储管理的主要功能是什么?答:(1)主存的分配和管理:按⽤户要求将适当的存储空间进⾏分配。

在⽤户请求时能做出快速的响应,分配相应的存储空间;在⽤户不再使⽤时,应⽴即回收。

①记住存储区域的状态;②实施分配;③接受系统或⽤户释放的存储区域,并修改分配表;(2)地址变换:可执⾏⽂件⽣成中的链接技术,程序加载时及再次换⼊系统时的重定位技术,进程运⾏时硬件和软件的地址变换技术和机构;(3)存储的共享和保护:代码与数据的共享及访问权限的控制;(4)存储扩充:虚存(系统)或覆盖(⽤户)完成。

2、什么是虚拟存储器,其特点是什么?答:虚拟存储器:操作系统为⽤户提供的能够⾃⼰编程的地址空间就是虚拟存储器。

特点:(1)有相当容量的辅存来存放所有并发作业的地址空间;(2)有⼀定量的主存,⾜够现有程序运⾏;(3)有地址变换机构。

3、实现地址重定位的⽅法有哪⼏类?形式化地描述动态重定位过程。

答:分类:静态重定位和动态重定位(1)静态地址重定位是在虚空间程序执⾏之前由装配程序完成地址映射⼯作。

静态重定位的优点是不需要硬件⽀持,但是⽤静态地址重定位⽅法进⾏地址变换⽆法实现虚拟存储器。

静态重定位的另⼀个缺点是必须占⽤连续的内存空间和难以做到程序和数据的共享。

(2)动态地址重定位是在程序执⾏过程中,在CPU访问内存之前由硬件地址变换机构将要访问的程序或数据地址转换成内存地址。

动态地址重定位的主要优点有:①可以对内存进⾏⾮连续分配。

②动态重定位提供了实现虚拟存储器的基础。

③动态重定位有利于程序段的共享。

过程:程序的⽬标模块装⼊内存时,与地址有关的各项均保持原来的相对地址不进⾏任何修改。

如MOV1,[500]这条指令仍是相对地址500。

当此模块被操作系统调度到处理机上执⾏时,操作系统将把此模块装⼊的实际起始起始地址减去⽬标模块的相对基地址,然后将其差值装⼊定位寄存器中。

当CPU取得⼀条访问内存的指令时,地址变换硬件逻辑⾃动将指令中的相对地址与定位寄存器中的值相加,再依此和值作为内存绝对地址去访问该单元中的数据。

第4章内存管理作业题参考答案

第4章内存管理作业题参考答案

第4章内存管理作业题作业题题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什么是动态重定位? 它有什么特点?(见教材)题7某操作系统采用分区存储管理技术。

操作系统在低地址占用了100KB的空间,用户区主存从100KB处开始占用512KB。

开始时,用户区全部空闲,分配时截取空闲分区的低地址部分作为已分配区。

在执行申请、释放操作序列后,请求300KB、请求100KB、释放300KB、请求150KB、请求50KB、请求90KB,请回答以下问题。

(1)若采用首次适应分配算法此时主存中有哪些空闲分区?请求300k;地址块100~399被占用;地址块400~612空闲。

请求100k;地址块100~399、400~499被占用;地址块500~612空闲。

请求300k;地址块400~499被占用;地址块100~399、500~612空闲。

请求150k;地址块100~249、400~499被占用;地址块250~399、500~612空闲。

请求50k;地址块100~249、250~299、400~499被占用;地址块300~399、500~612空闲。

请求90k;地址块100~249、250~300、300~389、400~499被占用;地址块390~399、500~612.产生空闲块两个,块1,首地址390,块大小为10kb;块2,首地址500,块大小为112kb。

2022年中国农业大学计算机科学与技术专业《操作系统》科目期末试卷B(有答案)

2022年中国农业大学计算机科学与技术专业《操作系统》科目期末试卷B(有答案)

2022年中国农业大学计算机科学与技术专业《操作系统》科目期末试卷B(有答案)一、选择题1、现有一个容量为10GB的磁盘分区,磁盘空间以簇(Cluster)为单,位进行分配,簇的大小为4KB,若采用位图法管理该分区的空闲空问,即用.位(bit)标识一个簇是否被分配,则存放该位图所需簇的个数为()A.80B.320C.80KD.320K2、某文件系统中,针对每个文件,用户类别分为4类:安全管理员、文件上、文件主的伙伴、其他用户:访问权限分为5类:完全控制、执行、修改、读取、写入。

若文件控制块中用:进制位串表示文件权限,为表示不同类别用户对一个文件的访问权限,则描述文件权限的位数至少应为()。

A.5B.9C.12D.203、可以被多个进程在任意时刻共享的代码必须是()。

A.顺序代码B.机器语言代码C.不能自身修改的代码D.无转移指令代码4、要实现两个进程互斥,设一个互斥信号量mutex.当mutex为0时,表示()。

A.没有进程进入临界区B.有一个进程进入临界区C.有一个进程进入临界区,另外一个进程在等候D.两个进程都进入临界区5、有3个作业J1,J2,J3,其运行时间分别为2h,5h,3h,假定同时到达,并在同…台处理器上以单道方式运行,则平均周转时间最短的执行序列是()。

A.J1,J2,J3B.J3,J2,J1C.J2,J1,J3D.J1,J3,J26、设有一页式存储管理系统,向用户提供的逻辑地址空间最大为16页,每页2048B,内存总共有8个存储块,试问逻辑地址至少为多少位?内存空间有多大()?A.逻辑地址至少为12位,内存空间有32KBB.逻辑地址至少为12位,内存空间有16KBC.逻辑地址至少为15位,内存空间有32KBD.逻辑地址至少为15位,内存空间有16KB7、要保证一个程序在主存中被改变了存放位置后仍能正确地执行,则对主存空间应采用()技术。

A.静态重定位B.动态重定位C.动态分配D.静态分配8、下列关于批处理系统的叙述中,正确的是()I.批处理系统允许多个用户与计算机直接交互II.批处理系统分为单道批处理系统和多道批处理系统III.中断技术使得多道批处理系统的1/O设备可与CPU并行工作A.仅II、IIIB.仅IIC.仅I、IID. 仅I、III9、若程序正在试图读取某个磁盘的第100个逻辑块,使用操作系统提供的()接门。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

新建云桂铁路操作系统实验报告实验三:主存空间的分配与回收一、实验题目采用可变式分区管理,使用首次或最佳适应算法实现主存的分配与回收二、实验内容主存是中央处理机能直接存取指令和数据的存储器。

能否合理而有效地使用主存,在很大程度上将影响到整个计算机系统的性能。

本实验采用可变式分区管理,使用首次或最佳适应算法实现主存空间的分配与回收。

要求采用分区说明表进行。

三、实验目的通过本次实验,帮助学生理解在可变式分区管理方式下,如何实现主存空间的分配与回收。

提示:(1)可变式分区管理是指在处理作业过程中建立分区,使分区大小正好适合作业的需要,并且分区个数是可以调整的。

当要装入一个作业时,根据作业需要的主存量,查看是否有足够的空闲空间,若有,则按需求量分割一部分给作业;若无,则作业等待。

随着作业的装入、完成,主存空间被分割成许多大大小小的分区。

有的分区被作业占用,有的分区空闲。

例如,某时刻主存空间占用情况如图1所示。

表1 空闲区说明表10K20K45K65K110K256K所示。

其中,起始地址指出各空闲区的主存起始地址,长度指出空闲区大小。

状态栏未分配指该栏目是记录的有效空闲区,空表目指没有登记信息。

由于分区个数不定,所以空闲区说明表中应有足够的空表目项,否则造成溢出,无法登记。

同样,再设一个已分配区表,记录作业或进城的主存占用情况。

(2)当有一个新作业要求装入主存时,必须查空闲区说明表,从中找出一个足够大的空闲区。

有时找到的空闲区可能大于作业需求量,这时应该将空闲区一分为二。

一个分给作业,另一个仍作为空闲区留在空闲区表中。

为了尽量减少由于分割造成的碎片,尽可能分配低地址部分的空闲区,将较大空闲区留在高地址端,以利于大作业的装入。

为此在空闲区表中,按空闲区首地址从低到高进行登记。

为了便于快速查找,要不断地对表格进行紧缩,即让“空表目”项留在表的后部。

其分配框图如图2所示。

Array图2 首次适应算法分配框图(3)当一个作业执行完时,作业所占用的分区应归还给系统。

在归还时要考虑相邻空闲区合并的问题。

作业的释放区与空闲区的邻接分一下4种情况考虑:A.释放区下邻(低地址邻接)空闲区;B.释放区上邻(高地址邻接)空闲区;C.释放区上下都与空闲区邻接;D.释放区与空闲区不邻接。

首次适应算法回收框图如图3所示。

图3 首次适应算法回收框图若采用最佳适应算法,则空闲区说明表中的空闲区按其大小排序。

有关最佳适应算法的分配和回收框图由学生自己给出。

(4)请按首次(或最佳)适应算法设计主存分配和回收程序。

以图1作为主存当前使用的基础,初始化空闲区和已分配区说明表的值。

学生自己设计一个作业申请队列以及作业完成后的释放顺序,实现主存的分配与回收。

把空闲区说明表的变化情况以及各作业的申请、释放情况显示或打印出来。

为了说明哪些分区是空闲的,必须要有一张空闲区说明表,格式如下表所示:四、代码及运行结果分析Main.javapackage Exp4;import java.util.ArrayList;import java.util.Scanner;public class Main {static Scanner scanner = new Scanner(System.in);static ArrayList<FreeBlock> blockList = new ArrayList<FreeBlock>();static int application;static int adr;static int size;public static void main(String[] args) {initalize();}public static void initalize() {// 将整个存储区作为freeBlock初始化并显示信息FreeBlock freeBlock = new FreeBlock(0, 32767);blockList.add(freeBlock);printAll();print("Please input the way (1-best,2-first):");int way = scanner.nextInt();if (way == 1) {bestClass(); //最佳适应算法} else if (way == 2) {firstClass(); //首次适应算法} else {print("Error!\n");}}public static void bestClass() {int type = getRequest();if (type == 1) {assign(1, application);} else if (type == 2) {accept(adr, size);} else {print("Error!\n");}bestClass();}public static void firstClass() { int type = getRequest();if (type == 1) {assign(2, application);} else if (type == 2) {accept(adr, size);} else {print("Error!\n");}firstClass();}public static void printAll() {print("adr\tend\tsize\n");print("----------------------------\n");for (FreeBlock block : blockList) {block.printME();}}public static int getRequest() {print("Assign or Accept (1-Assign,2-Accept):");int type = scanner.nextInt();if (type == 1) {print("input Application:");application = scanner.nextInt();} else if (type == 2) {print("input adr and size:");adr = scanner.nextInt();size = scanner.nextInt();} else {print("Error!\n");}return type;}public static boolean assign(int p_way, int p_application) { // 判断是否有空闲区if (blockList.isEmpty()) {print("没有任何空闲区域可供分配!\n");return false;}// 按各自的原则查找空闲区if (p_way == 1) {// bestint minSize = 32767;int minIndex = -1;for (FreeBlock block : blockList) {if (block.getSize() <= minSize&& block.getSize() >= p_application) {minSize = block.getSize();minIndex = blockList.indexOf(block);}}if (minIndex == -1) {print("没有符合要求的空闲区域!\n");return false;} else {FreeBlock tempBlock1 = blockList.get(minIndex);if (tempBlock1.getSize() == p_application) {blockList.remove(tempBlock1);printAll();return true;}FreeBlock tempBlock2 = new FreeBlock(tempBlock1.getAdr(),tempBlock1.getSize() - p_application);blockList.set(minIndex, tempBlock2);printAll();return true;}} else if (p_way == 2) {// firstint minAdr = 32766;int minIndex = -1;for (FreeBlock block : blockList) {if (block.getAdr() <= minAdr&& block.getSize() >= p_application) {minAdr = block.getSize();minIndex = blockList.indexOf(block);}}if (minIndex == -1) {print("没有符合要求的空闲区域!\n");return false;} else {FreeBlock tempBlock1 = blockList.get(minIndex);if (tempBlock1.getSize() == p_application) {blockList.remove(tempBlock1);printAll();return true;}FreeBlock tempBlock2 = new FreeBlock(tempBlock1.getAdr(),tempBlock1.getSize() - p_application);blockList.set(minIndex, tempBlock2);printAll();return true;}} else {print("Error!\n");return false;}}public static boolean accept(int p_adr, int p_size) {int p_end = adr + size - 1;// 检查:首地址小于最小地址(0)if (p_adr < 0) {print("错误:首地址小于最小地址(0)!\n");return false;}// 检查:回收空间大于最大空间(32766)if (p_end > 32766) {print("错误:回收空间大于最大空间(32766)!\n");return false;}// 检查:回收空间和空闲空间重叠for (FreeBlock block : blockList) {if (p_adr >= block.getAdr() && p_adr <= block.getEnd()) {print("错误:回收空间和空闲空间重叠!\n");return false;}if (p_end >= block.getAdr() && p_end <= block.getEnd()) {print("错误:回收空间和空闲空间重叠!\n");return false;}}// 检查:前有接续for (FreeBlock block : blockList) {if (p_adr - 1 == block.getEnd()) {block.setSize(block.getSize() + p_size);// 在前有接续的基础上,检查:后有接续for (FreeBlock block2 : blockList) {if (block.getEnd() + 1 == block2.getAdr()) {block.setSize(block.getSize() + block2.getSize());blockList.remove(block2);printAll();return true;}}printAll();return true;}}// 检查:后有接续(前肯定没有接续)for (FreeBlock block : blockList) {if (p_end + 1 == block.getAdr()) {block.setAdr(p_adr);block.setSize(block.getSize() + p_size);printAll();return true;}}// 前后均无接续FreeBlock freeBlock = new FreeBlock(p_adr, p_size); blockList.add(freeBlock);printAll();return true;}public static void print(String printString) {System.out.print(printString);}}FreeBlock.javapackage Exp4;public class FreeBlock {private int adr;private int size;public FreeBlock(int p_adr, int p_size) {adr = p_adr;size = p_size;}public void printME() {System.out.println(this.getAdr() + "\t" + this.getEnd() + "\t"+ this.getSize());System.out.println("----------------------------"); }public int getEnd() {if (size > 0) {return adr + size - 1;} else {return 0;}}public int getAdr() {return adr;}public void setAdr(int adr) {this.adr = adr;}public int getSize() {return size;}public void setSize(int size) {this.size = size;}}最佳适应算法结果首次适应算法结果五、心得体会经过这次实验,对可变式分区管理方式下,如何实现主存空间的分配与回收,有了很深的了解,使用了两种不同的算法,来实现对主存空间的控制,两种算法使用的数据结构相同,只是在分配的时候有差异。

相关文档
最新文档