操作系统内存管理实验报告.docx
《操作系统内存管理实验报告.docx》由会员分享,可在线阅读,更多相关《操作系统内存管理实验报告.docx(11页珍藏版)》请在冰豆网上搜索。
操作系统内存管理实验报告
实验报告
系别
班级
学号
姓名
时间
地点
计算机科学系
计科1201
12182017
林鑫磊
2014年12月29号
计算机实验室205
课程名称
计算机操作系统
实验名称
内存管理
实验过程
一.实验目的
1.了解内存管理的功能
2.掌握进程可变内存管理的几种内存分配与回收算法
3.掌握可变分区算法中空闲分区的合并方法
二.实验内容
实现下列内存分配算法之一:
首次适应算法、循环首次适应、最佳分配算法、最坏分配算法
三.实验程序
#include
#defineL10
typedefstructLNode
{intstartaddress;
intsize;
intstate;
}LNode;
LNode
P[L]={{0,128,0},{200,256,0},{500,512,0},{1500,1600,0},{5000,150,0}};
intN=5;intf=0;
voidprint()
{inti;
printf("起始地址分区状态\n");
for(i=0;iprintf("%3d%8d%4d\n",P[i].startaddress,
P[i].size,P[i].state);}
voidFirst()
{inti,l=0,m;
printf("\n输入请求分配分区的大小:
");
scanf("%d",&m);
for(i=0;i{if(P[i].sizecontinue;
elseif(P[i].size==m)
{P[i].state=1;
l=1;
break;}
else
{
P[N].startaddress=P[i].startaddress+m;
P[N].size=P[i].size-m;
P[i].size=m;P[i].state=1;
l=1;N++;
break;}}
if(l==1||i{printf("地址成功分配\n\n");
printf("地址分配成功后的状态:
\n");
print();}
else
printf("没有可以分配的地址空间\n");}
voidCirFirst()
{intl=0,m,t=0;
printf("\n输入请求分配分区的大小:
");
scanf("%d",&m);
while(f{if(P[f].size{f=f+1;
if(f%N==0)
{f=0;t=1;}
continue;}
if(P[f].size==m&&P[f].state!
=1)
{P[f].state=1;
l=1;f++;
break;}
if(P[f].size>m&&P[f].state!
=1)
{P[N].startaddress=P[f].startaddress+m;
P[N].size=P[f].size-m;
P[f].size=m;
P[f].state=1;
l=1;N++;
f++;break;}}
if(l==1)
{printf("地址成功分配\n\n");
printf("地址分配成功后的状态:
\n");print();}
else
printf("没有可以分配的地址空间\n");}
voidWorst()
{inti,t=0,l=0,m;
inta[L];
printf("\n输入请求分配分区的大小:
");
scanf("%d",&m);
for(i=0;i{a[i]=0;
if(P[i].sizecontinue;
elseif(P[i].size==m)
{P[i].state=1;
l=1;break;}
else
a[i]=P[i].size-m;}
if(l==0)
{for(i=0;i{if(a[i]!
=0)
t=i;}
for(i=0;i{if(a[i]!
=0&&a[i]>a[t])
t=i;}
P[N].startaddress=P[t].startaddress+m;
P[N].size=P[t].size-m;
P[t].size=m;P[t].state=1;
l=1;N++;}
if(l==1||i{printf("地址成功分配\n\n");
printf("地址分配成功后的状态:
\n");
print();}
else
printf("没有可以分配的地址空间\n");}
voidBest()
{inti,t=0,l=0,m;
inta[L];
printf("\n输入请求分配分区的大小:
");
scanf("%d",&m);
for(i=0;i{a[i]=0;
if(P[i].sizecontinue;
elseif(P[i].size==m)
{P[i].state=1;
l=1;
break;
}
else
a[i]=P[i].size-m;}
if(l==0)
{for(i=0;i{if(a[i]!
=0)
t=i;}
for(i=0;i{if(a[i]!
=0&&a[i]t=i;}
P[N].startaddress=P[t].startaddress+m;
P[N].size=P[t].size-m;
P[t].size=m;P[t].state=1;
l=1;N++;}
if(l==1||i{printf("地址成功分配\n\n");
printf("地址分配成功后的状态:
\n");
print();}
else
printf("没有可以分配的地址空间\n");}
voidmain()
{intk=0;
printf("动态分区分配算法:
");
while(k!
=5)
{printf("\n~~~~~~~~主菜单~~~~~~~~~");
printf("\n1、首次适应算法\n2、循环首次适应算法");
printf("\n3、最坏适应算法\n4、最佳适应算法");
printf("\n5、退出\n");
printf("请选择算法:
");
scanf("%d",&k);
switch(k)
{case1:
printf("\n初始状态为:
\n");
print();
First();
continue;
case2:
printf("\n初始状态为:
\n");
print();
CirFirst();
continue;
case3:
printf("\n初始状态为:
\n");
print();
Worst();
continue;
case4:
printf("\n初始状态为:
\n");
print();
Best();
continue;
case5:
break;
default:
printf("选择错误,请重新选择。
\n");
}
}
}
四.运行截图
五.实验总结
通过看书学习了解了首次适应算法,循环首次适应算法,最佳分配算法,最坏分配算法的区别,以及他们各自的优缺点,不同的算法给予不同的分配区域,他们各自运行的结果也不同,这一点在代码上可以看出。
个人在代码编写上不是很熟练,所以有部分参考网络上代码,做了大量的提前练习。
以后还需要多加练习代码编程。