当前位置:文档之家› 操作系统实验内存分配(链表实现)

操作系统实验内存分配(链表实现)

{//因为要进行插入操作,所以传的是要分配内存块的前指针
memory *p=q->next;
memory *temp=new memory;
temp=new memory;//代表进程pro的内存块
temp->begin=p->begin;
temp->size=size;
temp->pro=pro;
{
min=p->size;
front=q;
temp=p;
}
q=p;
p=p->next;
}
if(temp==NULL)return 0;//没找到,返回0
else
{
if(manage==0)temp->pro=pro;//静态,直接让进程进驻内存
else assign(front,pro,size);//动态,调用assign来给进程pro分配
}
}
}
}
return 1;
}
void print(char ch,int begin,int size)//根据内存块内容,格式化输入一块内存块
{
switch(ch)
{
case 'o':printf("操作系统区\t%3dk\t%3dk~%3dk\n",size,begin,begin+size-1);break;
else//找到了,返回1
{
if(manage==0)p->pro=0;//静态内存,直接撤销进程,不用内存块合并
else//动态内存,可能要进行内存合并,分4种情况
{
if(q->pro!=0)
{
if(p->next==NULL||p->next->pro!=0)//前后内存块都不是空闲块
p->pro=0;
{
max=p->size;
front=q;
temp=p;
}
q=p;
p=p->next;
}
if(temp==NULL)return 0;//没找到,返回0
else//找到了,返回1
{
if(manage==0)temp->pro=pro;//静态,直接让进程进驻内存
else assign(front,pro,size);//动态,调用assign来给进程pro分配
else if(choice=='3')break;
childmenu(manage);
}
}
q->begin=5;
q->pro=0;
q->size=20;
p->next=q;
p=q;
q=new memory;//空闲块2,大小50,起始地址25k
q->begin=25;
q->pro=0;
q->size=50;
p->next=q;
p=q;
q=new memory;//空闲块3,大小30,起始地址75k
{
assign_pro(manage);system("pause");
}
else if(choice=='2')
{
del_pro(manage);system("pause");
}
else if(choice=='3')break;
}
}
void main()
{
char choice;
int manage;
else
{
result=delpro(manage,pro);
if(result==0)cout<<"没有找到进程"<<pro<<",撤销失败"<<endl;
else cout<<"进程"<<pro<<"撤销成功"<<endl;
}
}
void assign_pro(int manage)//给进程pro根据选择情况分配内存
else if(result==1)cout<<"进程"<<pro<<"分配成功"<<endl;
else cout<<"输入错误"<<endl;
}
void childmenu(int manage)//子菜单
{
char choice;
init(manage);
while(1)
{
system("cls");
delete p;
p=q;
}
}
base=new memory; //操作系统,大小5k,起始地址是0k
base->begin=0;
base->pro='o';
base->size=5;
if(manage==0)//静态内存,初始化7个内存块,第一个内存块是操作系统
{
p=base;
q=new memory;//空闲块1,大小20,起始地址5k
switch(choose)
{
case '1':
result=ff(manage,pro,size);
break;
case '2':
result=bf(manage,pro,size);
break;
case '3':
result=wf(manage,pro,size);
break;
}
if(result==0)cout<<"进程"<<pro<<"分配失败"<<endl;
}
return 1;
}
int delpro(int manage,char pro)//撤销进程,可能要进行内存块的合并
{
memory *p=base,*q;
while(p)//遍历内存,寻找进程pro
{
if(p->pro!=pro)
{
q=p;
p=p->next;
}
else break;
}
if(p==NULL)return 0;//没找到,返回0
q->begin=75;
q->pro=0;
q->size=30;
p->next=q;
p=q;
q=new memory;//空闲块4,大小45,起始地址105k
q->begin=105;
q->pro=0;
q->size=45;
p->next=q;
p=q;
q=new memory;//空闲块5,大小54,起始地址150k
{
q->next=p->next;
q->size=q->size+p->size;
delete p;
}
else//前后内存块都是空闲块
{
q->next=p->next->next;
q->size=q->size+p->size+p->next->size;
delete p->next;
delete p;
case 0 :printf("空闲区\t%3dk\t%3dk~%3dk\n",size,begin,begin+size-1);break;
default :printf("进程%c \t%3dk\t%3dk~%3dk\n",ch,size,begin,begin+size-1);break;
}
}
p=p->next;
}
else break;
}
if(p==NULL)return 0;//没找到,返回0
else//找到了,返回1
{
if(manage==0)p->pro=pro;//静态,直接让进程进驻内存
else assign(q,pro,size);//动态,调用assign来给进程pro分配
delete p;
}
}
int ff(int manage,char pro,int size)//最先适应法
{
memory *p=base;
memory *q=p;
while(p)//遍历内存找到第一个适合进程pro的内存块,保存它的前指针
{
if(p->size<size||p->pro!=0)
{
q=p;
void show()//格式化显示内存的储存情况
{
memory *p=base;
int count=1;
cout<<"内存现在的储存情况是:"<<endl;
printf("块号\t内容\t\t大小\t起始-结束地址\n");
while(p)
{
printf(" %2d ",count++);
print(p->pro,p->begin,p->size);
else//前内存块不是空闲块,后内存块是空闲块
{
q->next=p->next;
p->next->begin=p->begin;
相关主题