操作系统内存的分配与回收

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
scanf("%f",&xk0);
ad0=allocate(xk0);
break;
case2:
printf("输入要回收的起始地址与分区长度:");
scanf("%f%f",&s0,&l0);
reclaim(s0,l0);
break;
case3:
printf("空闲区表:\n");
if(ad0)
{
printf("序号\t\t起始地址\t\t尺寸\t\t状态\t\n");
}
printf("\n已分配表:\n");
printf("序号\t\t起始地址\t\t尺寸\t\t状态\t\n");
for(i=0;i<n;i++)
{
if(used_table[i].flag!=0)
{
printf("%d\t\t",i);
printf("%f\t\t",used_table[i].address);
printf("%d\t\t\n",used_table[i].flag);
}
} //for
} //if
break;
case4:
exit(0);
default:
printf("无此项,请重新选择!");
}//switch
} //while(1)
}
float allocate(floatxk) //分配函数
struct
{
float address; /*空闲区起始地址*/
float length; /*空闲区长度,单位为字节*/
intflag; /*空闲区表登记栏标记,用0表示空栏目,用1表示未分配*/
}free_table[m];/*空闲区表*/
struct{
float address;/*已分分区起始地址*/
for(i=0;i<m;i++)
{
printf("%d\t\t",i);
printf("%f\t\t",free_table[i].address);
printf("%f\t\t",free_table[i].length);
printf("%d\t\t\n",free_table[i].flag);
printf("%f\t\t",used_table[i].length);
printf("%d\t\t\n",used_table[i].flag);;
}
else
{
printf("%d\t\t",i);
printf("%f\t\t",used_table[i].address);
printf("%f\t\t",used_table[i].length);
used_table[j].flag=1;
used_table[j].length=xk;
free_table[k].length=free_table[k].length-xk;
ad=free_table[k].address+free_table[k].length;
}
return(ad);
} //if
#defineminisize100 /*空闲区_申请空间≤minisize时,分配整个空闲区*/
#define n 4/*假定系统允许的最大作业为n,假定模拟实验中n值为10*/
#define m 4 /*假定系统允许的空闲区表最大为m*/
#include <stdio.h>
/*系统中主要数据结构*/
{ቤተ መጻሕፍቲ ባይዱ
printf("no free space\n");
return(-1);
}
else
{
for(j=0;j<n;j++)
{
if(used_table[j].flag==0)
{
if((free_table[k].length-xk)<=minisize) /*找到可用空闲区,开始分配*/
{
used_table[j].length=free_table[k].length;
for(i=0;i<n;i++)
used_table[i].flag=0;//已分配表初始化
while(1)
{
printf("\n1:分配主存2:回收主存3:显示主存4:退出5:回收已经使用分区\n");
scanf("%d",&choose);
switch(choose)
{
case1:
printf("\n请输入作业所需长度xk: ");
float allocate(floatxk);//分配主存空间函数
floatxk0,ad0;
free_table[0].address=10240;
free_table[0].length=102400;
free_table[0].flag=1;
for(i=1;i<m;i++)
free_table[i].flag=0;//空闲区表初始化
used_table[j].address=free_table[k].address;
used_table[j].flag=1;
free_table[k].flag=0;
ad=free_table[k].address;
xk=free_table[k].length;
}
else
{
used_table[j].address=free_table[k].address+free_table[k].length-xk;
}//for
}//else
}
void reclaim(floats,floatl) //回收空闲区表
{
inti,j,k,t;
j=-1;k=-1;i=0;
/*寻找回收分区的空闲上下邻,上邻表目为k,下邻表目为j*/
while(i<m && (j==-1||k==-1))
{
inti,j,k;
floatad;
k=-1; //k=-1,分配不成功
for(i=0;i<m;i++) /*寻找空间大于xk的最小空闲空间登记项k */
{
if((free_table[i].length>=xk)&&(free_table[i].flag==1))
{
k=i;
break;
}
}
if(k==-1) /*无可用空闲区,返回*/
float length;/*已分区长度,单位为字节*/
intflag;/*已分配区表登记栏标志,用"0"表示空栏目*/
}used_table[n];/*已分配区表*/
voidmain( )
{
floats0,l0;
inti;
intchoose;
voidreclaim(floats,floatl);
voidreclaim1(floats,floatl);
相关文档
最新文档