/***************************************************
进程的调度算法
1.FCFS
2.SJF
3.RR
t=等待+运行=完成-到达
w=t/运行
2007/6/26
Made by LG
***************************************************/
#include "iostream"
#include "ctime"
#include "vector"
#include "string"
using namespace std;
typedef struct node
{
int name;
time_t arrive;
time_t run;
float ping;
float quan;
struct node *next;
}PCB;
long ot=-1;
float p_ping;
float p_quan;
PCB *init(int num)
{
time_t t;
PCB *head=new PCB;
PCB *s;
char ch[2];
PCB *r=new PCB;
cin.getline(ch,1,'/n');
cout<<"进程名将以顺序命名."<<endl;
time(&t);
srand(t);
for(int i=0;i<num;++i)
{
cin.getline(ch,1,'/n');
if(ch[0]==NULL)
{
time(&t);
s=new PCB;
s->name=i;
if(ot==-1)
{
ot=t;
}
s->arrive=t-ot;
s->run=rand()%20+1;
s->ping=0;
s->quan=0;
if(i==0)
{
head->next=s;
r->next=s;
r=s;
}
else
{
r->next=s;
r=s;
}
}
}
r->next=NULL;
r=NULL;
s=NULL;
delete s;
delete r;
return head;
}
void ismostlong(vector<PCB>::iterator iter,vector<PCB>& v1,vector<PCB>::iterator& answer,long tt)
{
vector<PCB>::iterator t;
t=v1.begin()+1;
long ts;
vector<PCB>::iterator most;
most=NULL;
ts=1000;
// tt=iter->arrive+iter->run;
for(;t!=v1.end();t++)
{
if(t->arrive>=0 && t->arrive<=tt)
{
if(ts>t->run)
{
most=t;
ts=most->run;
// break;
}
}
}
answer=most;
}
int main(void)
{
int jjhhgg;
PCB *head;
cout<<"要创建多少进程:";
cin>>jjhhgg;
head=init(jjhhgg);
PCB *temp=head->next;
vector<PCB> v1;
while(temp)
{
cout<<temp->name<<'/t'<<temp->arrive<<'/t'<<temp->run<<endl;
v1.push_back(*temp);
temp=temp->next;
}
cout<<"选择你要使用的调度算法。"<<endl;
cout<<"1.FCFS"<<endl;
cout<<"2.SJF"<<endl;
cout<<"3.RR"<<endl;
int choose;
cin>>choose;
if(choose==1) //完成
{
cout<<"执行顺序为:"<<endl;
int m=0;
vector<PCB>::iterator iter;
iter=v1.begin();
int wait=0;
while(iter!=v1.end())
{
cout<<iter->name<<" ";
iter->ping=wait+iter->run;
iter->quan=(float)(iter->ping/iter->run);
wait+=iter->run;
p_ping+=iter->ping;
p_quan+=iter->quan;
iter++;
}
cout<<endl;
cout<<"周转时间"<<'/t'<<"带权周转"<<'/t'<<"平均周转"<<'/t'<<"平均带权"<<endl;
for(iter=v1.begin();iter!=v1.end();++iter)
{
cout<<iter->ping<<'/t'<<'/t'<<iter->quan<<'/t'<<'/t'<<p_ping/jjhhgg<<'/t'<<'/t'<<p_quan/jjhhgg<<endl;
}
cout<<endl;
}
else if(choose==2)
{
long tim;
int wait=0;
vector<PCB> peihe;
vector<PCB>::iterator iter;
vector<PCB>::iterator answer;
iter=v1.begin();
cout<<"执行顺序为:"<<endl;
iter->ping=iter->run;
iter->quan=iter->ping/iter->run;
cout<<iter->name<<" ";
//等待时间
tim=iter->arrive+iter->run;
peihe.push_back(*iter);
wait=iter->run;
iter++;
int us=0;
for(;iter;iter++)
{
if(us==jjhhgg-1)
break;
ismostlong(iter,v1,answer,tim);
cout<<answer->name<<" ";
tim+=answer->run;
answer->ping=wait+answer->run;
answer->quan=answer->ping/answer->run;
wait+=answer->run;
p_ping+=answer->ping;
p_quan+=answer->quan;
peihe.push_back(*answer);
us++;
answer->arrive=-1;
}
cout<<endl;
cout<<"周转时间"<<'/t'<<"带权周转"<<'/t'<<"平均周转"<<'/t'<<"平均带权"<<endl;
for(iter=peihe.begin();iter!=peihe.end();++iter)
{
cout<<iter->ping<<'/t'<<'/t'<<iter->quan<<'/t'<<'/t'<<p_ping/jjhhgg<<'/t'<<'/t'<<p_quan/jjhhgg<<endl;
}
cout<<endl;
cout<<endl;
}
else if(choose==3) //完成
{
vector<PCB>::iterator iter;
iter=v1.begin();
int size;
cout<<"输入时间片大小:";
cin>>size;
cout<<"执行顺序为:"<<endl;
long now=iter->arrive;
int tol=0;
int kk;
int wait=0;
vector<int> v2;
vector<int>::iterator i;
int ss;
for(iter=v1.begin();iter!=v1.end();++iter)
{
ss=iter->run;
v2.push_back(ss);
}
iter=v1.begin();
while(true)
{
int ut=0,t; //防止运行时间少于周转时间情况的等待时间出错
if(iter->arrive<=now && iter->run>0)
{
t=iter->run;
kk=size;
while(kk>0)
{
kk--;
cout<<iter->name;
iter->run--;
iter->ping=++wait;
if(iter->run==0)
{
ut=1;
break;
}
}
if(ut==0)
now+=size;
else
now+=t;
}
if(iter->run<=0)
{
if(iter->name>=0)
{
iter->name=-1;
tol++;
}
else
{}
}
if(iter->next==NULL)
{
iter=v1.begin();
}
else
iter++;
if(tol==jjhhgg)
break;
}
cout<<endl;
i=v2.begin();
for(iter=v1.begin();iter!=v1.end();++iter)
{
iter->quan=iter->ping/(*i);
i++;
p_ping+=iter->ping;
p_quan+=iter->quan;
}
// p_ping/=jjhhgg;
// p_quan/=jjhhgg;
cout<<"周转时间"<<'/t'<<"带权周转"<<'/t'<<"平均周转"<<'/t'<<"平均带权"<<endl;
for(iter=v1.begin();iter!=v1.end();++iter)
{
cout<<iter->ping<<'/t'<<'/t'<<iter->quan<<'/t'<<'/t'<<p_ping/jjhhgg<<'/t'<<'/t'<<p_quan/jjhhgg<<endl;
}
cout<<endl;
}
return 0;
}