先来先服务调度算法。 优先级调度算法。 短作业优先调度算法 轮转调度算法 响应比高优先调度算法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了先来先服务调度算法。 优先级调度算法。 短作业优先调度算法 轮转调度算法 响应比高优先调度算法相关的知识,希望对你有一定的参考价值。

实验目的与要求
本实验的目的是通过作业或进程调度算法模拟设计,进一步加深对作业或进程调度算法的理解,通过计算平均周转时间和带权平均周转时间,进一步加深对算法的评价方法的理解。
实验预备内容
(1) 掌握作业或进程调度算法。
(2) 平均周转时间和带权平均周转时间计算。
实验内容
设定一组作业或进程,给定相关参数,对这组进程或作业按调度算法实施调度,输出调度次序,并计算平均周转时间和带权平均周转时间。使用的调度算法有:
① 先来先服务调度算法。
② 优先级调度算法。
③ 短作业(或进程)优先调度算法。
④ 轮转调度算法
⑤ 响应比高优先调度算法
使用的主要数据结构:
1.定义一个结构体,结构体的主要成员有:序号、作业(进程)号或名称、提交时间、运行时间、优先数、进入输入井时间、开始运行时间、尚需运行时间、运行结束时间、周转时间、带权周转时间、运行次序等。
2.利用定义的结构体,定义一个结构体数组,用来记录系统中的作业或进程。
有会做的朋友,发个点C文件过来
使用C语言来做

参考技术A 你试一下

#include<stdio.h>
//using namespace std;
#define MAX 10
struct task_struct

char name[10]; /*进程名称*/
int number; /*进程编号*/
float come_time; /*到达时间*/
float run_begin_time; /*开始运行时间*/
float run_time; /*运行时间*/
float run_end_time; /*运行结束时间*/
int priority; /*优先级*/
int order; /*运行次序*/
int run_flag; /*调度标志*/
tasks[MAX];
int counter; /*实际进程个数*/
int fcfs(); /*先来先服务*/
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");
printf(" 4.响应比高优先\n");
printf(" 0.退出\n");
scanf("%d",&option);
switch (option)
case 0:
printf("运行结束。\n");
break;
case 1:
printf("对进程按先来先服务调度。\n\n");
fcfs();
poutput();
break;
case 2:
printf("对进程按优先级调度。\n\n");
ps();
poutput();
break;
case 3:
printf("对进程按短作业优先调度。\n\n");
sjf();
poutput();
break;
case 4:
printf("对进程按响应比高优先调度。\n\n");
hrrn();
poutput();
break;


int fcfs() /*先来先服务*/

float time_temp=0;
inti;
intnumber_schedul;
time_temp=tasks[0].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;


int ps() /*优先级调度*/

float temp_time=0;
inti=0,j;
intnumber_schedul,temp_counter;
intmax_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)

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].run_time;
tasks[number_schedul].run_flag=1;
temp_time=tasks[number_schedul].run_end_time;
tasks[number_schedul].order=1;
temp_counter=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)

max_priority=tasks[j].priority;
number_schedul=j;

/*查找下一个被调度的进程*/
/*对找到的下一个被调度的进程求相应的参数*/
tasks[number_schedul].run_begin_time=temp_time;
tasks[number_schedul].run_end_time=tasks[number_schedul].run_begin_time+tasks[number_schedul].run_time;
tasks[number_schedul].run_flag=1;
temp_time=tasks[number_schedul].run_end_time;
temp_counter++;
tasks[number_schedul].order=temp_counter;

return 0;


int sjf() /*短作业优先*/

float temp_time=0;
inti=0,j;
intnumber_schedul,temp_counter;
float run_time;
run_time=tasks[i].run_time;
j=1;
while((j<counter)&&(tasks[i].come_time==tasks[j].come_time))

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;
tasks[number_schedul].run_end_time=tasks[number_schedul].run_begin_time+tasks[number_schedul].run_time;
tasks[number_schedul].run_flag=1;
temp_time=tasks[number_schedul].run_end_time;
tasks[number_schedul].order=1;
temp_counter=1;
while (temp_counter<counter)

for(j=0;j<counter;j++)

if((tasks[j].come_time<=temp_time)&&(!tasks[j].run_flag))
run_time=tasks[j].run_time;number_schedul=j;break;


for(j=0;j<counter;j++)
if((tasks[j].come_time<=temp_time)&&(!tasks[j].run_flag))
if(tasks[j].run_time<run_time)
run_time=tasks[j].run_time;
number_schedul=j;


/*查找下一个被调度的进程*/
/*对找到的下一个被调度的进程求相应的参数*/
tasks[number_schedul].run_begin_time=temp_time;
tasks[number_schedul].run_end_time=tasks[number_schedul].run_begin_time+tasks[number_schedul].run_time;
tasks[number_schedul].run_flag=1;
temp_time=tasks[number_schedul].run_end_time;
temp_counter++;
tasks[number_schedul].order=temp_counter;
return 0;


int hrrn() /*响应比高优先*/
int j,number_schedul,temp_counter;
float temp_time,respond_rate,max_respond_rate;
/*第一个进程被调度*/
tasks[0].run_begin_time=tasks[0].come_time;
tasks[0].run_end_time=tasks[0].run_begin_time+tasks[0].run_time;
temp_time=tasks[0].run_end_time;
tasks[0].run_flag=1;
tasks[0].order=1;
temp_counter=1;
/*调度其他进程*/
while(temp_counter<counter)

max_respond_rate=0;
for(j=1;j<counter;j++)

if((tasks[j].come_time<=temp_time)&&(!tasks[j].run_flag))
respond_rate=(temp_time-tasks[j].come_time)/tasks[j].run_time;
if (respond_rate>max_respond_rate)

max_respond_rate=respond_rate;
number_schedul=j;


/*找响应比高的进程*/
tasks[number_schedul].run_begin_time=temp_time;
tasks[number_schedul].run_end_time=tasks[number_schedul].run_begin_time+tasks[number_schedul].run_time;
temp_time=tasks[number_schedul].run_end_time;
tasks[number_schedul].run_flag=1;
temp_counter+=1;
tasks[number_schedul].order=temp_counter;

return 0;

int pinput() /*进程参数输入*/
int i;
printf("please input the processcounter:\n");
scanf("%d",&counter);

for(i=0;i<counter;i++)
printf("******************************************\n");
printf("please input the process of %d th :\n",i+1);
printf("please input the name:\n");
scanf("%s",tasks[i].name);
printf("please input the number:\n");
scanf("%d",&tasks[i].number);
printf("please input the come_time:\n");
scanf("%f",&tasks[i].come_time);
printf("please input the run_time:\n");
scanf("%f",&tasks[i].run_time);
printf("please input the priority:\n");
scanf("%d",&tasks[i].priority);
tasks[i].run_begin_time=0;
tasks[i].run_end_time=0;
tasks[i].order=0;
tasks[i].run_flag=0;

return 0;

int poutput() /*调度结果输出*/

int i;
float turn_round_time=0,f1,w=0;
printf("name number come_time run_timerun_begin_time run_end_time priority order turn_round_time\n");
for(i=0;i<counter;i++)

f1=tasks[i].run_end_time-tasks[i].come_time;
turn_round_time+=f1;
w+=(f1/tasks[i].run_time);
printf(" %s, %d, %5.3f, %5.3f, %5.3f, %5.3f, %d, %d,%5.3f\n",tasks[i].name,tasks[i].number,tasks[i].come_time,tasks[i].run_time,tasks[i].run_begin_time,tasks[i].run_end_time,tasks[i].priority,tasks[i].order,f1);

printf("average_turn_round_timer=%5.2f\n",turn_round_time/counter);
printf("weight_average_turn_round_timer=%5.2f\n",w/counter);
return 0;
本回答被提问者和网友采纳

(王道408考研操作系统)第二章进程管理-第二节2:调度算法评价指标

进程调度算法也称为CPU调度算法,操作系统内存在着多种调度算法,有的调度算法适用于作业调度,有的调度算法适用于进程调度,有的两者都适用。常见的调度算法有:

  • 先来先服务调度算法
  • 最短作业优先调度算法
  • 高响应比优先调度算法
  • 时间片轮转调度算法
  • 最高优先级调度算法
  • 多级反馈队列调度算法

一:先来先服务调度算法(FCFS)

算法思想:先来后到,每次从就绪队列选择最优先进入队列的进程,然后一直运行,知道进程退出或被阻塞,才会继续在队列中选择下一个第一个进程继续运行,属于非抢占

  • 作业调度:考虑的是哪个作业先到达后备队列
  • 进程队列:考虑的是哪个进程先到达就绪队列
<

以上是关于先来先服务调度算法。 优先级调度算法。 短作业优先调度算法 轮转调度算法 响应比高优先调度算法的主要内容,如果未能解决你的问题,请参考以下文章

作业调度算法平均周转时间平均带权周转时间先来先服务FCFS短作业优先SJF高优先权(级)算法FPF高响应比优先算法HRRN

调度算法先来先服务(FCFS)最短作业优先(SJF)和最高响应比优先(HRRN)算法

软件测试——进程调度(短作业优先调度算法+先来先服务算法)测试

先来先服务和短作业优先调度算法-C语言实现

操作系统王道考研 p15 调度算法:先来先服务最短作业优先最高响应比优先

Java模拟操作系统进程调度算法—先来先服务短作业优先高响比优先