基本信息
源码名称:进程调度模拟算法(osexperiment完整版)
源码大小:6.54KB
文件格式:.cpp
开发语言:C/C++
更新时间:2019-04-29
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300
本次赞助数额为: 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"); } }