#include<iostream>
#include<iomanip>
#include <time.h>
using namespace std;
struct process
{
char name[10];//进程名字
int no;//进程序号
double arriveTime;//进程到达时间
double needTime;//进程需要时间
int state;//进程状态,0表示没有开始,1表示已经执行结束
int priority;//进程优先级
double startTime;//进程开始执行时间
double leftTime;//进程剩余时间
double endTime;//进程结束时间
double sysTime;
process *next;
};
process *head=NULL;
int count=0;//记录总的进程数
struct proces_despatch
{
char name[5];
int arrive_time;
int service_time;
int finish_time;
int turn_time;
float valueturn_time;
int type;
}proces[100];
int proces_number;
int turn_time;
void insert(process *current)
{
if(head!=NULL)
{
//如果只有一个结点
if(head->next==NULL)
{
//如果比链头到达时间早,则插入到链头
if(current->arriveTime<head->arriveTime)
{
current->next=head;
head=current;
}
else
{
current->next=NULL;
head->next=current;
}
}
//如果至少有2个结点
else
{
process *p1=head;
//如果插入链头
if(head->arriveTime>current->arriveTime)
{
current->next=head;
head=current;
}
else
{
int flag=1;
while(p1->next!=NULL)
{
//如果在两个结点之间,则插入
if(p1->arriveTime<current->arriveTime&&p1->next->arriveTime>current->arriveTime)
{
current->next=p1->next;
p1->next=current;
flag=0;
break;
}
else p1=p1->next;
}
//如果此结点到达时间最大,则加入到最后
if(flag=1)
{
p1->next=current;
current->next=NULL;
}
}
}
}
else head=current;
}
void createFCFS()
{
process *q1=new process;
cout<<"请输入进程总数目:";
cin>>count;
cout<<endl;
int number=1;
while(number<=count)
{
q1=new process;
q1->no=number;
cout<<"进程序号:#"<<number<<endl;
cout<<"进程名称:";
cin>>q1->name;
cout<<"进程到达时间:";
cin>>q1->arriveTime;
cout<<"进程所需时间:";
cin>>q1->needTime;
q1->next=NULL;
insert(q1);
number++;
cout<<endl<<endl;
}
}
void printFCFS()
{
process *p=new process;
double sysTime=0;
double turn=0;
if(head==NULL) cout<<"没有进程调度!"<<endl;
else if(head!=NULL)
{
head->startTime=head->arriveTime;
head->endTime=head->arriveTime+head->needTime;
sysTime=head->endTime;
turn=turn+(head->endTime-head->arriveTime);
p=head->next;
while(p!=NULL)
{
if(p->arriveTime>sysTime)
{
p->startTime=p->arriveTime;
p->endTime=p->startTime+p->needTime;
sysTime=p->endTime;
turn=turn+(p->endTime-p->arriveTime);
p=p->next;
}
else
{
p->startTime=sysTime;
p->endTime=p->startTime+p->needTime;
sysTime=p->endTime;
turn=turn+(p->endTime-p->arriveTime);
p=p->next;
}
}
}
cout.setf(ios::left);
cout<<setw(10)<<"进程序号"<<setw(10)<<"进程名"<<setw(10)<<"到达时间"<<setw(10)<<"开始时间"<<setw(10)<<"执行时间"<<setw(10)<<"结束时间"<<endl;
process *temp=head;
while(temp!=NULL)
{
cout.setf(ios::left);
cout<<setw(10)<<temp->no<<setw(10)<<temp->name<<setw(10)<<temp->arriveTime<<setw(10)<<temp->startTime<<setw(10)<<temp->needTime<<setw(10)<<temp->endTime<<endl;
temp=temp->next;
}
cout<<"平均周转时间:"<<turn/count<<endl;
while(head->next!=NULL)
{
process *t=new process;
t=head->next;
head->next=t->next;
delete t;
}
head=NULL;
}
void FCFS()
{
createFCFS();
printFCFS();
}
void createSJF()
{
process *q1=new process;
cout<<"请输入进程总数目:";
cin>>count;
cout<<endl;
int number=1;
while(number<=count)
{
q1=new process;
q1->no=number;
cout<<"进程序号:#"<<number<<endl;
cout<<"进程名称:";
cin>>q1->name;
cout<<"进程到达时间:";
cin>>q1->arriveTime;
cout<<"进程所需时间:";
cin>>q1->needTime;
q1->next=NULL;
insert(q1);
number++;
cout<<endl<<endl;
}
}
void changeSJF()
{
if(count>2)
{
process *n0=head;
process *n1=n0->next;
process *n2=n1->next;
for(int i=0;i<count-1;i++)
{
while(n1!=NULL&&n2!=NULL)
{
if(n1->needTime>n2->needTime)
{
n1->next=n2->next;
n0->next=n2;
n2->next=n1;
n1=n0->next;
n2=n0->next->next;
}
n0=n1;
n1=n2;
n2=n2->next;
}
}
}
}
void printSJF()
{
printFCFS();
}
void SJF()
{
createSJF();
changeSJF();
printSJF();
}
void RR()
{
time_t t;
srand((unsigned) time(&t));
cout<<"请输入轮转时间周期:"<<endl;
cin>>turn_time;
char proces_name[5];
cout<<"请输入要创建的进程个数:"<<endl;
cin>>proces_number;
for(int q=0;q<proces_number;q++)
{
cout<<"请输入第"<<q+1<<"进程名:"<<endl;
cin>>proces_name;
strcpy(proces[q].name, proces_name);
proces[q].arrive_time=q;
cout<<"请输入第"<<q+1<<"执行时间"<<endl;
cin>>proces[q].service_time;
}
cout<<"执行顺序:";
float average1=0,average2=0;
int flag=1;
int service_time[100];
int k;
for(k=0;k<proces_number;k++)
{
service_time[k]=proces[k].service_time;
}
for(k=0;k<proces_number;k++)
{
proces[k].finish_time=0;
proces[k].turn_time=0;
proces[k].valueturn_time=0;
proces[k].type=0;
}
while(flag)
{
int j,t,sum=0;
for(j=0;j<proces_number;j++)
{
if(proces[j].service_time>turn_time && proces[j].type==0)
{
for(t=0;t<proces_number;t++)
{
if(proces[t].type==0)
proces[t].finish_time=proces[t].finish_time+turn_time;
}
proces[j].service_time=proces[j].service_time-turn_time;
cout<<proces[j].name;
}
else if(proces[j].service_time==turn_time && proces[j].type==0)
{
for(t=0;t<proces_number;t++)
{
if(proces[t].type==0)
proces[t].finish_time=proces[t].finish_time+turn_time;
}
proces[j].service_time=proces[j].service_time-turn_time;
proces[j].type=1;
cout<<proces[j].name;
}
else if(proces[j].service_time<turn_time && proces[j].type==0)
{
for(t=0;t<proces_number;t++)
{
if(proces[t].type==0)
proces[t].finish_time=proces[t].finish_time+proces[j].service_time;
}
proces[j].service_time=0;
proces[j].type=1;
cout<<proces[j].name;
}
else
continue;
}
for(j=0;j<proces_number;j++)
{
if(proces[j].type==1)
sum++;
}
if(sum==proces_number)
flag=0;
}
cout<<endl;
int s;
for(s=0;s<proces_number;s++)
{
proces[s].service_time=service_time[s];
}
for(s=0;s<proces_number;s++)
{
proces[s].turn_time=proces[s].finish_time-proces[s].arrive_time;
}
for(s=0;s<proces_number;s++)
{
proces[s].valueturn_time=float(proces[s].turn_time)/float(proces[s].service_time);
}
int i=0;
cout<<"\t";
for(i=0;i<proces_number;i++)
{
cout<<proces[i].name<<"\t";
}
cout<<endl<<"到达时间\t";
for(i=0;i<proces_number;i++)
{
cout<<proces[i].arrive_time<<"\t";
}
cout<<endl<<"执行时间\t";
for(i=0;i<proces_number;i++)
{
cout<<proces[i].service_time<<"\t";
}
cout<<endl<<"完成时间\t";
for(i=0;i<proces_number;i++)
{
cout<<proces[i].finish_time<<"\t";
}
cout<<endl<<"周转时间\t";
for(i=0;i<proces_number;i++)
{
cout<<proces[i].turn_time<<"\t";
}
cout<<endl<<endl;
for(i=0;i<proces_number;i++)
{
average1=average1+proces[i].turn_time;
}
cout<<"平均周转时间:"<<average1/proces_number<<endl;
}
void changeMLFS()
{
if(count>2)
{
process *n0=head;
process *n1=n0->next;
process *n2=n1->next;
for(int i=0;i<count-1;i++)
{
while(n1!=NULL&&n2!=NULL)
{
if(n1->priority<n2->priority)
{
n1->next=n2->next;
n0->next=n2;
n2->next=n1;
n1=n0->next;
n2=n0->next->next;
}
n0=n1;
n1=n2;
n2=n2->next;
}
}
}
}
void createMLFS()
{
process *q1=new pro
- 1
- 2
前往页