C ,实现进程调度算法,有先来先服务、优先级调度、短作业优先、响应比高优先
课程设计
书
实践课题:姓 名:学 号:完成时间:指导老师:
一、设计摘要
利用C++,实现进程调度算法,有先来先服务、优先级调度、短作业优先、响应比高优先,进一步理解了进程调度各种算法的概念及含义。
二、设计背景
在OS中,调度的实质是一种资源分配,调度算法即指:根据系统的资源分配策略所规定的资源分配算法。对于不同的系统和系统目标,通常采用不同的调度算法,如在批处理
1
系统中,为照顾为数众多的短作业,采用短作业有限调度算
法;在分时系统中,为保证系统具有合理的响应时间,采用
轮转法进行调度。采用算法时,则要考虑多方面因素,以便
达到最佳效果。
三、主要技术/算法简介
#include 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();
2
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; int i;
int number_schedul;
time_temp=tasks[0].come_time;
for(i=0;itasks[i].run_begin_time=time_temp;
tasks[i].run_end_time=tasks[i].run_begin_time+tasks[i].ru
n_time; tasks[i].run_flag=1;
time_temp=tasks[i].run_end_time; number_schedul=i;
tasks[number_schedul].order=i+1; }
3
return 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 ((jif (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_countermax_priority=0;
for(j=0;jif((tasks[j].come_timemax_priority) {
max_priority=tasks[j].priority; number_schedul=j; } }
/*查找下一个被调度的进程*/
4
/*对找到的下一个被调度的进程求相应的参数*/
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; int i=0,j;
int number_schedul,temp_counter; float run_time;
run_time=tasks[i].run_time; j=1;
while ((jif (tasks[j].run_timerun_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;
5
temp_time=tasks[number_schedul].run_end_time; tasks[number_schedul].order=1; temp_counter=1;
while
(temp_counterfor(j=0;jif((tasks[j].come_timerun_time=tasks[j].run_time;number_schedul=j;break;}
}
for(j=0;j{
if((tasks[j].come_time/*查找下一个被调度的进程*/
/*对找到的下一个被调度的进程求相应的参数*/
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;
6
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_countermax_respond_rate=0;
for(j=1;jif((tasks[j].come_time{
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 process counter:\n”);
scanf(“%d”,&counter);
7
for(i=0;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_time
run_begin_time run_end_time priority order
turn_round_time\n”);
for(i=0;if1=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, %
8
5.3f\n”,tasks[i].name,tasks[i].number,tasks[i].come_time,tas
ks[i].run_time,tasks[i].run_begin_time,tasks[i].run_end_tim
e,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; }
三、设计运行情况截图 设有如下3个进程:
注:”优先级”一栏,数字大的表示优先级越高。 根据本例
来运行本算法,结果如下: 1.输入进程有关参数
采用先来先服务算法:
采用优先级调度:
采用短作业优先:
采用高响应比优先:
四、心得体会
通过此次课程设计,更深入的理解了各个进程调度算法,
9
及实现
过程。在此过程中,遇到了困难,能及时请教同学,查询相关资料,及时解决了问题,但仍有不足之处,将会在今后学习中更加努力。
百度搜索“就爱阅读”,专业资料,生活学习,尽在就爱阅读网92to.com,您的在线图书馆
10