/*
程序采用FCFS算法模拟作业运行,程序运行时先输入作业个数,并依次输入作业信息,通过
插入函数将作业按SJF算法排序(注:在当前作业运行结束时刻还未到达的作业将不参与排
序及竞争CPU),运行时,按照事先排好的顺序一次模拟运行作业,并在作业结束是显示周
转时间、带权周转时间 并释放空间。所有作业运行完后将平均周转时间、平均带权周转时
间计算出来并显示。
*/
#include<iostream>
#include<string>
using namespace std;
#define null 0
int Runtime=0;//CPU时刻跟踪变量
float T_time=0;//总周转时间
float W_time=0;//总带权周转时间
int marktime=0;//输入排队时运行标记时间
int n;
typedef struct jcb{
string name;
int Ttime;
int Rtime;
int Sourse;
char State;
struct jcb *next;
}JCB;//作业信息块
JCB *head=null,*p,*q;
void insert()//向链表插入作业的函数
{
if(head==null)
{
p->next=head;
head=p;
q=head;
marktime=head->Rtime;
}
else {
JCB *temp=q;
while(1)
{
if(temp->next==null||temp->next->Rtime>p->Rtime)
{p->next=temp->next;
temp->next=p;
break;}
temp=temp->next;
}
}
}
int randtime(int T,int R)//根据前一个作业到达时间及总完成时间产生当前作业到来的随机时间
{
return T+rand()%(R-T-1)+1;
}
void display(JCB *pr)//显示pr指针所指作业信息
{
cout<<pr->name<<'\t'<<pr->State<<'\t'<<pr->Sourse<<'\t'<<pr->Ttime<<'\t'<<pr->Rtime<<'\n';
}
void setq(int T)//更新已到达作业队列
{
if(T>marktime)
{
while(1)
{
q=q->next;
marktime+=q->Rtime;
if(T<=marktime) break;
}
}
}
void input()//输入函数
{
int T=0,R=0;
cout<<"请输入作业个数:";
cin>>n;
for(int i=1;i<=n;i++)
{
p=new JCB;
cout<<"输入NO."<<i<<"作业名称:";
cin>> p->name;
cout<<"输入作业运行时间:";
cin>>p->Rtime;
cout<<"输入作业所需资源:";
cin>>p->Sourse;
p->State='W';
if(i==1) p->Ttime=0;
else p->Ttime=randtime(T,R);
R+=p->Rtime;
T=p->Ttime;
setq(T);
insert();
}
cout<<"\n\n输入完毕\n\n提出请求的作业队列为:\n";
JCB *pr=head;
cout<<"name\tstate\tSourse\tTtime\tRtime\n";
while(pr)
{
display(pr);
pr=pr->next;
}
system("pause");
cout<<"\n\n开始运行!\n\n";
}
int getlen()//返回链表长度
{
int l=0;
JCB *pr=head;
while(pr)
{
l++;
pr=pr->next;
}
return (l);
}
void show()//显示当前CPU内作业运行状态
{
cout<<"CPU时刻:"<<Runtime<<endl<<endl;
cout<<"\t正在运行的作业\n";
cout<<"name\tState\tSourse\tTtime\tRtime\n";
display(p);
cout<<"\t等待的作业\n";
JCB *pr=head;
if(!pr) {cout<<"\t无就绪进程!\n";return ;}
cout<<"name\tState\tSourse\tTtime\tRtime\n";
while(pr)
{
display(pr);
pr=pr->next;
}
}
void destroy()//作业运行完毕,撤销并释放内存
{ p->State='F';
cout<<"作业运行完成\n" ;
cout<<"Ttime\tBegin\tDone\tZ_time\tW_time\n";
cout<<p->Ttime<<'\t'<<Runtime-p->Rtime<<'\t'<<Runtime<<'\t'<<Runtime-p->Ttime<<'\t'<<(float)(Runtime-p->Ttime)/p->Rtime<<endl;
T_time+=(float)Runtime-p->Ttime;
W_time+=(float)(Runtime-p->Ttime)/p->Rtime;
system("pause");
delete p;
}
void run()//模拟运行函数
{
system("cls");
p=head;
head=p->next;
p->State='R';
show();
Runtime+=p->Rtime;
system("pause");
system("cls");
destroy();
}
int main()//主函数
{
input();
while(1)
{
run();
if(!getlen())
break;
}
system("cls");
cout<<"所有作业都已完成后\n\n";
cout<<"AVG_T_time\tAVG_W_time\n";
cout<<T_time/n<<'\t'<<'\t'<<W_time/n<<endl;
system("pause");
}
评论0