【操作系统】 动态优先权调度算法(C代码实现)

前言

这个学期学习计算机操作系统这门课,我会定期更新一些习题和实验。这次和小伙伴们分享一下动态优先调度算法实验,有什么不对的地方,希望批评指正,哈哈。

实验

一、实验目的及要求

1.实验目的:
1)进一步理解操作系统的各种进程调度算法;
2)掌握优先权调度算法的设计与实现;
3)提高C语言的程序编制能力和程序调试能力。
2. 实验内容:
设计一个按动态优先权调度算法实现处理机调度的程序。
要求:1)可选择进程数量;2)用C语言实现,执行时输入进程数(运行时间,优先数由随机函数产生),执行后显示结果。

二、实验仪器设备与软件环境

1.实验设备:计算机
2. 软件环境:Dev-C++

三、实验过程及实验结果分析

1.实验代码:

//按优先数调度算法实现处理器调度的程序
#include <stdio.h> 
#include <string.h>
#include <stdlib.h>
#include <time.h>

//进程结构体
struct Jc{
	int ID; //进程id
	int prior; //进程优先数
	int runtime; //运行时间
	int state; //进程状态 1 - 就绪态  0 - 结束态  
}; 

//显示函数,便于查看进程每一步的调度情况 
void  show(int num,struct Jc Que[]){
	printf("----------------------------------------------\n");
	printf("ID\tprior\truntime\tstate\n");
	for(int i=0;i<num;i++){
		printf("%d\t%d\t%d\t%d\n",Que[i].ID,Que[i].prior,Que[i].runtime,Que[i].state);
	}
	printf("----------------------------------------------\n");
} 

//查找函数,查找队列中优先数最大的进程 
int max(int num,struct Jc Que[]){ 
	int key=0; //记录优先数最高的进程的在队列中的位置,默认为第1个进程优先数最高 
	
	for(int i=1;i<num;i++){                     //遍历进程队列寻找优先数最大的进程,并记录在max中 
	    //printf("%d的state  %d\n",i,Que[i].state);
	    if( Que[i].state == 2){                 //state = 2  表示正在运行,此时不需要查找 
	    //printf("max函数中判断运行的if  %d的state  %d\n",i,Que[i].state); 
	    return -1; 
		}
		if( Que[key].prior < Que[i].prior && Que[i].state == 1){
			key = i;
		}	
	} 
	
	//printf("max函数中得到结果 %d\n",key);
	return key;
}

int main(){
	int num; 
	printf("请输入进程个数:\n");          //用户输入进程个数 
	scanf("%d",&num);
	struct Jc Que[num];         //定义进程控制块队列 
	for(int i=0;i<num;i++){                          //初始化队列 
		printf("请输入第%d个进程的ID号:\n",i+1);
		scanf("%d",&Que[i].ID);
		Que[i].prior = rand()%10+1;
		Que[i].runtime = rand()%10+1;
		Que[i].state = 1;
	}
	getchar();  //设置间隔,接收到回车时结束输入 
	int sum=0;  //记录总运行时间 
	for(int i=0;i<num;i++){           //遍历进程队列计算总运行时间 
		sum +=Que[i].runtime;
		//printf("%d\n",sum);
	} 
	printf("           动态优先级调度算法              \n");
	show(num,Que); //显示最初进程控制块队列 
	getchar();  //设置间隔,接收到回车时开始调度算法 
	for(int j=0;j<sum;j++){
		int key = max(num,Que);
		if(key!=-1){ //查找到处于就绪态的最大优先级的进程时,设置其运行 
			Que[key].state = 2; 
			//printf("%d的state  %d\n",key,Que[key].state); 
		}
		//printf("j    %d\n",j);
		for(int i=0;i<num;i++){
			//printf("i   %d\n",i);
			if(Que[i].state == 2){ //将运行进程的优先级数和运行时间-1,表示已经完成一次对该进程的调度 
				Que[i].prior -=1;
				Que[i].runtime -=1; 
				if(Que[i].runtime == 0) //完成一次调度后,若该进程还需运行时间为0则设置为结束态,不为0则设置为就绪态 
				Que[i].state = 0;
				else
				Que[i].state = 1; 
				show(num,Que); //显示完成这次调度后进程控制块队列信息 
	            getchar();  //设置间隔,接收到回车时进入下一次调度 
			} 
		}
	} 
} 

2.运行截屏

(1)输入进程数和每个进程ID号,并显示进程控制块信息
在这里插入图片描述
(2)按照动态优先级调度算法进行进程调度,并显示每一次调度执行后的结果

在这里插入图片描述
(3)完成对所有进程的调度
在这里插入图片描述

  • 15
    点赞
  • 117
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Up_Long

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值