内存分配回收.docx
《内存分配回收.docx》由会员分享,可在线阅读,更多相关《内存分配回收.docx(14页珍藏版)》请在冰豆网上搜索。
内存分配回收
操作系统课程设计报告
题目:
内存管理
班级:
学号:
姓名:
指导教师:
日期:
12.7
内存管理
一、实验目的
通过本实验加深对计算机为进程分配内存算法的理解,提高用C语言编程的能力。
二、实验要求
编写程序,分别实现用首次适应算法、循环首次适应算法、最佳算法、最坏算法分别实现对进程的分配,每分配一次输出一次内存状态。
分配完毕可以按要求回收内存。
三、实验内容
本实验主要针对操作系统中内存管理相关理论进行实验,要求实验者编写一个程序,该程序管理一块虚拟内存,实现内存分配和回收功能。
1)设计内存分配的数据结构(空闲分区表/空闲分区链),
2)设计内存分配函数;
3)设计内存回收函数;
4)实现动态分配和回收操作;
5)可动态显示每个内存块
程序流程图:
四、运行结果分析
完整代码:
#include
voidscsy();
voidxhscsy();
voidzjsy();
voidzhsy();
intnum;
inta[20][20];
voidmain()
{
inti;
intsel;
printf("请输入空闲区数目\n");
scanf("%d",&num);
for(i=0;i{
printf("请输入空闲区起始地址空闲区大小\n");
scanf("%d",&a[i][0]);
scanf("%d",&a[i][1]);
}
printf("***********************\n*1、首次适应算法*\n*2、循环首次适应算法*\n*3、最佳适应算法*\n*4、最坏适应算法*\n***********************\n");
scanf("%d",&sel);
switch(sel)
{
case1:
scsy();
break;
case2:
xhscsy();
break;
case3:
zjsy();
break;
case4:
zhsy();
break;
default:
break;
}
}
voidscsy()//首次适应算法
{
inti;
intj;
intp;
intq=1;
intshumu;
intdaxiao;
intb[20][20][20];
intk;
intm;
printf("请输入进程数目\n");
scanf("%d",&shumu);
for(i=0;i{
printf("请输入进程所需内存大小\n");
scanf("%d",&daxiao);
for(j=0;j{
if(a[j][1]>=daxiao)
{
b[q][0][0]=j;//起址位置
a[j][0]=a[j][0]+daxiao;
a[j][1]=a[j][1]-daxiao;
j=num;
b[q][0][1]=daxiao;//数的大小
q++;
}
}
printf("空闲区起始地址大小\n");
for(p=0;pprintf("%5d%d\n",a[p][0],a[p][1]);
}
for(i=0;i{
printf("请输入回收进程号\n");
scanf("%d",&m);
printf("空闲区起始地址大小\n");
k=b[m][0][0];
a[k][0]=a[k][0]-b[m][0][1];
a[k][1]=a[k][1]+b[m][0][1];
for(p=0;pprintf("%5d%d\n",a[p][0],a[p][1]);
}
}
voidxhscsy()//循环首次适应算法
{
inti;
intj;
intp;
intq=1;
intshumu;
intdaxiao;
ints=0;
intb[20][20][20];
intk;
intm;
printf("请输入进程数目\n");
scanf("%d",&shumu);
printf("请输入进程所需内存大小\n");
scanf("%d",&daxiao);
for(j=0;j{
if(a[j][1]>=daxiao)
{
b[q][0][0]=j;
b[q++][0][1]=daxiao;
a[j][0]+=daxiao;
a[j][1]-=daxiao;
s=j;
j=num;
}
}
printf("空闲区起始地址大小\n");
for(p=0;pprintf("%5d%d\n",a[p][0],a[p][1]);
for(i=1;i{
printf("请输入进程所需内存大小\n");
scanf("%d",&daxiao);
for(j=s;j{
if(a[j][1]>=daxiao)
{
b[q][0][0]=j;
b[q++][0][1]=daxiao;
a[j][0]+=daxiao;
a[j][1]-=daxiao;
s=j;
j=num;
printf("空闲区起始地址大小\n");
for(p=0;pprintf("%5d%d\n",a[p][0],a[p][1]);
}
}
}
for(i=0;i{
printf("请输入回收进程号\n");
scanf("%d",&m);
printf("空闲区起始地址大小\n");
k=b[m][0][0];
a[k][0]=a[k][0]-b[m][0][1];
a[k][1]=a[k][1]+b[m][0][1];
for(p=0;pprintf("%5d%d\n",a[p][0],a[p][1]);
}
}
voidzjsy()//最佳适应算法
{
inti;
intj;
intc[20][20];
intshumu;
intdaxiao;
intd;
inte;
intf;
intg;
intp;
intb[20][20][20];
intq=1;
intm;
intk;
printf("请输入进程数目\n");
scanf("%d",&shumu);
for(i=0;i{
d=0;
printf("请输入进程所需内存大小\n");
scanf("%d",&daxiao);
for(j=0;j{
if(a[j][1]>=daxiao)
{
c[d][0]=j;
c[d++][1]=a[j][1]-daxiao;
}
}
f=c[0][1];
g=c[0][0];
for(e=0;e{
if(c[e][1]{
f=c[e][1];
g=c[e][0];
}
}
b[q][0][0]=g;
b[q++][0][1]=daxiao;
a[g][0]+=daxiao;
a[g][1]-=daxiao;
printf("空闲区起始地址大小\n");
for(p=0;pprintf("%5d%d\n",a[p][0],a[p][1]);
}
for(i=0;i{
printf("请输入回收进程号\n");
scanf("%d",&m);
printf("空闲区起始地址大小\n");
k=b[m][0][0];
a[k][0]=a[k][0]-b[m][0][1];
a[k][1]=a[k][1]+b[m][0][1];
for(p=0;pprintf("%5d%d\n",a[p][0],a[p][1]);
}
}
voidzhsy()//最坏适应算法
{
inti;
intj;
intc[20][20];
intshumu;
intdaxiao;
intd;
inte;
intf;
intg;
intp;
intb[20][20][20];
intq=1;
intm;
intk;
printf("请输入进程数目\n");
scanf("%d",&shumu);
for(i=0;i{
d=0;
printf("请输入进程所需主存大小\n");
scanf("%d",&daxiao);
for(j=0;j{
if(a[j][1]>=daxiao)
{
c[d][0]=j;
c[d++][1]=a[j][1]-daxiao;
}
}
f=c[0][1];
g=c[0][0];
for(e=0;e{
if(c[e][1]>f)
{
f=c[e][1];
g=c[e][0];
}
}
b[q][0][0]=g;
b[q++][0][1]=daxiao;
a[g][0]+=daxiao;
a[g][1]-=daxiao;
printf("空闲区起始地址大小\n");
for(p=0;pprintf("%5d%d\n",a[p][0],a[p][1]);
}
for(i=0;i{
printf("请输入回收进程号\n");
scanf("%d",&m);
printf("空闲区起始地址大小\n");
k=b[m][0][0];
a[k][0]=a[k][0]-b[m][0][1];
a[k][1]=a[k][1]+b[m][0][1];
for(p=0;pprintf("%5d%d\n",a[p][0],a[p][1]);
}
}