前言
这个学期学习计算机操作系统这门课,我会定期更新一些习题和实验。这次和小伙伴们分享一下动态优先调度算法实验,有什么不对的地方,希望批评指正,哈哈。
实验
一、实验目的及要求
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)完成对所有进程的调度