可变分区存储管理.docx
- 文档编号:8483684
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:15
- 大小:178.36KB
可变分区存储管理.docx
《可变分区存储管理.docx》由会员分享,可在线阅读,更多相关《可变分区存储管理.docx(15页珍藏版)》请在冰豆网上搜索。
可变分区存储管理
实验一可变分区存储管理
一、实验内容
编写程序模拟内存分配与回收的过程。
二、实验目的
1.加深对可变分区的存储管理的理解;
2.提高用C语言编制大型系统程序的能力,特别是掌握C语言编程的难点:
指针和指针作为函数参数;
3.掌握用指针实现链表和在链表上的基本操作。
三、实验题目
编写一个C程序,用char*malloc(unsignedsize)函数向系统申请一次内存空间(如size=1000,单位为字节),
模拟可变分区内存管理,实现对该内存区的分配和释放管理。
(1)设计思路
用char*malloc(unsignedsize)函数向系统申请一次内存空间(如size=1000,单位为字节),用循环首次适应法addr=(char*)lmalloc(unsignedsize)和lfree(unsignedsize,char*addr)模拟UNIX可变分区内存管理,实现对该内存区的分配和释放管理。
(2)循环首次适应算法
模拟UNIX的进程管理程序采用的是循环首次适应算法,具体算法如下:
系统每次为进程分配资源时,从上次找到的空闲分区的下一个空闲分区开始查找,直到找到一个能满足要求的空闲分区,从中划出一块与请求大小相等的内存空间分配给作业。
(3)数据结构
(4)系统总体框图
4、源程序代码
#include
#include
#include
#include
#include
#definegetpch(type)(type*)malloc(sizeof(type))
#definemaxm600/*最大内存空间*/
#definenull0
structspd{/*分区说明表*/
intj;/*分区名*/
intlen;/*大小*/
charstate;/*状态:
'e','f','a'*/
intsaddre;/*起始地址*/
structspd*next;
}*rspd=null,*p;
structjcb{
charname[10];
intxk;
intsadd;
structjcb*next;
}*jp,*ready;
typedefstructspdSPD;
typedefstructjcbJCB;
voidmainmenu();
voidinput();
voiddisp0();
voiddisp();
voidinitm();
voidallationm();
voidfreem();
voidinitm()
{/*初始化*/
p=getpch(SPD);
p->j=1;
p->len=maxm;
p->state='e';
p->saddre=0;
rspd=p;
rspd->next=null;
}
voiddisp2()
{
JCB*first;
inti=0;
first=ready;
if(ready!
=null)
{
printf("\n内存中现有作业:
\n");
while(first!
=null)
{
printf("%s\t",first->name);
i++;
if(i==5)printf("\n");
first=first->next;
}
}
elseprintf("内存中无作业.\n");
}
voidinput()
{JCB*first;
intxk;
charname[10];
first=ready;
printf("\n请输入作业名:
");
scanf("%s",&name);
while(first!
=null){
if(strcmp(name,jp->name)==0)
{
printf("\n此文件名已存在,请重新输入:
");
scanf("%s",&name);
}
elsefirst=first->next;
}
first=ready;
printf("\n请输入作业所需的内存空间:
");
scanf("%d",&xk);
if(xk>600||xk<0){
printf("\n请重新输入作业所需的内存空间:
");
scanf("%d",&xk);
}
jp=getpch(JCB);
strcpy(jp->name,name);
jp->xk=xk;
jp->sadd=null;
if(ready==null){/*排序*/
ready=jp;
ready->next=null;
}
else{
while(first->next!
=null){
first=first->next;
}
first->next=jp;
first=first->next;
first->next=null;
}
}
voidallationm()
{
intflag=0;
SPD*first;
first=rspd;
input();
while(first!
=null){
if(first->state=='e'&&first->len>=jp->xk){
jp->sadd=first->saddre;
first->state='f';
if(first->len>jp->xk){
p=getpch(SPD);
p->j=first->j+1;
p->len=first->len-jp->xk;
first->len=jp->xk;
p->saddre=first->saddre+jp->xk;
p->state='e';
p->next=first->next;
first->next=p;
flag=1;
while(p->next!
=null){
p->next->j=p->next->j+1;
p=p->next;
}
}
}
elsefirst=first->next;
if(flag==1)break;
}
if(first==null){
printf("内存不足.\n");
getch();
}
}
voidfreem()
{JCB*first,*second,*pp;
SPD*pre;
intadd=null,i;
intflag=0,flag1=0;
longtemp;
disp2();
printf("\n请输入要撤销的作业名:
");
jp=getpch(JCB);
scanf("%s",&jp->name);
jp->sadd=null;jp->xk=null;jp->next=null;
pre=rspd;
p=pre->next;
first=ready;
second=first->next;
/*寻找要撤销的作业,并撤销它*/
if(strcmp(first->name,jp->name)==0)
{
flag=1;
ready=second;
first->next=null;
add=first->sadd;
free(first);
}
while(flag==0&&second!
=null)
{
if(strcmp(second->name,jp->name)==0)
{
flag=1;
first->next=second->next;
second->next=null;
add=second->sadd;
free(second);
break;
}
if(second->next!
=null){
first=first->next;
second=second->next;
}
elsebreak;
}
/*找出作业的内存地址,释放之*/
if(add==pre->saddre&&flag==1){
flag1=1;
pre->state='e';
if(p->state=='e')
{
pre->len=p->len+pre->len;
pre->next=p->next;
p->next=null;
while(pre->next!
=null){
pre->next->j=pre->next->j-1;
pre=pre->next;
}
free(p);
}
}
while(flag==1&&flag1==0&&p!
=null)
{
i=add;
pp=ready;
if(add==p->saddre){
flag1=1;
p->state='e';
if(pre->state=='e'){
if(p->next!
=null&&p->next->state=='e'){
pre->len=pre->len+p->len+p->next->len;
pre->next=p->next;
p->next=null;
free(p);
p=pre->next;
pre->next=p->next;
p->next=null;
free(p);
p=rspd;
while(pre->next!
=null){
pre->next->j=pre->next->j-2;
pre=pre->next;
}
}
else{
pre->len=p->len+pre->len;
pre->next=p->next;
p->next=null;
free(p);
while(pre->next!
=null){
pre->next->j=pre->next->j-1;
pre=pre->next;
}
}
}
else{
if(p->next!
=null&&p->next->state=='e'){
p->len=p->len+p->next->len;
p->state='e';
pre=p->next;
p->next=p->next->next;
pre->next=null;
free(pre);
while(p->next!
=null){
p->next->j=p->next->j-1;
p=p->next;
}
}
elsep->state='e';
}
}/*if*/
if(flag1==1)break;
p=p->next;
pre=pre->next;
}/*while*/
if(flag==0)printf("\n作业不存在,无法撤消.\n");
if(flag1==1)
{printf("\n...正在撤消\n");
for(temp=1;temp<=30000000;temp++)
{};
printf("作业撤消完毕.\n");
}
free(jp);
disp0();
voiddisp0()
{/*显示空闲链表*/
JCB*first;
first=ready;
printf("\n主存空间的分配情况为:
\n");
printf("分区号作业名起始地址分区大小分配情况\n");
p=rspd;
while(p!
=null){
printf("%4d",p->j);
if(ready!
=null&&p->state=='f')
{
if(first!
=null)
{
printf("\t%s",first->name);
first=first->next;
}
}
if(p->state=='e')
printf("\t\t%4dkB",p->saddre);
else
printf("\t%4dkB",p->saddre);
printf("\t%4dkB",p->len);
if(p->state=='e')printf("未分配");
if(p->state=='f')printf("已分配");
printf("\n");
p=p->next;
}
}
voiddisp()
{disp0();
printf("按任意键返回选择执行操作.\n");
getch();
}
voidmain()
{/*界面*/
initm();
intc;
printf("****************************\n");
printf("*主存空间的分配与回收*\n");
printf("****************************\n");
printf("1.分配内存2.回收内存3.显示分配4.退出\n");
while
(1)
{
printf("\n请选择要执行的操作(1~4):
");
scanf("%d",&c);
if(c>4||c<1)
{
printf("输入错误,请重新输入:
\n");
continue;
}
switch(c){
case1:
allationm();break;
case2:
if(ready!
=null)freem();
else{printf("\n内存中没有作业.\n");
getch();
}
break;
case3:
disp();break;
case4:
gotoend;
}
}
end:
getchar();
}
5、程序运行时初值和运行结果
1.运行结果
(1)初始界面
(2)分配内存演示结果
(3)显示分配演示结果
(4)回收内存演示结果
6、实验总结
通过本次实验加深了对循环首次适应算法,内存分配与回收的机制的理解,也巩固了C++程序语言设计的基础。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 可变 分区 存储 管理
![提示](https://static.bdocx.com/images/bang_tan.gif)