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. 运行结果




基于C语言的分页管理方式下存储分配情况模拟_主存


分配主存:


基于C语言的分页管理方式下存储分配情况模拟_分页管理_02


显示作业和页表:


基于C语言的分页管理方式下存储分配情况模拟_分页管理_03


回收主存:


基于C语言的分页管理方式下存储分配情况模拟_主存_04