1.进程调度
#include<bits/stdc++.h>
using namespace std;
const int Round=2;
const int Cut=3;
int N,number,pos,p;
queue<int> wait;
queue<int> finish;
priority_queue<pair<int,int>> wait1;//暂时存储wait2的值
priority_queue<pair<int,int>> wait2;//先比较pair里第一个
//priority_queue<pair<int,int>> finish2;
pair<int,int> pp,pp0;
struct node
{
int id;
string name;
int needtime;
int pri;
int cputime;
int count;
char state;//0代表W 1代表R 2代表F
bool operator<(const node &x)
{
return pri<x.pri;
}
}a[25];
bool cmp(int x,int y)
{
return x>y;
}
void Print1()
{
cout<<"Name cputime needtime count round state"<<endl;
p=pos;
if(a[pos].state=='R')
cout<<a[p].name<<' '<<a[p].cputime<<' '<<a[p].needtime<<' '<<a[p].count<<' '<<Round<<' '<<a[p].state<<endl;
if(wait.size())
{
for(int i=0;i<wait.size();i++)
{
p=wait.front();
cout<<a[p].name<<' '<<a[p].cputime<<' '<<a[p].needtime<<' '<<a[p].count<<' '<<Round<<' '<<a[p].state<<endl;
wait.push(wait.front());
wait.pop();
}
}
if(finish.size())
{
for(int i=0;i<finish.size();i++)
{
p=finish.front();
cout<<a[p].name<<' '<<a[p].cputime<<' '<<a[p].needtime<<' '<<a[p].count<<' '<<Round<<' '<<a[p].state<<endl;
finish.push(finish.front());
finish.pop();
}
}
cout<<"就绪队列:";
if(wait.size()!=0)
{
cout<<a[wait.front()].name;
wait.push(wait.front());
wait.pop();
for(int i=1;i<wait.size();i++)
{
cout<<"、"<<a[wait.front()].name;
wait.push(wait.front());
wait.pop();
}
}
cout<<endl;
cout<<"完成队列:";
if(finish.size()!=0)
{
cout<<a[finish.front()].name;
finish.push(finish.front());
finish.pop();
for(int i=1;i<finish.size();i++)
{
cout<<"、"<<a[finish.front()].name;
finish.push(finish.front());
finish.pop();
}
}
cout<<endl;
}
void Rounds()
{
cout<<"input name and needtime:"<<endl;
for(int i=1;i<=N;i++)
{
cin>>a[i].name;
cin>>a[i].needtime;
a[i].state='W';
wait.push(i);
}
pos=1;
Print1();
while(wait.size())
{
pos=wait.front();
wait.pop();
a[pos].state='R';
Print1();
if(a[pos].needtime<=Round)
{
a[pos].cputime+=a[pos].needtime;
a[pos].needtime=0;
a[pos].state='F';
a[pos].count+=1;
finish.push(pos);
}
else
{
a[pos].cputime+=Round;
a[pos].needtime-=Round;
a[pos].state='W';
a[pos].count+=1;
wait.push(pos);
}
}
Print1();
}
void Print2()
{
cout<<"Name cputime needtime count pri state"<<endl;
if(a[pos].state=='R')
{
p=pos;
cout<<a[p].name<<' '<<a[p].cputime<<' '<<a[p].needtime<<' '<<a[p].count<<' '<<a[p].pri<<' '<<a[p].state<<endl;
}
if(wait2.size())
{
int len=wait2.size();
for(int i=0;i<len;i++)
{
pp=wait2.top();
p=N-pp.second;
cout<<a[p].name<<' '<<a[p].cputime<<' '<<a[p].needtime<<' '<<a[p].count<<' '<<a[p].pri<<' '<<a[p].state<<endl;
wait1.push(pp);
wait2.pop();
}
while(wait1.size())
{
wait2.push(wait1.top());
wait1.pop();
}
}
if(finish.size())
{
for(int i=0;i<finish.size();i++)
{
p=finish.front();
cout<<a[p].name<<' '<<a[p].cputime<<' '<<a[p].needtime<<' '<<a[p].count<<' '<<a[p].pri<<' '<<a[p].state<<endl;
finish.push(finish.front());
finish.pop();
}
}
cout<<"就绪队列:";
if(wait2.size()!=0)
{
cout<<a[N-wait2.top().second].name;
wait1.push(wait2.top());
wait2.pop();
int len=wait2.size();
for(int i=0;i<len;i++)
{
cout<<"、"<<a[N-wait2.top().second].name;
wait1.push(wait2.top());
wait2.pop();
}
}
cout<<endl;
while(wait1.size())
{
wait2.push(wait1.top());
wait1.pop();
}
cout<<"完成队列:";
if(finish.size()!=0)
{
cout<<a[finish.front()].name;
finish.push(finish.front());
finish.pop();
for(int i=1;i<finish.size();i++)
{
cout<<"、"<<a[finish.front()].name;
finish.push(finish.front());
finish.pop();
}
}
cout<<endl;
}
void Priority()
{
cout<<"input name and needtime:"<<endl;
for(int i=1;i<=N;i++)
{
cin>>a[i].name;
cin>>a[i].needtime;
a[i].pri=50-a[i].needtime;
a[i].state='W';//全部处于准备状态
a[i].id=i;
wait2.push(make_pair(a[i].pri,N-a[i].id));
//cout<<a[i].pri<<' '<<N-a[i].id<<endl;
}
pos=N-wait2.top().second;
Print2();
while(wait2.size())
{
pp0=wait2.top();//wait保存的是排序后a数组的下标
pos=N-pp0.second;//用N-pp.second得到下标
wait2.pop();
a[pos].state='R';
Print2();
if(a[pos].needtime<=Round)
{
a[pos].cputime+=a[pos].needtime;
a[pos].needtime=0;
a[pos].count+=1;
a[pos].state='F';
finish.push(pos);
}
else
{
a[pos].cputime+=Round;
a[pos].needtime-=Round;
a[pos].count+=1;
a[pos].pri-=Cut;
a[pos].state='W';
wait2.push(make_pair(a[pos].pri,N-a[pos].id));
}
}
Print2();
}
int main()
{
cout<<"输入进程数:"<<endl;
cin>>N;
cout<<"本实验包含两个调度算法,选择时间片轮转法(时间片为 2)输入1,选择优先数算法输入2:"<<endl;
cin>>number;
if(number==1) Rounds();
else Priority();
}
2.资源分配算法
#include<bits/stdc++.h>
using namespace std;
int avail[25],avail1[25],initavail[25];
int rnum,pnum,f=0,ip,choose;
queue<int> q,q1;
char c;
struct node
{
string name;
int maxi[25];
int need[25];
int allo[25];//allocation
}p[25],init[25];
int judge()//判断q1内是否存在顺序能够保证安全
{
int vis=1,cnt=0;
while(q1.size())
{
if(cnt==q1.size())
{
vis=0;
break;
}
f=1;
ip=q1.front();
for(int i=1;i<=rnum;i++)
{
if(p[ip].need[i]>avail1[i])
{
f=0;
break;
}
}
if(f==0) cnt++,q1.push(ip);
else
{
for(int i=1;i<=rnum;i++)
{
avail1[i]+=p[ip].allo[i];
}
cnt=0;
}
q1.pop();
}
if(choose==1&&vis==0&&q1.size()==q.size())
cout<<"RESOURCE INSECURITY!!!"<<endl<<"CUSTOMERS CAN NOT OBTAIN RESOURCES IMMEDIATELY.";
else if(choose==1&&vis==0)
cout<<"SYSTEM INSUFFICIENT!!!"<<endl<<"CUSTOMERS CAN NOT OBTAIN RESOURCES IMMEDIATELY.";
return vis;
}
void Banker()
{
if(choose==1)
{
if(judge()==0) return;
cout<<"Name\tWork\tNeed\tallocation\tWork+Allocation\tFinish"<<endl;
}
while(q.size())
{
//cout<<q.size()<<endl;
f=1;
ip=q.front();
for(int i=1;i<=rnum;i++)
{
if(p[ip].need[i]>avail[i])
{
f=0;
break;
}
}
if(f==0) q.push(ip);
else
{
cout<<p[ip].name<<"\t";
for(int i=1;i<=rnum;i++)
cout<<avail[i]<<' ';
cout<<"\t";
for(int i=1;i<=rnum;i++)
cout<<p[ip].need[i]<<" ";
cout<<"\t";
for(int i=1;i<=rnum;i++)
cout<<p[ip].allo[i]<<" ";
cout<<"\t\t";
for(int i=1;i<=rnum;i++)
{
avail[i]+=p[ip].allo[i];
cout<<avail[i]<<" ";
}cout<<"\t\tT"<<endl;
}
q.pop();
}cout<<"SYSTEM SECURITY!!!";
}
void Security()
{
cout<<"Please input the customer’s name and request:"<<endl;
string s;
int a;
cin>>s;
ip=0;
for(int i=1;i<=pnum;i++)
{
if(s==p[i].name)
{
ip=i;
break;
}
}
if(ip==0)
{
cout<<"Can't find"<<endl;
return;
}//cout<<ip<<endl;
f=1;
for(int i=1;i<=rnum;i++)
{
cin>>a;
if(a<=avail[i]&&a<=p[ip].need[i])
{
avail[i]-=a;
p[ip].need[i]-=a;
p[ip].allo[i]+=a;
}
else f=0;
}
int iip=ip;
int f1=1;
for(int i=1;i<=rnum;i++)
{
if(avail[i]<p[ip].need[i])
{
f1=0;
break;
}
}
//judge()必须从第一个开始 这里要改 q1和avail1
if(f1==1)
{
for(int i=1;i<=rnum;i++)
{
avail1[i]+=p[ip].allo[i];
}
while(q1.size()) q1.pop();
for(int i=1;i<=pnum;i++)
{
if(i!=ip) q1.push(i);
}
if(judge()==0) f1=0;
}
if(f==0) cout<<"SYSTEM INSUFFICIENT!!!"<<endl<<"CUSTOMER "<<s<<" CAN NOT OBTAIN RESOURCES IMMEDIATELY.";
else if(f1==0) cout<<"RESOURCE INSECURITY!!!"<<endl<<"CUSTOMER "<<s<<" CAN NOT OBTAIN RESOURCES IMMEDIATELY";
else
{
ip=iip;
cout<<"Name\tWork\tNeed\tallocation\tWork+Allocation\tFinish"<<endl;
cout<<p[ip].name<<"\t";
for(int i=1;i<=rnum;i++)
cout<<avail[i]<<' ';
cout<<"\t";
for(int i=1;i<=rnum;i++)
cout<<p[ip].need[i]<<" ";
cout<<"\t";
for(int i=1;i<=rnum;i++)
cout<<p[ip].allo[i]<<" ";
cout<<"\t\t";
for(int i=1;i<=rnum;i++)
{
avail[i]+=p[ip].allo[i];
cout<<avail[i]<<" ";
}cout<<"\t\tT"<<endl;
while(q.size()) q.pop();
for(int i=1;i<=pnum;i++)
{
if(i!=ip) q.push(i);
}
Banker();
cout<<endl<<"CUSTOMER "<<s<<" CAN GET RESOURCES IMMEDIATELY.";
}
}
int main()
{
cout<<"Input the type of resource and number of customer:"<<endl;
cin>>rnum>>pnum;//rnum是资源种类数 pnum是进程数
cout<<"Input the amount of resource (maximum , allocated) of each customer:"<<endl;
for(int i=1;i<=pnum;i++)
{
cin>>init[i].name;
// cin>>init[i].maxi[1];
// for(int j=2;j<=rnum;j++) cin>>c>>init[i].maxi[j];
// cin>>init[i].allo[1];
// for(int j=2;j<=rnum;j++) cin>>c>>init[i].allo[j];
for(int j=1;j<=rnum;j++) cin>>init[i].maxi[j];
for(int j=1;j<=rnum;j++) cin>>init[i].allo[j];
}
cout<<"Input the amout of resources(available):"<<endl;
// cin>>initavail[1];
// for(int i=2;i<=rnum;i++) cin>>c>>initavail[i];
for(int i=1;i<=rnum;i++) cin>>initavail[i];
while(1)
{
while(q.size()) q.pop();
while(q1.size()) q1.pop();
for(int i=1;i<=pnum;i++)
{
p[i].name=init[i].name;
for(int j=1;j<=rnum;j++) p[i].maxi[j]=init[i].maxi[j];
for(int j=1;j<=rnum;j++) p[i].allo[j]=init[i].allo[j];
for(int j=1;j<=rnum;j++) p[i].need[j]=p[i].maxi[j]-p[i].allo[j];
q.push(i);
q1.push(i);
}
for(int i=1;i<=rnum;i++) avail[i]=initavail[i],avail1[i]=avail[i];
cout<<endl<<"可以进行菜单选择进入银行家算法和安全性检测"<<endl;
cout<<"1、judge the system security"<<endl;
cout<<"2、judge the request security"<<endl;
cout<<"3、quit"<<endl;
cin>>choose;
if(choose==1) Banker();
else if(choose==2) Security();
else break;
}
}
//p0 7 5 3 0 1 0
//p1 3 2 2 2 0 0
//p2 9 0 2 3 0 2
//p3 2 2 2 2 1 1
//p4 4 3 3 0 0 2
//p0 7,5,3 0,1,0
//p1 3,2,2 2,0,0
//p2 9,0,2 3,0,2
//p3 2,2,2 2,1,1
//p4 4,3,3 0,0,2
3.存储管理分区分配算法
#include<bits/stdc++.h>
using namespace std;
string s;
int num,index,tempadr,tempend,tempsize;
struct node
{
int adr;//起点
int end;
int size;
}p[105],pp[105];
bool cmp1(node x,node y)
{
return x.size<y.size;
}
bool cmp2(node x,node y)
{
return x.adr<y.adr;
}
void Print1()
{
sort(p+1,p+index+1,cmp1);
cout<<"Index\t*\tadr\t*\tend\t*\tsize"<<endl;
if(index==0)
{
return;
}
for(int i=1;i<=index;i++)
{
cout<<i<<"\t\t"<<p[i].adr<<"\t\t"<<p[i].end<<"\t\t"<<p[i].size<<endl;
}
}
void Best()
{
while(1)
{
cout<<"Assign or Accept:";
cin>>s;
if(s=="as")
{
cout<<"input APPLACATION: ";
cin>>num;
int f=0;
for(int i=1;i<=index;i++)
{
if(p[i].size>=num)
{
p[i].size-=num;
p[i].end-=num;
f=1;
cout<<"SUCCESS!!! ADDRESS="<<p[i].end+1<<endl;
if(p[i].size==0)
{
if(index==1)
{
index=0;
break;
}
for(int j=i+1;j<=index;j++)
{
p[j-1].adr=p[j].adr;
p[j-1].end=p[j].end;
p[j-1].size=p[j-1].size;
}
index--;
break;
}
}
}
if(f==0)
{
if(index==0) cout<<"LIST IS EMPTY!"<<endl;
else cout<<"Too large application!"<<endl;
}
Print1();
}
else if(s=="ac")
{
int f=0;
cout<<"Input adr and size:";
cin>>tempadr>>tempsize;tempend=tempadr+tempsize-1;
for(int i=1;i<=index;i++)
{
pp[i].adr=p[i].adr;
pp[i].end=p[i].end;
pp[i].size=p[i].size;
}
sort(pp+1,pp+index+1,cmp2);
for(int i=1;i<=index-1;i++)
{
if(tempadr>pp[i].end+1&&tempend<pp[i+1].adr-1)
{
f=i;
break;
}
}
if(f==0)
{
if(tempend<pp[1].adr-1)
{
index++;
p[index].adr=tempadr;
p[index].end=tempend;
p[index].size=p[index].end-p[index].adr+1;
}
else if(tempend==pp[1].adr-1)
{
for(int i=1;i<=index;i++)
{
if(tempend==p[i].adr-1)
{
p[i].adr=tempadr;
p[i].size=p[i].end-p[i].adr+1;
break;
}
}
}
else if(tempadr>pp[index].end+1)
{
index++;
p[index].adr=tempadr;
p[index].end=tempend;
p[index].size=p[index].end-p[index].adr+1;
}
else if(tempadr==pp[index].end+1)
{
for(int i=1;i<=index;i++)
{
if(tempadr==p[i].end+1)
{
p[i].end=tempend;
p[i].size=p[i].end-p[i].adr+1;
}
}
}
else
{
for(int i=1;i<=index-1;i++)
{
if(tempadr==pp[i].end+1&&tempend<pp[i+1].adr-1)
{
for(int j=1;j<=index;j++)
{
if(tempadr==p[j].end+1)
{
p[j].end=tempend;
p[j].size=p[j].end-p[j].adr+1;
}
}
f=1;
break;
}
else if(tempend==pp[i+1].adr-1&&tempadr>pp[i].end+1)
{
for(int j=1;j<=index;j++)
{
if(tempend==p[j].adr-1)
{
p[j].adr=tempadr;
p[j].size=p[j].end-p[j].adr+1;
}
}
f=1;
break;
}
else if(tempend==pp[i+1].adr-1&&tempadr==pp[i].end+1)
{
pp[i].end=pp[i+1].end;
pp[i].size=pp[i].end-pp[i].adr+1;
for(int j=i+2;j<=index;j++)
{
pp[j-1].adr=pp[j].adr;
pp[j-1].end=pp[j].end;
pp[j-1].size=pp[j].size;
}
index--;
for(int i=1;i<=index;i++)
{
p[i].adr=pp[i].adr;
p[i].end=pp[i].end;
p[i].size=pp[i].size;
}
f=1;
break;
}
}if(f==0) cout<<"回收和空闲区域重复"<<endl;
}
}
else//pp[f]
{
index++;
p[index].adr=tempadr;
p[index].end=tempend;
p[index].size=tempsize;
}
Print1();
}
else if(s=="exit") break;
else cout<<"INPUT ERROR"<<endl;
}
}
int main()
{
while(1)
{
index=1;p[1].adr=0;p[1].end=32766;p[1].size=32767;
Print1();
cout<<"input the way (best or first):";
cin>>s;
if(s=="best") Best();
else if(s=="new") continue;
else if(s=="exit") break;
else cout<<"INPUT ERROR"<<endl;
}
}