当前位置:
文档之家› 进程调度算法模拟带答案版.pptx
进程调度算法模拟带答案版.pptx
int sjf() /*非抢占式短作业优先,默认 tasks[0]是最早到达的进程,进程已按到达先后顺序排成了队 列。*/ { float temp_time=0;
int i=0,j; int number_schedul,temp_counter; /*正在被调度执行的进程编号和已经调度完成的进程个数*/ float run_time; /*借助该局部变量可以帮助找到执行时间 run_time 最短进程*/ run_time=tasks[i].run_time; j=1; /*从到达时间最早且相同的进程中查找第一个被调度的进程*/ while ((j<counter)&&(tasks[i].come_time==tasks[j].come_time))
调用 短作 业(进 程)调 度程
序
调用 响应 比高 者优 先调 度程 序
输出调度结果
2.数据输入算法
输入进程或作业个数 对每一个进程或作业
输入进程或作业名
输入进程或作业号 输入进程或作业到达时间 输入进程或作业运行时间 输入进程或作业优先级
3.数据输出算法
学海无 涯
对每个作业执行
输出进程(或作业)号、 进程(或作业)名、 到达时间、 开始运行时间、 运行结束时间、 优先级、 运行次序、 周转时间、 带权周转时间 计算并输出平均周转时间、带权周 转时间
{ max_priority=tasks[j].priority; i=j; } j++; } /*对第一个被调度的进程求相应的参数*/ number_schedul=i; tasks[number_schedul].run_begin_time=tasks[number_schedul].come_time; tasks[number_schedul].run_end_time=tasks[number_schedul].run_begin_time+tasks[number_schedul].r un_time; tasks[number_schedul].run_flag=1; temp_time=tasks[number_schedul].run_end_time; tasks[number_schedul].order=1; temp_counter=1;
学海无涯
tasks[number_schedul].run_end_time=tasks[number_schedul].run_begin_time+tasks[number_schedul].r un_time;
tasks[number_schedul].run_flag=1; temp_time=tasks[number_schedul].run_end_time; tasks[number_schedul].order=1; temp_counter=1;
{ if (tasks[j].run_time<tasks[i].run_time)
{ run_time=tasks[j].run_time; i=j; } j++; } /*对第一个被调度的进程求相应的参数*/ number_schedul=i; tasks[number_schedul].run_begin_time=tasks[number_schedul].come_time;
学海无涯
for(i=0;i<counter;i++) {
tasks[i].run_begin_time=time_temp; tasks[i].run_end_time=tasks[i].run_begin_time+tasks[i].run_time; tasks[i].run_flag=1; time_temp=tasks[i].run_end_time; number_schedul=i; tasks[number_schedul].order=i+1; } return 0; } /*非抢占式优先级调度,默认 tasks[0]是最早到达的进程,进程已按到达先后顺序排成了队列。*/ int ps() { float temp_time=0; int i=0,j; int number_schedul,temp_counter; /*正在被调度执行的进程编号和已经调度完成的进程个数*/ int max_priority; max_priority=tasks[i].priority; j=1; /* 从从到达时间最早且相同的进程中遍历,查找第一个被调度的进程*/ while ((j<counter)&&(tasks[i].come_time==tasks[j].come_time))/*寻找到达时间相同优先级最高的 进程。*/ { if (tasks[j].priority>tasks[i].priority)
/*循环查找下一个被调度的进程,直到所有的 tasks[j].run_flag ==1*/ while (temp_counter<counter) {
学海无涯
max_priority=0; for(j=0;j<counter;j++) { if((tasks[j].come_time<=temp_time)&&(!tasks[j].run_flag)) if (tasks[j].priority>max_priority)
#include<stdio.h>
//using namespace std;
#define MAX 10
struct task_struct
{ char name[10]; int number; float come_time; float run_begin_time;
/*进程名称*/ /*进程编号*/ /*到达时间*/ /*开始运行时间*/
/*先来先服务*/
int ps();
/*优先级调度*/
int sjf();
/*短作业优先*/
int hrrn();
/*响应比高优先*/
int pinput(); /*进程参数输入*/
int poutput(); /*调度结果输出*/
学海无涯
void main() { int option;
pinput(); printf("请选择调度算法(0~4):\n"); printf("1.先来先服务\n"); printf("2.优先级调度\n"); printf(" 3.短作业优先\n");
4.先来先服务调度算法描述
系统中有未运行的作业
在未运行的作业中选择一个提 交时间最早的作业 把运行次序填入数组相应位置; 分别计算出该作业进入输入井时 间、开始运行时间、运行结束时 间、周转时间、带权周转时间, 并填入数组相应位置。
调用输出程序输出结果
先来先服务调度算法
学海无 涯
5.优先级调度算法
时间、优先数、进入输入井时间、开始运行时间、尚需运行时间、运行结束时间、周转时
间、带权周转时间、运行次序等。
2
利用定义的结构体,定义一个结构体数组,用来记录系统中的作业或进程。
6.2 算法描述:
1.主控程序算法描述
学海无 涯
进程(作业)参数输入 重复执行
选择调度算法
0
1
2
3
4
调用 先来 先服 务调 度程 序
系统中有未运行的作业
在未运行的作业中选择一个响应比最 高的作业运行 (响应比相同按先来先服务进行选择)
把运行次序填入数组相应位置; 分别计算出该作业进入输入井时 间、开始运行时间、运行结束时 间、周转时间、带权周转时间, 并填入数组相应位置。
调用数据输出程序输出结果
响应比高优先调度算法
6.3 C 语言程序实现
/*循环查找下一个被调度的进程,直到所有的 tasks[j].run_flag ==1*/ while (temp_counter<counter) { /*找到在上一个进程执行期间(到“目前”为止)到达时间最晚的一个进程*/
学海无涯
实验二 进程管理
2.5 作业(进程)调度算法模拟
1. 实验目的与要求
本实验的目的是通过作业或进程调度算法模拟设计,进一步加深对作业或进程调度算法的 理 解,通过计算平均周转时间和带权平均周转时间,进一步加深对算法的评价方法的理解。
2. 实验类型:验证型 3. 实验学时:4
4. 实验原理和知识点
float run_time;
/*运行时间*/
float run_end_time;
/*运行结束时间*/
int priority; int order;
/*优先级*/ /*运行次序*/
int run_flag;
/*调度标志*/
}tasks[MAX];
int counter; /*实际进程个数*/
int fcfs();
有未运行的作业
作业的优先数 与 Pnim 比较 大
Pmin该作业 的优先数 k该作业的 在数组中的下标
6.短作业(或进程)优先调度算法
未找到
找到
有未运行的作业
作业的运行时间
与 Rnim 比较
长
短
Rmin该作业 的运行时间 k该作业的 在数组中的下标
选择运行时间最短作业的算法
学海无 涯
7.响应比高优先调度算法
break; case 2:
printf("对进程按优先级调度。\n\n"); ps();
poutput(); break; case 3:
printf("对进程按短作业优先调度。\n\n"); sjf();
poutput(); break; case 4: