C语言实现优先级调度算法

一、问题描述

采用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;	 
}    

三、运行结果截图

第一屏
在这里插入图片描述

第二屏
在这里插入图片描述

  • 13
    点赞
  • 165
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
C语言动态优先权调度算法是一种进程调度算法,其特点是根据进程的优先权动态决定进程的执行顺序。在该算法中,每个进程都被赋予一个优先权值,优先权较高的进程将优先执行。 算法具体流程如下: 1. 在进程控制块(PCB)中设定进程的优先权值,优先权值越高表示进程的优先级越高。 2. 当出现进程调度时,从所有处于就绪状态的进程中选择优先权最高的进程执行,若存在多个具有相同优先权的进程,则采用时间片轮转的方式进行调度。 3. 执行完一个时间片后,重新计算所有进程的优先权值,并根据新的优先权值重新调度执行的进程,以保证优先权高的进程能够得到更多的执行时间。 4. 当进程执行完毕、阻塞或等待I/O操作时,优先权被置为0,表示该进程不再具有优先执行的权利。 5. 如果存在多个具有相同优先权值的就绪进程,则采用先来先服务(FCFS)的方式进行调度。 C语言动态优先权调度算法的优点是能够根据进程的优先级动态地调度执行,使得优先级高的进程优先得到执行,提高了系统的响应速度和效率。缺点是当有许多优先权相同的进程时,可能会导致部分进程长时间得不到执行。因此,在设计进程的优先权值时,需要合理地设置不同进程的优先级,以兼顾系统的整体性能和资源利用率。 总的来说,C语言动态优先权调度算法是一种高效的进程调度算法,可以根据不同进程的优先级进行动态调度,从而提高系统的响应速度和效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值