操作系统第三次.docx
《操作系统第三次.docx》由会员分享,可在线阅读,更多相关《操作系统第三次.docx(9页珍藏版)》请在冰豆网上搜索。
操作系统第三次
吉林大学
操作系统
实验报告
班级:
7
姓名:
姜秀连
学号:
55140727
姓名
姜秀连
学号
55140727
实验项目
存储管理——动态不等
长存储资源分配算法
实验性质
□演示性实验□验证性实验
操作性实验□综合性实验
实验地点
机器编号
指导教师
实验时间
2016年6月14日
一、实验综述
1.实验目的及要求
理解动态异长存储分区资源管理,掌握所需数据结构和管理程序,了解各种存储分配算法的优点和缺点。
实验内容
分析UNIX最先适应(FF)存储分配算法,即map数据结构、存储分配函数malloc()和存储释放函数mfree(),找出与算法有关的成分。
修改上述与算法有关的成分,使其分别体现BF分配原则和WF分配原则。
2.实验设备、软件
PC, Linux
二、实验过程(实验步骤、记录、数据、分析)
实验代码:
#ifdefHAVE_CONFIG_H
#include
#endif
#include
#include
#defineMAPSIZE100
structmap//存储资源表结构
{
intm_addr;
intm_size;
};
structmapmap[MAPSIZE];//存储资源表
//BF存储分配函数
intBF_malloc(structmap*mp,intsize)
{
registerinta,s;
registerstructmap*bp,*bpp;
for(bp=mp;bp->m_size;bp++)
{
if(bp->m_size>=size)
{
a=bp->m_addr;
s=bp->m_size;
for(bpp=bp;bpp->m_size;bpp++)
{//最佳适应
if(bpp->m_size>=size&&bpp->m_size
{
a=bpp->m_addr;
s=bpp->m_size;
bp=bpp;
}
}
bp->m_addr+=size;
if((bp->m_size-=size)==0)
do
{
bp++;
(bp-1)->m_addr=bp->m_addr;
}
while((bp-1)->m_size=bp->m_size);
return(a);
}
}
return(-1);
}
//WF存储分配函数
intWF_malloc(structmap*mp,intsize)
{
registerinta,s;
registerstructmap*bp,*bpp;
for(bp=mp;bp->m_size;bp++)
{
if(bp->m_size>=size)
{
a=bp->m_addr;
s=bp->m_size;
for(bpp=bp;bpp->m_size;bpp++)
{//最坏适应
if(bpp->m_size>s)
{
a=bpp->m_addr;
s=bpp->m_size;
bp=bpp;
}
}
bp->m_addr+=size;
if((bp->m_size-=size)==0)
do
{
bp++;
(bp-1)->m_addr=bp->m_addr;
}
while((bp-1)->m_size=bp->m_size);
return(a);
}
}
return(-1);
}
//存储释放函数
voidmfree(structmap*mp,intaa,intsize)
{
registerstructmap*bp;
registerintt;
registerinta;
a=aa;
for(bp=mp;bp->m_addr<=a&&bp->m_size!
=0;bp++)
;
if(bp>mp&&(bp-1)->m_addr+(bp-1)->m_size==a)
{//与前合并
(bp-1)->m_size+=size;
if(a+size==bp->m_addr)
{//前后合并
(bp-1)->m_size+=bp->m_size;
while(bp->m_size)
{
bp++;
(bp-1)->m_addr=bp->m_addr;
(bp-1)->m_size=bp->m_size;
}
}
}
else
{
if(a+size==bp->m_addr&&bp->m_size)
{//与后合并
bp->m_addr-=size;
bp->m_size+=size;
}
elseif(size)
do
{//无合并
t=bp->m_addr;
bp->m_addr=a;
a=t;
t=bp->m_size;
bp->m_size=size;
bp++;
}
while(size=t);
}
}
voidinit()
{
structmap*bp;
intaddr,size;
inti=0;
bp=map;
printf("Pleaseinputstartingaddrandtotalsize:
");
scanf("%d,%d",&addr,&size);
bp->m_addr=addr;
bp->m_size=size;
(++bp)->m_size=0;//表尾
}
voidshow_map()
{
inti=0;
//system("clear");//清屏
structmap*bp;
bp=map;
printf("\nCurrentmemorymap...\n");
printf("Address\t\tSize\n");
while(bp->m_size!
=0)
{
printf("<%d\t\t%d>\n",bp->m_addr,bp->m_size);
bp++;
}
printf("\n");
}
main()
{
inta,s;
intc;
inti;
init();
printf("pleaseinput,bforBF,wforWF:
");
scanf("%c",&c);
do
{
show_map();//显示存储资源表
printf(“pleaseinput,bforBF,wforWF,eforexit);
printf("Pleaseinput,1forrequest,2forrelease,0forexit:
");
scanf("%d",&c);
switch(i)
{
case1:
printf("Pleaseinputsize:
");
scanf("%d",&s);
if(c==’b’)//BF
a=BF_malloc(map,s))
else//WF
a=WF_malloc(map,s))
if(a==-1)
printf("requestcan'tbesatisfied\n");
else
printf("allocmemoryataddress:
%d,size:
%d\n",a,s);
break;
case2:
printf("Pleaseinputaddrandsize:
");
scanf("%d,%d",&a,&s);
mfree(map,a,s);
break;
case0:
exit(0);
}
}
while
(1);
}
3.实验结果及分析
四.总结
通过这次的实验,基本理解操作系统动态不等
长存储资源分配算法,基本完成实验的要求。