📄 4best.cpp
字号:
#include<iostream.h>
#include<stdlib.h>
#include<math.h>
const int maxmemory=80;
const int maxproc=maxmemory/2;
const int atime=500;
struct node{
int name;
int begin;
int end;
int status;
int time;
};
class list
{
private:
node use[maxmemory];
node unuse[maxmemory];
int worklist[maxmemory];
int worknum;
public:
list()
{
for(int i=0;i<maxmemory;i++)
{
use[i].name=i;
unuse[i].name=i;
use[i].status=0;
unuse[i].status=0;
use[i].time=0;
unuse[i].time=0;
}
unuse[0].begin=0;
unuse[0].end=maxmemory-1;
unuse[0].status=1;
worknum=0;
}
void integrate()
{
int flag[maxmemory],start=0;
for(int i=0;i<maxmemory;i++)
if(use[i].status==1)
flag[i]=1;
else
flag[i]=0;
for(i=0;i<maxmemory;i++)
{
int min=maxmemory+1,tag=-1;
for(int j=0;j<maxmemory;j++)
if(use[j].status==1&&flag[j]==1&&use[j].begin<min)
{
min=use[j].begin;
tag=j;
}
if(tag!=-1&&use[tag].begin!=start)
{
show(tag,3,5);
use[tag].end=use[tag].end-use[tag].begin+start;
use[tag].begin=start;
start=use[tag].end+1;
flag[tag]=0;
}
else
if(tag!=-1)
{
start=use[tag].end+1;
flag[tag]=0;
}
unuse[i].status=0;
}
unuse[0].status=1;
unuse[0].begin=start;
unuse[0].end=maxmemory-1;
}
/*void integrate()
{
int start=0;
for(int i=0;i<maxmemory;i++)
{
if(use[i].status==1)
{
show(i,3,5);
int temp=use[i].end-use[i].begin;
use[i].begin=start;
use[i].end=use[i].begin+temp;
start=use[i].end+1;
}
unuse[i].status=0;
}
unuse[0].status=1;
unuse[0].begin=start;
unuse[0].end=maxmemory-1;
}*/
int findmin(int size)
{
int minsize=maxmemory+1,flag=-1;
for(int i=0;i<maxmemory;i++)
if(unuse[i].status==1&&(unuse[i].end-unuse[i].begin+1)>=size&&(unuse[i].end-unuse[i].begin+1)<minsize)
{
if((unuse[i].end-unuse[i].begin+1)==size)
return i;
else
{
minsize=unuse[i].end-unuse[i].begin+1;
flag=i;
}
}
return flag;
}
int creatework()
{
if(worknum<=0)
{
int size;
cout<<"请输入作业的大小!(不超过"<<maxmemory<<")"<<endl;
cin>>size;
if(size>maxmemory||size<=0)
cout<<"你输入的作业太大或太小,无法运行!"<<endl;
else
{
int flag=findmin(size);
int sum=0;
for(int i=0;i<maxmemory;i++)
if(unuse[i].status==1)
sum+=unuse[i].end-unuse[i].begin+1;
if(flag==-1&&sum<size)
{
worklist[worknum]=size;
worknum++;
return 0;
}
else
{
if(flag==-1)
{
integrate();
flag=0;
}
int tag=-1;
for(int i=0;i<maxmemory&&tag<=-1;i++)
if(use[i].status==0)
tag=i;
if(tag==-1)
{
cout<<"已分配表已经满了,无法填写分配表!!"<<endl;
return -1;
}
else
{
use[tag].begin=unuse[flag].begin;
use[tag].end=use[tag].begin+size-1;
use[tag].time=(int(sqrt(size))+1)*atime;
use[tag].status=1;
unuse[flag].begin+=size;
if(unuse[flag].begin>unuse[flag].end)
unuse[flag].status=0;
show(tag,0,3);
return 1;
}
}
}
}
else
{
int flag=findmin(worklist[0]);
int sum=0;
for(int i=0;i<maxmemory;i++)
if(unuse[i].status==1)
sum+=unuse[i].end-unuse[i].begin+1;
if(flag==-1&&sum<worklist[0])
return 0;
else
{
if(flag==-1)
{
integrate();
flag=0;
}
int tag=-1;
for(int i=0;i<maxmemory&&tag==-1;i++)
if(use[i].status==0)
tag=i;
if(tag==-1)
{
cout<<"已分配表已经满了,无法填写分配表!"<<endl;
return -1;
}
else
{
use[tag].begin=unuse[flag].begin;
use[tag].end=use[tag].begin+worklist[0]-1;
use[tag].status=1;
use[tag].time=(int(sqrt(worklist[0]))+1)*atime;
unuse[flag].begin+=worklist[0];
if(unuse[flag].begin>unuse[flag].end)
unuse[flag].status=0;
for(int j=0;j<worknum-1;j++)
worklist[j]=worklist[j+1];
worknum--;
show(tag,0,3);
return 1;
}
}
}
return -1;
}
void recycled()
{
for(int i=0;i<maxmemory;i++)
if(use[i].status==1&&use[i].time<=0)
{
int p=-1;
for(int j=0;j<maxmemory&&p<=-1;j++)
if(unuse[j].status==0)
p=j;
if(p<=-1)
{
cout<<"空闲表满了!"<<endl;
exit(0);
}
else
{
show(i,2,5);
unuse[p].status=1;
unuse[p].begin=use[i].begin;
unuse[p].end=use[i].end;
use[i].status=0;
}
}
for(i=0;i<maxmemory;i++)
for(int j=0;j<maxmemory;j++)
{
if(unuse[i].status==1&&unuse[j].status==1&&i!=j)
{
if(unuse[i].begin==unuse[j].end+1)
{
unuse[i].begin=unuse[j].begin;
unuse[j].status=0;
}
else
if(unuse[j].begin==unuse[i].end+1)
{
unuse[i].end=unuse[j].end;
unuse[j].status=0;
}
}
}
for(i=0;i<maxmemory;i++)
if(use[i].status==1&&use[i].time>0)
{
show(i,1,5);
use[i].time-=atime;
}
}
void cls()
{
char cls[4]="cls";
system(cls);
}
void show(int tag,int type,int times)//type==0表示加入进程,1表示运行进程,2表示运行完毕,3表示合并区间
{
int flag=65,temp=97;
char ch[maxmemory];
for(int i=0;i<maxmemory;i++)
{
if(use[i].status==1)
{
for(int j=use[i].begin;j<=use[i].end;j++)
ch[j]=char(flag);
if(i==tag)
temp=flag;
flag++;
}
}
for(i=0;i<maxmemory;i++)
if(!(ch[i]>='A'&&int(ch[i])<flag))
ch[i]='-';
times=3;
for(i=0;i<times;i++)
{
if(i%2==0)
{
cls();
cout<<" 可变分区管理方式的主存分配回收模拟"<<endl<<endl;
for(int j=use[tag].begin;j<=use[tag].end;j++)
ch[j]=char(temp);
for( j=0;j<maxmemory;j++)
cout<<ch[j];
cout<<endl;
}
else
{
cls();
cout<<" 可变分区管理方式的主存分配回收模拟"<<endl<<endl;
for(int j=use[tag].begin;j<=use[tag].end;j++)
ch[j]=' ';
for(j=0;j<maxmemory;j++)
cout<<ch[j];
cout<<endl;
}
if(type==0)
cout<<" 位于区间"<<use[tag].begin<<"---"<<use[tag].end<<"的作业被载入!"<<endl;
else
if(type==1)
cout<<" 位于区间"<<use[tag].begin<<"---"<<use[tag].end<<"的作业在运行!"<<endl;
else
if(type==2)
cout<<" 位于区间"<<use[tag].begin<<"---"<<use[tag].end<<"的作业运行完毕,被回首!"<<endl;
else
cout<<" 空余区间进行合并!"<<endl;
cout<<" 作业队列中的情况如下:"<<endl;
if(worknum>0)
{
cout<<" ";
for(int x=0;x<worknum;x++)
cout<<worklist[x]<<"--";
cout<<endl;
}
else
cout<<" 作业队列中为空!"<<endl;
for(int k=0;k<50;k++)
for(int p=0;p<500;p++)
cout<<' '<<'\b';
}
}
};
void main()
{
list mylist;
while(1)
{
mylist.creatework();
mylist.recycled();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -