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

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