进程调度算法模拟带答案版Word格式.docx
- 文档编号:13563287
- 上传时间:2022-10-11
- 格式:DOCX
- 页数:26
- 大小:197.52KB
进程调度算法模拟带答案版Word格式.docx
《进程调度算法模拟带答案版Word格式.docx》由会员分享,可在线阅读,更多相关《进程调度算法模拟带答案版Word格式.docx(26页珍藏版)》请在冰豆网上搜索。
使用的调度算法有:
1先来先服务调度算法。
2优先级调度算法。
3短作业(或进程)优先调度算法。
4响应比高优先调度算法
6.1使用的主要数据结构:
(1)定义一个结构体,结构体的主要成员有:
序号、作业(进程)号或名称、提交时间、运行时间、优先数、进入输入井时间、开始运行时间、尚需运行时间、运行结束时间、周转时间、带权周转时间、运行次序等。
(2)利用定义的结构体,定义一个结构体数组,用来记录系统中的作业或进程。
6.2算法描述:
1.主控程序算法描述
2.数据输入算法
3.数据输出算法
4.先来先服务调度算法描述
5.优先级调度算法
6.短作业(或进程)优先调度算法
7.响应比高优先调度算法
6.3C语言程序实现
#include<
stdio.h>
//usingnamespacestd;
#defineMAX10
structtask_struct
{
charname[10];
/*进程名称*/
intnumber;
/*进程编号*/
floatcome_time;
/*到达时间*/
floatrun_begin_time;
/*开始运行时间*/
floatrun_time;
/*运行时间*/
floatrun_end_time;
/*运行结束时间*/
intpriority;
/*优先级*/
intorder;
/*运行次序*/
intrun_flag;
/*调度标志*/
}tasks[MAX];
intcounter;
/*实际进程个数*/
intfcfs();
/*先来先服务*/
intps();
/*优先级调度*/
intsjf();
/*短作业优先*/
inthrrn();
/*响应比高优先*/
intpinput();
/*进程参数输入*/
intpoutput();
/*调度结果输出*/
voidmain()
{intoption;
pinput();
printf("
请选择调度算法(0~4):
\n"
);
1.先来先服务\n"
2.优先级调度\n"
3.短作业优先\n"
4.响应比高优先\n"
0.退出\n"
scanf("
%d"
&
option);
switch(option)
{case0:
运行结束。
break;
case1:
对进程按先来先服务调度。
\n\n"
fcfs();
poutput();
case2:
对进程按优先级调度。
ps();
case3:
对进程按短作业优先调度。
sjf();
case4:
对进程按响应比高优先调度。
hrrn();
}
}
intfcfs()/*非抢占式先来先服务,该程序段默认进程已经按到达先后顺序排成了队列,如果考虑输入为乱序,还需要根据come_time对进程进行排队,形成一个先来后到的队列。
*/
{
floattime_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;
return0;
/*非抢占式优先级调度,默认tasks[0]是最早到达的进程,进程已按到达先后顺序排成了队列。
intps()
floattemp_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;
/*循环查找下一个被调度的进程,直到所有的tasks[j].run_flag==1*/
while(temp_counter<
counter)
max_priority=0;
for(j=0;
j<
j++)
{if((tasks[j].come_time<
=temp_time)&
(!
tasks[j].run_flag))
max_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;
temp_counter++;
tasks[number_schedul].order=temp_counter;
intsjf()/*非抢占式短作业优先,默认tasks[0]是最早到达的进程,进程已按到达先后顺序排成了队列。
/*借助该局部变量可以帮助找到执行时间run_time最短进程*/
run_time=tasks[i].run_time;
/*从到达时间最早且相同的进程中查找第一个被调度的进程*/
(tasks[i].come_time==tasks[j].come_time))
if(tasks[j].run_time<
tasks[i].run_time)
run_time=tasks[j].run_time;
{/*找到在上一个进程执行期间(到“目前”为止)到达时间最晚的一个进程*/
j++)
if((tasks[j].come_time<
tasks[j].run_flag))
{run_time=tasks[j].run_time;
number_schedul=j;
break;
/*找到到“目前”为止,最短的进程,即run_time最小的进程*/
if(tasks[j].run_time<
run_time)
{run_time=tasks[j].run_time;
number_schedul=
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 进程 调度 算法 模拟 答案