主存空间的分配和回收.docx
- 文档编号:2440392
- 上传时间:2023-05-03
- 格式:DOCX
- 页数:12
- 大小:78.40KB
主存空间的分配和回收.docx
《主存空间的分配和回收.docx》由会员分享,可在线阅读,更多相关《主存空间的分配和回收.docx(12页珍藏版)》请在冰点文库上搜索。
主存空间的分配和回收
湖北师范学院
《操作系统》实验报告
学生学号:
2011115010820
学生班级:
1108
学生姓名:
汤凯
指导老师:
李晓瑾
完成时间:
2013年12月28号
实习题目:
模拟在分页式管理方式下采用位示图来表示主存分配情况,实现主存空间的分配和回收
程序中使用的数据结构及符号说明:
初始化定义一个位图:
intbitmap[8][8]={
{1,1,0,0,1,1,1,0},
{0,1,0,1,0,1,0,0},
{0,0,0,0,0,0,0,0},
{1,0,0,0,0,0,0,1},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0}
}
初始化时空闲块数:
freecount
定义一个页表结构体:
yebiao
其中包含三个成员:
intyehao;//页号
intkuaihao;//块号
structyebiao*next;//指向下一个页表项的指针
定义一个进程结构体:
progress
其中包含四个成员:
charname[30];//进程名
intsize;//进程所需内存大小
structprogress*next;//指向下一个页表项的指针
structyebiao*yb;//为其分配内存建立的页表首地址
源程序及注释:
#include
#include
#include
#include
#include
#include
intbitmap[8][8]={//初始化位图
{1,1,0,0,1,1,1,0},
{0,1,0,1,0,1,0,0},
{0,0,0,0,0,0,0,0},
{1,0,0,0,0,0,0,1},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0}
};
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;//建立一个页表项的页号
tem->kuaihao=i;//对应的块号
tem->next=NULL;
n++;
}
if(n==size)break;//如果已经分配了需要的页块直接退出查找
else
{
tem->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->next;//指向下一个页表项
free(a);//释放页表项占用的空间
a=b;
}
bitmap[a->kuaihao/8][a->kuaihao%8]=0;
free(a);
}
voidoutputyebiao(YEBIAO*a)//输出页表的内容
{
cout<<"-------------------------"< do { cout< a=a->next; }while(a! =NULL);//遍历页表链表逐行输出页表项 cout<<"-------------------------"< } voidoutputbit()//输出主存分配位视图 { cout<<"主存分配位视图如下: "< cout<<"------------------------------"< for(inti=0;i<8;i++) { for(intj=0;j<8;j++) { cout< } cout< } cout<<"------------------------------"< } PROGRESS*insert(PROGRESS*head,PROGRESS*b)//插入进程,将进程信息插入进程链表中 { PROGRESS*tem; if(head==NULL)//如果进程为空直接将要出入的进程指针赋值给头指针 { head=b; b->next=NULL; } else//定位到链表的队尾将要插入的进程插入到队尾 { tem=head; while(tem->next! =NULL) { tem=tem->next; } tem->next=b; } returnhead; } PROGRESS*getprosess(PROGRESS*head)//输入进程为进程分配空间 { PROGRESS*a; charna[30]; intsize; cout<<"请输入进程名: "; cin>>na; cout<<"请输入进程所占内存大小: "; cin>>size;//上面是输入进程的名称和所用内存空间大小 if(size>freecount)//如果进程 { cout<<"进程所需内存的大小大于空闲的内存,无法添加进程。 "< returnhead; } a=(PROGRESS*)malloc(sizeof(PROGRESS));//开辟空间存放进程信息 strcpy(a->name,na); a->size=size;//初始化进程的基本信息 freecount-=size;//将可用的页块数减去进程要用的页块数 a->yb=allocation(size);//为进程创建页表 cout<<"进程创建成功! "< a->next=NULL; returninsert(head,a);//将进程插入进程链表中 } voidoutputprosess(PROGRESS*head)//输出进程信息 { if(head==NULL)//判断进程队列是否为空 { cout<<"当前没有进程! "< return; } do//进程队列不为空,先输出进程的名称和所占内存的大小。 再输出进程的页表队列 { cout<<"进程名为: "< "< cout<<"进程的页表如下: "< outputyebiao(head->yb); head=head->next; }while(head! =NULL); } PROGRESS*delecteprosess(PROGRESS*head)//删除进程 { charna[30]; PROGRESS*a,*b; cout<<"请输入要删除的进程名: ";//使用进程的名字来删除进程 cin>>na; if(head==NULL)//如果进程为空,退出函数 { cout<<"进程链表为空,没有进程可删除。 "< returnNULL; } if(strcmp(head->name,na)==0)//如果找到要删除的进程 { recovery(head->yb);//先删除进程的页表并释放所占的页 freecount+=head->size;//将可用的内存数加上进程所占的内孙 a=head->next; free(head);//释放进程信息所占得内存空间 cout<<"进程"< "< returna; } a=head->next; b=head; while(a! =NULL)//遍历链表找到要删除的进程 { if(strcmp(a->name,na)==0) { recovery(a->yb); freecount+=a->size; b->next=a->next; free(a); cout<<"进程"< "< returnhead; } b=a; a=a->next; } cout<<"您输入的进程名不对,删除进程失败。 "< returnhead; } voidoutbiaoti() { cout<<"\t\t\t主存空间的分配与回收模拟"< cout<<"您可进行如下操作: 1.查看内存分配情况;2.查看进程;3.添加进程4.删除进程"< cout<<"\t\t可用内存为"< } voidmain() { intn; PROGRESS*head;//进程的头指针 head=NULL; system("color2f"); outbiaoti(); for(;;) { cin>>n; switch(n) { case1: outputbit();outbiaoti();break; case2: system("cls");outputprosess(head);outbiaoti();break; case3: system("cls");head=getprosess(head);outbiaoti();break; case4: system("cls");head=delecteprosess(head);outbiaoti();break; default: break; } } } 流程图: 程序运行时的初值和运行结果:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 主存 空间 分配 回收