大二下操作系统实验八内存分配与回收算法实现_第1页
大二下操作系统实验八内存分配与回收算法实现_第2页
大二下操作系统实验八内存分配与回收算法实现_第3页
大二下操作系统实验八内存分配与回收算法实现_第4页
大二下操作系统实验八内存分配与回收算法实现_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实验八内存分配与回收算法实现

1、实验目的

掌握为实现多道程序并发执行,操作系统是如何通过作业调度选择作业进入内存

系统如何为进入内存的作业分配内存空间,实现多道作业同时驻留内存,就绪进程队列中的多个进程是如何以分式方式共享CPU,作业运行完成离开系统时,系统如何进行内存回收,计算进程周转时间。

掌握各种调度算法,以及实现所需的各种数据结构。

2、实验内容

根据给定的动态分区分配算法流程图(p112,图4-10),用你熟悉的计算机编程语言编写一程序,该程序实现内存的合理分配后回收。

#include<stdio.h>#include<stdlib.h>#include<cstring>#include<cstdlib>#defineM10

//************************空闲内存结构体typedefstruct

{

intstartaddress;intendaddress;charname[20];intsize;

intstate;

}area;

//****************作业记录结构体typedefstruct

{

charpname[20];intpsize;

}progress;intN=10;intk=0;

//*****************空闲内存结构体初始化voidinit(area*f)

{

f[0].startaddress=0;f[0].endaddress=400;f[0].size=400;f[0].state=0;strcpy(f[0].name,"null");

k++;

}

//******************分配内存

voidinsert( area*f,inti,intb,intc)

{

intj;for(j=k;j>i;j--)

f[j]=f[j-1];f[i].startaddress=b;f[i].endaddress=c;f[i].state=0;

f[i].size=c-b;strcpy(f[i].name,"null");k++;

}

voidapplication( area*f,progressp)

{

inti,ff=0;for(i=0;i<k;i++)

if(!f[i].state)

{

if(f[i].size<p.psize)continue;

elseif(f[i].size==p.psize)

{

strcpy(f[i].name,p.pname);f[i].state=1;

ff=1;break;

}

else

{

insert(f,i+1,f[i].startaddress+p.psize,f[i].endaddress);f[i].endaddress=f[i].startaddress+p.psize-1;f[i].size=p.psize;

f[i].state=1;strcpy(f[i].name,p.pname);ff=1;

break;

}

}

if(ff)

printf(" 申请成功\n");

else

printf("申请失败,对不起,主内存的空闲表中没有足够的内存!\n");

}

//*****************输出结果voidprint( area*f)

{

intj;printf("************************************************************\n");printf("* 进程号进程名 始址 结束地址 大小 状态 *\n\n");for(j=0;j<k;j++)

printf("* %d%10s%10d%10d%11d%7d

*\n",j,f[j].name,f[j].startaddress,f[j].endaddress,f[j].size,f[j].state);printf("************************************************************\n\n");}

//******************回收内存voidrecovery( area*f,inti)

{

intj,ff=1;if((i+1)<k&&f[i+1].state==0)

{

f[i].endaddress=f[i+1].endaddress;strcpy(f[i].name,"null");

f[i].size+=f[i+1].size;f[i].state=0;for(j=i+1;j<k-1;j++)f[j]=f[j+1];

if(k>1)

{

k--;

return;

}

recovery(f,i+1);

ff=0;return;

}

if((i-1)>=0&&f[i-1].state==0)

{

f[i-1].endaddress=f[i].endaddress;strcpy(f[i-1].name,"null");

f[i-1].size+=f[i].size;

for(j=i;j<k-1;j++)f[j]=f[j+1];if(k>1)

{

k--;

return;

}

recovery(f,i-1);

ff=0;return;

}

if(ff)

{

strcpy(f[i].name,"null");f[i].state=0;

}

}

//************主函数voidmain()

{

intss=1,i,j=0;areaf[M];

progressp[M];

printf(" ************内存分配与回收*************\n\n");init(f);

while(ss)

{

printf("请选择操作项:\n");printf("1.内存分配\n");

printf("2.内存回收\n");

printf("0.退出操作\n");

printf("选项:");

scanf("%d",&i);

printf("\n");switch(i)

{

case1:

printf("请输入作业名称,大小:\n");printf("进程名: \n");

scanf("%s",p[j].pname);printf("进程大小:");scanf("%d",&p[j].psize);

application(f,p[j]);

j++;

print(f);break;

case2:

printf("你要回收的表序号(0---%d):",k-1);scanf("%d",&i);

if((i<0)||(i>k-1))

printf("输入错误,没有该进程\n\n");

else

{ recovery(f,i);

printf(" 回收成功\n");

print(f);

}

break;case0:

ss=0;b

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论