基本信息
源码名称:进程调度模拟算法(osexperiment完整版)
源码大小:6.54KB
文件格式:.cpp
开发语言:C/C++
更新时间:2019-04-29
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):78630559
本次赞助数额为: 2 元×
微信扫码支付:2 元
×
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
源码介绍
#include<iostream>
#include<iomanip>
using namespace std;
struct Process//定义进程控制块
{
char name[10];// 进程名
int priority; //进程优先级
float arive; //进程到达时间
float run; //进程运行时间
float start;//进程开始时间
float finish; //进程完成时间
float zz; //进程周转时间
float dqzz; //进程带权周转时间
bool IsRun; //进程是否运行标志
};
float finish = 0.0f;
int count=0;
void print(Process pro[],int n)//显示进程
{
cout<<"原输入进程信息:"<<endl;
cout<<setw(14)<<"进程编号"<<setw(10)<<"进程名"<<setw(10)<<"优先级"<<setw(10)<<"到达时间"<<setw(10)<<"运行时间"<<endl;
for(int i=0;i<=n-1;i )
{
cout<<setw(10)<<"进程"<<i 1<<setw(10)<<pro[i].name<<setw(10)<<setw(10)<<pro[i].priority
<<setw(10)<<pro[i].arive<<setw(10)<<pro[i].run<<endl;
}
}
void fcfs(Process pro[],int n1)//先来先服务法
{
//先按照提交时间从小到大排列
for(int i = 0 ; i <=n1-2;i )
{
int min = i;
for(int j = i 1;j<n1;j )
{
if(pro[j].arive < pro[min].arive)
{
min = j;
}
}
Process tmpPrp;
memcpy(&tmpPrp,&pro[i],sizeof(Process));
memcpy(&pro[i],&pro[min],sizeof(Process));
memcpy(&pro[min],&tmpPrp,sizeof(Process));
}
/////////////////
int n;
cout<<"进程调度顺序为:";
for(n = 0;n <= n1-1;n )
cout<<pro[n].name<<" ";
cout<<endl;
pro[0].finish = pro[0].arive pro[0].run;
pro[0].start=pro[0].arive;
pro[0].zz = pro[0].finish - pro[0].arive;
pro[0].dqzz = pro[0].zz/pro[0].run;
for(n=1;n <= n1;n )
{
if(pro[n].arive<pro[n-1].finish)
{
pro[n].finish = pro[n].run pro[n-1].finish;
pro[n].start=pro[n-1].finish;
pro[n].zz = pro[n].finish-pro[n].arive;
}
else
{
pro[n].finish=pro[n].run pro[n].arive;
pro[n].start=pro[n].arive;
pro[n].zz=pro[n].run;
}
}
cout<<"调度过程:"<<endl;
cout<<setw(14)<<"进程编号"<<setw(10)<<"进程名"<<setw(10)<<"优先级"<<setw(10)<<"到达时间"<<setw(10)<<"运行时间"<<setw(10)<<"开始时间"<<setw(10)<<"完成时间"<<endl;
for( i=0;i<=n1-1;i )
{
cout<<setw(10)<<"进程"<<i 1<<setw(10)<<pro[i].name<<setw(10)<<setw(10)<<pro[i].priority
<<setw(10)<<pro[i].arive<<setw(10)<<pro[i].run<<setw(10)<<pro[i].start<<setw(10)<<pro[i].finish<<endl;
}
float avezz,avedqzz;
avezz=0;
avedqzz=0;
for(n=0;n<=n1-1;n )
{
avezz =pro[n].zz;
}
avezz=avezz/n1;
cout<<"平均周转时间为:"<<avezz<<endl;
for(n=0;n<=n1-1;n )
{
pro[n].dqzz=pro[n].zz/pro[n].run;
avedqzz = pro[n].dqzz;
}
avedqzz=avedqzz/n1;
cout<<"带权平均周转时间为:"<<avedqzz<<endl;
}
int FindShouldBeRun(Process pro[],int n)//判定优先级并返回在进程表中索引
{
int index = -1;
//sort(pro,n) ;
for(int i = 0 ; i < n; i )
{
if(pro[i].arive <= finish && pro[i].IsRun == false)
{
index = i;
if(i < n-1)
{
for(i = i 1; i <= n-1;i )
{
if(pro[i].arive <= finish &&pro[i].priority > pro[index].priority && pro[i].IsRun == false)
{
index = i;
}
}
return index;
}
return index;
}
}
return index;
}
void pri(Process pro[],int n)//优先级法
{
int i,j;
for(i = 0 ; i <=n-2;i )
{
int min = i;
for( j = i 1;j<n;j )
{
if(pro[j].arive < pro[min].arive)
{
min = j;
}
if(pro[j].arive==pro[min].arive&&pro[j].priority>pro[min].priority)
{
min=j;
}
}
Process tmpPrp;
memcpy(&tmpPrp,&pro[i],sizeof(Process));
memcpy(&pro[i],&pro[min],sizeof(Process));
memcpy(&pro[min],&tmpPrp,sizeof(Process));
}
cout<<"进程调度顺序为:";
cout<<pro[0].name<<" ";
pro[0].finish = pro[0].arive pro[0].run;
pro[0].start=pro[0].arive;
pro[0].zz = pro[0].finish - pro[0].arive;
pro[0].dqzz = pro[0].zz/pro[0].run;
pro[0].IsRun = true;
finish = pro[0].finish;
for(i = 1;i <= n-1; i )
{
int index = FindShouldBeRun(pro,n);
if(index == -1)
{
for(i=0;i<n;i )
{
if(pro[i].IsRun==false) break;
}
cout<<pro[i].name<<" ";
pro[i].IsRun = true;
pro[i].finish=pro[i].arive pro[i].run;
pro[i].start=pro[i].arive;
pro[i].zz=pro[i].run;
finish=pro[i].finish;
pro[i].dqzz = pro[i].zz /pro[i].run;
}
else
{
cout<<pro[index].name<<" ";
pro[index].IsRun = true;
pro[index].finish = finish pro[index].run;
pro[index].start=finish;
pro[index].zz = pro[index].finish - pro[index].arive;
finish = pro[index].run;
pro[index].dqzz = pro[index].zz /pro[index].run;
}
}
cout<<endl;
for(i = 0 ; i <=n-2;i )//按开始时间排序
{
int min = i;
for( j = i 1;j<n;j )
{
if(pro[j].start < pro[min].start)
{
min = j;
}
}
Process tmpPrp;
memcpy(&tmpPrp,&pro[i],sizeof(Process));
memcpy(&pro[i],&pro[min],sizeof(Process));
memcpy(&pro[min],&tmpPrp,sizeof(Process));
}
cout<<"调度过程:"<<endl;
cout<<setw(14)<<"进程编号"<<setw(10)<<"进程名"<<setw(10)<<"优先级"<<setw(10)<<"到达时间"<<setw(10)<<"运行时间"<<setw(10)<<"开始时间"<<setw(10)<<"完成时间"<<endl;
for(i=0;i<=n-1;i )
{
cout<<setw(10)<<"进程"<<i 1<<setw(10)<<pro[i].name<<setw(10)<<setw(10)<<pro[i].priority
<<setw(10)<<pro[i].arive<<setw(10)<<pro[i].run<<setw(10)<<pro[i].start<<setw(10)<<pro[i].finish<<endl;
}
float zzTime = 0.0f;
float dqzzTime = 0.0f;
for(j = 0 ; j < n ; j )
{
zzTime = pro[j].zz;
dqzzTime = pro[j].dqzz;
}
zzTime /= n;
dqzzTime /= n;
cout<<"平均周转时间:"<<zzTime<<endl;
cout<<"平均带全周转时间:"<<dqzzTime<<endl;
return ;
}
int main()
{
int i,j;
int n;
cout<<"请输入进程个数:";
cin>>n;
Process *pro = new Process[n];
Process *pro1 = new Process[n];
Process *pro2 = new Process[n];
for(i = 0 ; i < n; i )
{
memset(&pro[i],0,sizeof(Process));
memset(&pro1[i],0,sizeof(Process));
memset(&pro2[i],0,sizeof(Process));
}
cout<<"请输入进程名:";
for(i=0;i<=n-1;i )
cin>>pro[i].name;
cout<<"请输入进程优先级:";
for(i=0;i<=n-1;i )
cin>>pro[i].priority;
cout<<"请输入各进程到达时间:";
for(i=0;i<=n-1;i )
cin>>pro[i].arive;
cout<<"请输入各进程运行时间:";
for(i=0;i<=n-1;i )
cin>>pro[i].run;
for(i=0;i<n;i )
{
pro1[i]=pro[i];
pro2[i]=pro[i];
}
system("pause");
system("cls");
while(true)
{
cout<<"\t\t"<<"********进程调度模拟算法********"<<endl;
cout<<"\t\t\t"<<"1.先来先服务法:"<<endl;
cout<<"\t\t\t"<<"2.优先法:"<<endl;
cout<<"\t\t\t"<<"其他.exit:"<<endl;
cin>>j;
if(j==1)
{
print(pro,n);
fcfs(pro1,n);
}
else if(j==2)
{
print(pro,n);
pri(pro2,n);
}
else
{
return 0;
}
system("pause");
system("cls");
}
}