《2022年操作系统首次最佳适应算法 .pdf》由会员分享,可在线阅读,更多相关《2022年操作系统首次最佳适应算法 .pdf(5页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、学 号专 业姓 名实验日期教师签字成 绩实验报告【实验名称】采用可变式分区管理,使用首次获最佳适应算法实现内存分配与回收【实验目的与原理】1、理解首次获最佳适应算法的内涵,并熟练掌握该算法。2、学会可变式分区管理的原理是即在处理作业过程中建立分区,使分区大小正好适合作业的需要,并且分区个数是可以调整的。3、当有一个新作业要求装入主存时,必须查空闲区说明表,从中找出一个足够大的空闲区没有时应将空闲区一分为二。为了便于快速查找,要不断地对表格进行紧缩,即让“空表目”项留在表的后部。4、当一个作业执行完成时,作业所占用的分区应归还给系统。作业的释放区与空闲区的邻接分以下四种情况考虑:释放区下邻(低地
2、址邻接)空闲区;释放区上邻(高地址邻接)空闲区 释放区上下都与空闲区邻接;释放区与空闲区不邻接。名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 5 页 -【实验内容】#include#include#include using namespace std;const int MAXJOB=100;/定义表最大记录数typedef struct node int front;int length;char data20;job;job freesMAXJOB;/定义空闲区表int free_quantity;job occupysMAXJOB;/定义已分配区表int occupy_
3、quantity;/初始化函数void initial()int i;for(i=0;iMAXJOB;i+)freesi.front=-1;freesi.length=0;strcpy(freesi.data,free);occupysi.front=-1;occupysi.length=0;strcpy(occupysi.data,);free_quantity=0;occupy_quantity=0;/创建空闲分区表int creatfree()FILE*fp;char fname20;coutfname;if(fp=fopen(fname,r)=NULL)cout 错 误,文 件 打 不
4、 开,请 检 查 文 件 名endl;else while(!feof(fp)fscanf(fp,%dt%dn,&freesfree_quantity.front,&freesfree_quantity.length);free_quantity+;cout 空闲的分区表已建立!n;return 1;return 0;void sort()/将 free 空间安首地址从小到大的顺序排列 int i,j,p;for(i=0;ifree_quantity-1;i+)p=i;for(j=i+1;jfree_quantity;j+)if(freesj.frontfreesp.front)p=j;if(
5、p!=i)freesfree_quantity=freesi;freesi=freesp;freesp=freesfree_quantity;/显示函数void show()int i;coutendl-名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 5 页 -endl;cout当前空闲表:endl;cout 起始地址长度状态endl;for(i=0;ifree_quantity;i+)cout.setf(2);cout.width(12);coutfreesi.front;cout.width(10);coutfreesi.length;cout.width(8);coutfr
6、eesi.dataendl;coutendl-endl;cout当前已分配表:endl;cout 起始地址长度占用作业名endl;for(i=0;ioccupy_quantity;i+)cout.setf(2);cout.width(12);coutoccupysi.front;cout.width(10);coutoccupysi.length;cout.width(8);coutoccupysi.dataendl;coutendl-endl;/最先适应分配算法void assign()char job_name20;int job_length;int i,j,flag,t;coutjob
7、_name;cinjob_length;flag=0;for(i=0;i=job_length)/如果空闲空间 I 的长度作业长度 flag=1;/空闲标志位就置1 if(flag=0)coutendl对不起,当前没有能满足你申请长度的空闲内存,请稍候再试!=job_length)t=1;i+;/如果空闲空间I 的长度不大于作业长度,I 加一,判断下一个空间 i-;occupysoccupy_quantity.front=freesi.front;strcpy(occupysoccupy_quantity.data,job_name);occupysoccupy_quantity.length
8、=job_length;occupy_quantity+;if(freesi.lengthjob_length)/如 果 空间的长度大于作业的长度,freesi.front+=job_length;freesi.length-=job_length;else for(j=i;jfree_quantity-1;j+)名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 5 页 -freesj=freesj+1;free_quantity-;cout 内存空间成功:)endl;/撤消作业void cancel()char job_name20;int i,j,flag,p=0;int fr
9、ont;int length;coutjob_name;flag=-1;for(i=0;ioccupy_quantity;i+)if(!strcmp(occupysi.data,job_name)/当输入作业名匹配时 flag=i;front=occupysi.front;length=occupysi.length;if(flag=-1)cout 没有这个作业名endl;else /加入空闲表for(i=0;ifree_quantity;i+)if(freesi.front+freesi.length)=front)/上空 if(i+1)free_quantity)&(freesi+1.fr
10、ont=front+length)/下空 freesi.length=freesi.length+freesi+1.length+length;for(j=i+1;jfree_quantity;j+)freesj=freesj+1;free_quantity-;p=1;else freesi.length+=length;p=1;if(freesi.front=(front+length)/下空上不空 freesi.front=front;freesi.length+=length;/第 i个 空 闲 区 间 的 长 度=第i个空 闲 区 间 的 长 度+length p=1;if(p=0)/
11、上下空闲区都不空 freesfree_quantity.front=front;freesfree_quantity.length=length;free_quantity+;/删除分配表中的该作业for(i=flag;ioccupy_quantity;i+)occupysi=occupysi+1;occupy_quantity-;void main()名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 5 页 -int flag=0;int t=1;int chioce=0;cout*xxxxxxxxx*n;initial();flag=creatfree();while(flag
12、=1)sort();cout 可变分区存储管理模拟系统 endl;cout 1.申请空间 endl;cout 2.撤消作业 endl;cout 3.显 示 空 闲 表 和 分 配 表endl;cout 0.退出 endl;coutchioce;switch(chioce)case 1:assign();break;case 2:cancel();break;case 3:show();break;case 0:flag=0;break;default:cout 选择错误!endl;实验结果显示:【实验小结】本实验难度在两个方面,一是首次最佳适应算法assign(),这里我用的是结构体数组来存储空闲分区;二是对已分配分区的释放,这里同样采取结构体数组来存储已分配分区,用cancle()函数来实现。为了更好的实现分配和释放功能,我用sort()函数对空闲分区进行了排序。另外我还用了文件操作来读取空闲分区表,即文件D:1.txt,以对文件操作复习,颇有收获。名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 5 页 -