主存空间的分配和回收文档格式.docx
《主存空间的分配和回收文档格式.docx》由会员分享,可在线阅读,更多相关《主存空间的分配和回收文档格式.docx(12页珍藏版)》请在冰点文库上搜索。
freecount
定义一个页表结构体:
yebiao
其中包含三个成员:
intyehao;
//页号
intkuaihao;
//块号
structyebiao*next;
//指向下一个页表项的指针
定义一个进程结构体:
progress
其中包含四个成员:
charname[30];
//进程名
intsize;
//进程所需内存大小
structprogress*next;
structyebiao*yb;
//为其分配内存建立的页表首地址
源程序及注释:
#include<
stdio.h>
iostream.h>
iomanip.h>
malloc.h>
string.h>
stdlib.h>
intbitmap[8][8]={//初始化位图
};
intfreecount=54;
//初始时空闲页块数
typedefstructyebiao//页表结构体
{
intyehao;
intkuaihao;
structyebiao*next;
}YEBIAO;
typedefstructprogress//进程结构体
charname[30];
intsize;
structprogress*next;
structyebiao*yb;
}PROGRESS;
/*分配内存函数,为进程分配所需要的内存并建立页表*/
YEBIAO*allocation(intsize)
YEBIAO*head;
YEBIAO*tem;
intn=0;
tem=(YEBIAO*)malloc(sizeof(YEBIAO));
head=tem;
for(inti=0;
;
i++)//遍历位图找到空闲的页块
{
if(bitmap[i/8][i%8]==1)continue;
//如果页会已被占用直接查下一个页块
if(bitmap[i/8][i%8]==0)
{
bitmap[i/8][i%8]=1;
//将空闲的位图标识置为一
tem->
yehao=n;
//建立一个页表项的页号
kuaihao=i;
//对应的块号
next=NULL;
n++;
}
if(n==size)break;
//如果已经分配了需要的页块直接退出查找
else
next=(YEBIAO*)malloc(sizeof(YEBIAO));
tem=tem->
next;
}
returnhead;
/*回收内存*/
voidrecovery(YEBIAO*a)
YEBIAO*b;
while(a->
next!
=NULL)
bitmap[a->
kuaihao/8][a->
kuaihao%8]=0;
//将页块对应的标识位图对应标志置0
b=a->
//指向下一个页表项
free(a);
//释放页表项占用的空间
a=b;
bitmap[a->
free(a);
voidoutputyebiao(YEBIAO*a)//输出页表的内容
cout<
<
"
-------------------------"
endl;
do
cout<
a->
yehao<
setw(4)<
kuaihao<
a=a->
}while(a!
=NULL);
//遍历页表链表逐行输出页表项
voidoutputbit()//输出主存分配位视图
cout<
主存分配位视图如下:
------------------------------"
i<
8;
i++)
for(intj=0;
j<
j++)
bitmap[i][j]<
setw(4);
//双重循环输出标识位图的内容
PROGRESS*insert(PROGRESS*head,PROGRESS*b)//插入进程,将进程信息插入进程链表中
PROGRESS*tem;
if(head==NULL)//如果进程为空直接将要出入的进程指针赋值给头指针
head=b;
b->
else//定位到链表的队尾将要插入的进程插入到队尾
tem=head;
while(tem->
tem->
next=b;
PROGRESS*getprosess(PROGRESS*head)//输入进程为进程分配空间
PROGRESS*a;
charna[30];
请输入进程名:
cin>
>
na;
请输入进程所占内存大小:
size;
//上面是输入进程的名称和所用内存空间大小
if(size>
freecount)//如果进程
进程所需内存的大小大于空闲的内存,无法添加进程。
returnhead;
a=(PROGRESS*)malloc(sizeof(PROGRESS));
//开辟空间存放进程信息
strcpy(a->
name,na);
a->
size=size;
//初始化进程的基本信息
freecount-=size;
//将可用的页块数减去进程要用的页块数
yb=allocation(size);
//为进程创建页表
进程创建成功!
returninsert(head,a);
//将进程插入进程链表中
voidoutputprosess(PROGRESS*head)//输出进程信息
if(head==NULL)//判断进程队列是否为空
当前没有进程!
return;
do//进程队列不为空,先输出进程的名称和所占内存的大小。
再输出进程的页表队列
进程名为:
head->
name<
进程所占内存的大小为:
size<
页"
进程的页表如下:
outputyebiao(head->
yb);
head=head->
}while(head!
PROGRESS*delecteprosess(PROGRESS*head)//删除进程
PROGRESS*a,*b;
请输入要删除的进程名:
//使用进程的名字来删除进程
if(head==NULL)//如果进程为空,退出函数
进程链表为空,没有进程可删除。
returnNULL;
if(strcmp(head->
name,na)==0)//如果找到要删除的进程
recovery(head->
//先删除进程的页表并释放所占的页
freecount+=head->
//将可用的内存数加上进程所占的内孙
a=head->
free(head);
//释放进程信息所占得内存空间
进程"
na<
删除成功!
returna;
a=head->
b=head;
while(a!
=NULL)//遍历链表找到要删除的进程
if(strcmp(a->
name,na)==0)
recovery(a->
freecount+=a->
next=a->
b=a;
a=a->
您输入的进程名不对,删除进程失败。
voidoutbiaoti()
\t\t\t主存空间的分配与回收模拟"
您可进行如下操作:
1.查看内存分配情况;
2.查看进程;
3.添加进程4.删除进程"
\t\t可用内存为"
freecount<
voidmain()
intn;
PROGRESS*head;
//进程的头指针
head=NULL;
system("
color2f"
);
outbiaoti();
for(;
)
cin>
n;
switch(n)
case1:
outputbit();
outbiaoti();
break;
case2:
cls"
outputprosess(head);
case3:
head=getprosess(head);
case4:
head=delecteprosess(head);
default:
break;
流程图:
程序运行时的初值和运行结果: