操作系统实验四主存空间的分配及回收首次适应算法和循环首次适应算法Word格式.docx
- 文档编号:16736585
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:16
- 大小:329.82KB
操作系统实验四主存空间的分配及回收首次适应算法和循环首次适应算法Word格式.docx
《操作系统实验四主存空间的分配及回收首次适应算法和循环首次适应算法Word格式.docx》由会员分享,可在线阅读,更多相关《操作系统实验四主存空间的分配及回收首次适应算法和循环首次适应算法Word格式.docx(16页珍藏版)》请在冰豆网上搜索。
intProgressState=0;
//进程状态
};
typedefstructFREE//空闲区结构体
intFree_num;
//空闲区名称
//空闲区开始地址
intEndaddress;
//空闲区结束地址
intFree_Space;
//空闲区大小
算法流程图:
首次适应算法
循环首次适应算法
程序代码及截图:
#include<
stdio.h>
string.h>
#include<
stdlib.h>
io.h>
#defineN1024
intcount=0;
//当前存中进程个数
boolROM[N];
//设置存块
intp=0;
//循环首次使用需要标记当前的空闲区块
FREEFREE[100];
//设置空闲区数组为100个
intFREE_counter=0;
//空闲区的个数
PCBnum[20];
//作业队列
voidinit()//初始化操作
for(inti=0;
i<
N;
i++)
ROM[i]=0;
}
voidshowProgress(PCB&
a)
printf("
----------------------------------------------------------------------\n"
);
进程名\t\t开始地址\t\t大小\t\t结束地址\n"
//输出存信息
count-1;
for(intj=i;
j<
j++)
if(num[j].Startaddress>
num[j+1].Startaddress)
{
a=num[j];
num[j]=num[j+1];
num[j+1]=a;
}
count;
if(num[i].ProgressState!
=0)
%s\t\t%d\t\t\t%d\t\t%d\t\t\n"
num[i].ProgressName,num[i].Startaddress,num[i].ProgressSize,num[i].ProgressSize+num[i].Startaddress-1);
voidshowFree()//打印空闲区的情况
空闲区名\t|开始地址\t|大小\t|结束地址\n"
for(inti=1;
=FREE_counter;
\t%1d\t%8d\t%11d\t%d\n"
FREE[i].Free_num,FREE[i].Startaddress,FREE[i].Free_Space,FREE[i].Endaddress);
voidfind_FREE()//寻找空闲区
inti,j,p;
//计数值
FREE_counter=0;
//预设空闲区数为0
for(i=0;
i<
N;
if(ROM[i]==0)
p=i;
for(j=i;
j<
if(ROM[j]==0)//未找到空闲区,则将j赋值给i后继续循环
i=j;
continue;
if(ROM[j]==1)//找到空闲区
FREE_counter++;
//空闲区个数+1;
FREE[FREE_counter].Free_num=FREE_counter;
//设置空闲区编号
FREE[FREE_counter].Startaddress=p;
FREE[FREE_counter].Endaddress=j-1;
FREE[FREE_counter].Free_Space=j-p;
i=j+1;
break;
if(j==N&
&
ROM[j-1]==0)//对最后一个存进行特殊操作
FREE[FREE_counter].Free_num=FREE_counter;
//对空闲区进行处理
FREE[FREE_counter].Startaddress=p;
FREE[FREE_counter].Endaddress=j-1;
FREE[FREE_counter].Free_Space=j-p;
voidFirst_Fit(PCB&
a)//首次适应算法
inti,j,k;
for(i=0;
if(ROM[i]==0)
for(j=i;
=(i+a.ProgressSize)&
j<
j++)//查询第一个空闲区,并判断是否适合插入作业
if(ROM[j]==1)
i=j+1;
if(j==i+a.ProgressSize+1)
a.Startaddress=i;
//设置作业的开始地址
a.ProgressState=1;
//标记作业在存中
for(k=i;
k<
i+a.ProgressSize&
k++)
ROM[k]=1;
进程%s插入成功,进程%s的初始地址为%d,结束地址为%d\n"
a.ProgressName,a.ProgressName,a.Startaddress,a.Startaddress+a.ProgressSize-1);
return;
if(i==N)//未查询到合适的区域
插入失败,无可用空间!
\n"
voidNext_Fit(PCB&
a)//循环首次适应算法来实现作业调度
for(i=p;
i++)//从所标记的当前区域开始查询,查询到末存
i=j+1;
if(j==i+a.ProgressSize+1)//找到合适的空闲区
a.Startaddress=i;
a.ProgressState=1;
插入成功,进程%s的初始地址为%d,结束地址为%d\n"
a.ProgressName,a.Startaddress,a.Startaddress+a.ProgressSize-1);
p=i+a.ProgressSize;
p;
i++)//当未找到时,从第一个空闲区开始查询,结束条件为小于所标记的P
if(j==i+a.ProgressSize+1)//成功找到结束,并标记当前P为现在的作业的尾部
插入成功,进程%s的初始地址为%d\n"
a.ProgressName,a.Startaddress);
if(i==p)//查询两部分都未找到合适的区域,输出插入失败语句
插入失败,无可用空间\n"
voidDelete(PCB&
a)//删除作业,修改存信息和初始化该作业信息
inti;
for(i=a.Startaddress;
a.Startaddress+a.ProgressSize;
ROM[i]=0;
a.ProgressState=0;
//状态标记为未使用
进程%s删除成功\n"
a.ProgressName);
intmain()
intchoose1,choose;
PCBa;
init();
\t主存空间的分配与回收\n"
---------------------------------------\n"
\t1、首次适应算法\n"
\t2、循环首次适应算法\n"
请选择分配算法:
"
scanf("
%d"
&
choose1);
system("
cls"
while
(1)
w:
system("
当前分配算法:
if(choose1==1)
首次适应算法\n"
else
循环首次适应算法\n"
\t1、插入进程\n"
\t2、删除进程\n"
\t3、显示进程的信息\n"
\t4、显示空闲区\n"
请输入:
choose);
switch(choose)
case1:
请输入进程名:
%s"
a.ProgressName);
请输入进程的大小:
a.ProgressSize);
for(inti=0;
count;
if(strcmp(num[i].ProgressName,a.ProgressName)==0)
已存在同名进程,无法插入。
pause"
gotow;
if(choose1==1)//首次适应算法
First_Fit(a);
Next_Fit(a);
//循环首次适应算法
num[count++]=a;
case2:
if(count==0)
当前没有进程在存中,无法删除!
输入删除的进程名字:
ProgressName);
if(!
strcmp(num[i].ProgressName,ProgressName))
Delete(num[i]);
没有找到对应进程,请重新输入。
case3:
showProgress(a);
case4:
find_FREE();
showFree();
default:
\n无效的输入。
return0;
主界面:
首次适应算法,初始空闲区:
插入进程:
插入3个进程:
空闲区信息:
删除进程2:
删除后空闲区状况:
再插入一个进程,可以看到其其初始地址为100:
循环首次适应算法,插入3个进程
删除进程2后:
再插入进程A,发现其从上次找到的空闲分区的下一个空闲分区开始查找,其初始地址为750而不是200:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 实验 主存 空间 分配 回收 首次 适应 算法 循环