1. 题目简介
借用外存空闲分区管理中位示图的方法来表示主存分配情况,实现主存空间的分配和回收
要求能显示和打印分配或回收前后的位示图和当前空闲块数,对完成一次分配后还要显示或打印为作业建立的页表
2. 所用数据结构
为要分配的作业建立数据结构
typedefstructjob{
intpage[64];// 页表
intjobname;
intsize;
intpresent;// 表示作业的状态, 执行还是结束
strcutjob*next;}JN,*jobnode;
3. 程序代码描述
voidinit()//初始化作业链
voidshowbitgraph()//显示位示图
voidmemoryallocate()//分配内存
voidmemoryrecycle()//回收内存
voidshowjob()//显示内存中还有多少作业
voidshowpagetable()//显示页表
核心代码:
voidmemoryallocate()//内存分配
{
inti,j,k=0;
jobnodep=newJN;
jobnodeq=head;
cout<<"请输入作业的名称:"<<endl;
cin>>p->jobname;
cout<<"请输入作业所需的内存大小:"<<endl;
cin>>p->size;
p->present=1;
if(p->size>64-::count)
cout<<"作业所需的内存大小不能满足,分配失败"<<endl;
else
{
intcontrol=1;
for(i=0;i<8&&control;i++)
{
for(j=0;j<8&&control;j++)
{
if(bitgraph[i][j]==0)
{
p->page[k]=8*i+j;
bitgraph[i][j]=1;
::count++;
k++;
if(k==p->size)
control=0;
}
}
}
while(q->next!=NULL)
{
q=q->next;
}
q->next=p;
p->next=NULL;
}
cout<<endl;
showbitgraph();}voidmemoryrecycle()//内存回收
{
inti;
intm,n,symbol=0;
intid;
cout<<"请输入执行结束作业的名称:"<<endl;
cin>>id;
jobnodepoint=head->next;
while(point!=NULL)
{
if(id==point->jobname)
{
for(i=0;i<point->size;i++)
{
m=point->page[i]/8;
n=point->page[i]%8;
bitgraph[m][n]=0;
::count--;
}
point->present=0;
}
else
{
point->present=1;
}
point=point->next;
}
jobnoder=head->next;
while(r!=NULL)
{
if(r->present==0)
{
cout<<"内存回收成功!"<<endl;
showbitgraph();
}
r=r->next;
}}
4. 运行结果
分配主存:
显示作业和页表:
回收主存: