操作系统首次适应算法实验报告Word文档下载推荐.docx
《操作系统首次适应算法实验报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《操作系统首次适应算法实验报告Word文档下载推荐.docx(12页珍藏版)》请在冰豆网上搜索。
![操作系统首次适应算法实验报告Word文档下载推荐.docx](https://file1.bdocx.com/fileroot1/2022-12/13/66af839e-b437-4234-9c70-c06511580088/66af839e-b437-4234-9c70-c065115800881.gif)
start
(5)结束位置:
end
(6)进程名称:
name
(7)进程大小:
capactity
(8)分区使用标记flag
设计思路:
(1)
(2)fenpei()函数
(3)first-fit()函数
(4)memory-recovery()函数
(5)showit()函数
(6)exit()函数
4、模块的输入输出
(1)main()函数:
整型输入,调用两个函数,返回0;
(2)menu()函数:
功能菜单,输入对功能菜单的选择select(1-4),它们分别是1添加进程,2回收内存,3查看内存分配,4退出。
并通过switch方法实现对各函数的调用。
(3)init-neicun()函数:
输入内存大小,并对第i个进程的名称name、开始位置start、结束位置end、大小capactity以及标记位flag等进行了初始化。
(4)fenpei()函数:
为内存分配内存,输入所需添加进程的名称和大小,并调用first-fit()算法。
(5)first-fit()函数:
当某一分区不在使用时,如果内存空间大于进程长度,则分配内存,并输出该内存的名称name和大小size,并通过检验标记位flag是否等于1来输出是否能为该进程成功分配内存。
(6)memory-recovery()函数:
回收之前分配给进程的内存,输入需回收内存的进程名称,标记位flag表示回收是否成功,0代表失败,1代表成功,根据flag的值输出内存是否回收成功。
此外,将连续的已回收的内存区合并。
(7)showit()函数:
显示进程情况,即输出各个进程的名称,开始位置,结束位置,进程大小。
并根据flag的值来判断一进程是已使用、未使用还是尾部。
(8)exit()函数:
整型输入,返回0;
通过exit(0)方法来退出程序。
5、程序流程图
7、实验截图
8、源代码
#include<
stdio.h>
string.h>
iostream>
#definenumber100//进程数量
intneicun=200;
//内存块默认大小
intfqNum=1;
//已使用分区数目,进程数目=fqNum-1
//结构类型
structfqinfo//分区信息
{
intstart;
//开始位置
intend;
//结束位置
charname;
//进程名称
intcapactity;
//进程大小或者分区块大小
intflag;
//分区使用标记,0:
未使用1:
已使用2:
回收或者合并的分区3:
尾部
}fqlist[number];
//fqlist[]分区列表
//函数定义
intmenu();
//功能菜单
intinit_neicun();
//初始化内存大小
intfenpei();
//为进程分配内存
intfirst_fit(charname,intsize);
//首次适应算法
intMemory_recovery();
//内存回收
intshowit();
//显示进程
intexit();
//退出系统
//功能菜单menu
intmenu(){
intselect;
printf("
\n---------------------------------------\n"
);
1:
添加进程2:
回收内存\n"
3:
查看内存分配4:
退出\n"
pleaseinputyourchoice:
"
scanf("
%d"
&
select);
switch(select){
case1:
fenpei();
break;
case2:
Memory_recovery();
case3:
showit();
case4:
exit();
}
menu();
return0;
}
intinit_neicun(){
for(inti=0;
i<
number;
i++){
fqlist[i].name='
n'
;
fqlist[i].start=0;
fqlist[i].end=0;
fqlist[i].capactity=0;
fqlist[i].flag=0;
请输入内存大小:
neicun);
内存大小neicun=%d\n"
neicun);
fqlist[0].capactity=neicun;
fqlist[0].start=0;
fqlist[0].end=neicun-1;
fqlist[0].flag=3;
//标志位flag=3
intfenpei(){
getchar();
charm;
intn;
请输入进程的名称和大小(空格分隔):
%c%d"
m,&
n);
first_fit(m,n);
//调用first_fit算法
intfirst_fit(charjname,intsize){
name=%c,size=%d\n"
jname,size);
intflag=0;
//默认flag=0情况分配失败,而flag=1时分配成功
intsum=0;
//对sum的初始化
number&
&
flag==0;
i++){//number为已定义的进程数量
if(fqlist[i].flag!
=1){//当某一分区不在使用时
if(fqlist[i].capactity>
size)//如果内存空间大于进程长度
{
if(i<
number-1){
//分配内存,已使用内存块增加
for(intj=number-1;
j>
i;
j--)
{
fqlist[j]=fqlist[j-1];
}
fqlist[i+1].name='
fqlist[i+1].start=sum+size;
fqlist[i+1].end=fqlist[i].end;
fqlist[i+1].capactity=fqlist[i].capactity-size;
fqlist[i+1].flag=fqlist[i].flag;
}
fqlist[i].name=jname;
fqlist[i].start=sum;
fqlist[i].end=sum+size-1;
fqlist[i].capactity=size;
fqlist[i].flag=1;
fqNum++;
//进程数目增1
//需要把以后的分区块往后一个位置
flag=1;
}else{
//当未使用的分区块大小不足时
sum=sum+fqlist[i].capactity;
}
}else{//当该分区块在使用时
sum=sum+fqlist[i].capactity;
}
if(flag==1)
printf("
已为进程%c分配内存区!
\n"
jname);
else
为进程%c分配内存区失败!
//回收内存
intMemory_recovery(){
//标记回收是否成功0:
失败1:
成功
intsflag=0;
//
inttflag=0;
charjname='
z'
//吸收空白键
请输入进程名称:
%c"
jname);
if(fqlist[i].name==jname){
fqlist[i].name='
fqlist[i].flag=2;
//表示为回收的内存区
flag=1;
fqNum--;
进程%c结束,内存回收成功!
进程%c无法结束,内存回收失败!
//将连续的已回收的内存区合并
while(flag<
3){
for(i=0;
number-1;
if(fqlist[i].flag==0||fqlist[i].flag==2){
if(fqlist[i+1].flag!
=1){
if(fqlist[i+1].flag==3)
{
fqlist[i].end=fqlist[i+1].end;
fqlist[i].capactity=fqlist[i].capactity+fqlist[i+1].capactity;
fqlist[i].flag=fqlist[i+1].flag;
for(intj=i+1;
j<
j++)
{
fqlist[j]=fqlist[j+1];
}
i=number;
flag++;
else{
}
}
flag++;
//显示进程情况
intshowit(){
intcount=0;
进程名称开始位置结束位置进程大小状态\n"
number-1&
count<
fqNum;
i++)
{
%5c%10d%12d%10d"
fqlist[i].name,fqlist[i].start,fqlist[i].end,fqlist[i].capactity);
if(fqlist[i].flag==1){
printf("
已使用\n"
count++;
elseif(fqlist[i].flag==3){
尾部\n"
}elseif(fqlist[i].flag==2){
未使用\n"
}elseif(fqlist[i].flag==0){
//退出
intexit(){
按任意键退出.....\n"
exit(0);
//主函数
intmain(){
init_neicun();