一、问题描述
采用C语言实现优先级调度算法。编制进程调度模拟程序,并计算每个进程的周转时间,带权周转时间,以及所有进程的平均周转时间和平均带权周转时间。
二、源代码
#include <iostream>
#include <iomanip> //格式化输出
using namespace std;
//最大进程数
#define MAXSIZE_N 10
//定义数据结构
struct PCB{
int number;//进程代号
int arrive_time;//到达时间
int serve_time;//服务时间
int priority;//优先级
int finish_time=0;//记录结束运行时刻
};
int main(){
int n;//进程总数
PCB p_list[MAXSIZE_N];//PCB数组
cout<<"======非抢占的优先级调度算法======\n";
//读入进程信息
cout<<"请输入进程总数:" ;
cin>>n;
for(int i=0;i<n;i++){
cout<<"\n"<<i+1<<":\n请依次输入进程的信息\n请输入进程代号number = ";
cin>>p_list[i].number;
cout<<"请输入到达时间arrive_time = " ;
cin>> p_list[i].arrive_time;
cout<<"请输入服务时间serve_time = " ;
cin>> p_list[i].serve_time;
cout<<"请输入优先级priority = " ;
cin>> p_list[i].priority;
}
//找到进程执行的序列 work_list
int work_list[n];
for(int i=0;i<n;i++){//元素代表执行的进程在p_list中的下标,下标代表执行顺序
work_list[i]=i;
}
int temp=0;
for(int i=0;i<n;i++){//先按到达时间排序
for(int j=0;j<n-i-1;j++){
if(p_list[j].arrive_time>p_list[j+1].arrive_time){
temp=work_list[j];
work_list[j]=work_list[j+1];
work_list[j+1]=temp;
}
}
}
for(int i=0;i<n;i++){//再按优先级排序
for(int j=0;j<n-i-1;j++){
if(p_list[j].arrive_time==p_list[j+1].arrive_time&&p_list[j].priority<p_list[j+1].priority){
temp=work_list[j];
work_list[j]=work_list[j+1];
work_list[j+1]=temp;
}
}
}
//执行进程
int time=p_list[work_list[0]].arrive_time;//记录运行的时刻
cout<<"\n调度序号"<<setw(20)<<"运行的进程代号"<<setw(15)<<"优先级"<<setw(20)<<"开始运行的时刻"<<setw(15)<<"运行时间"<<setw(20)<<"结束运行时间";
for(int i=0;i<n;i++){//执行进程并输出
cout<<"\n "<<i+1<<setw(17)<<p_list[work_list[i]].number<<setw(19)<<p_list[work_list[i]].priority<<setw(16)<<time<<setw(18)<<p_list[work_list[i]].serve_time<<setw(19);
time=time+p_list[work_list[i]].serve_time;
p_list[work_list[i]].finish_time=time;
cout<<time;
}
//每个进程的周转时间
cout<<"\n\n进程代号"<<setw(17)<<"完成时刻"<<setw(18)<<"周转时间"<<setw(20)<<"带权周转时间";
float work_time;//记录周转时间
float time_sum=0;//记录总周转时间
float weight_time; //记录带权周转时间
float weight_sum=0;// 记录总带权周转时间
for(int i=0;i<n;i++){
work_time=p_list[i].finish_time-p_list[i].arrive_time;
time_sum+=work_time;
weight_time=work_time/(float)p_list[i].serve_time;
weight_sum+=weight_time;
cout<<"\n "<<p_list[i].number<<setw(17)<<p_list[i].finish_time<<setw(19)<<work_time<<setw(19)<<weight_time;
}
//平均(带权)周转时间
cout<<"\n\n平均周转时间:"<<time_sum/n;
cout<<"\n平均带权周转时间"<<weight_sum/n;
}
三、运行结果截图
第一屏
第二屏