优先级法非强占式短进程优先算法Word文档格式.docx
《优先级法非强占式短进程优先算法Word文档格式.docx》由会员分享,可在线阅读,更多相关《优先级法非强占式短进程优先算法Word文档格式.docx(17页珍藏版)》请在冰豆网上搜索。
指导教师:
吴利军工作单位:
计算机科学与技术学院
题目:
进程调度模拟设计——优先级法、非强占式短进程优先算法
初始条件:
1.预备内容:
阅读操作系统的处理机管理章节内容,对进程调度的功能以及进程调度算法有深入的理解。
2.实践准备:
掌握一种计算机高级语言的使用。
要求完成的主要任务:
(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)
1.模拟进程调度,能够处理以下的情形:
⑴能够选择不同的调度算法(要求中给出的调度算法);
⑵能够输入进程的基本信息,如进程名、优先级、到达时间和运行时间等;
⑶根据选择的调度算法显示进程调度队列;
⑷根据选择的调度算法计算平均周转时间和平均带权周转时间。
2.设计报告内容应说明:
⑴需求分析;
⑵功能设计(数据结构及模块说明);
⑶开发平台及源程序的主要部分;
⑷测试用例,运行结果与运行情况分析;
⑸自我评价与总结:
)你认为你完成的设计哪些地方做得比较好或比较出色;
)什么地方做得不太好,以后如何改正;
)从本设计得到的收获(在编写,调试,执行过程中的经验和教训);
)完成本题是否有其他方法(如果有,简要说明该方法);
时间安排:
设计安排一周:
周1、周2:
完成程序分析及设计。
周2、周3:
完成程序调试及测试。
周4、周5:
验收、撰写课程设计报告。
(注意事项:
严禁抄袭,一旦发现,一律按0分记)
指导教师签名:
年月日
系主任(或责任教师)签名:
进程调度模拟设计
--优先级法、非强占式短进程优先算法
一.问题描述
设计一程序模拟进程调度,能够选择优先级和非抢占短作业两种算法对进程调度。
可以输入相关进程信息(进程名,达到时间,执行时间,优先级),最终能显示进程调度的序列。
并能显示这些进程的平均周转时间和带权平均周转时间。
二.需求分析
通过设计一个模拟进程调度的系统,来实现进程调度,对进程调度的功能以及进程调度算法有一个更加深入的理解。
进程PCB(包含进程名、到达时间、预计运行时间)
调度算法(优先级、非强占式短进程优先)
模拟进程调度,能够处理以下的情形:
⑴能够选择不同的调度算法(要求中给出的调度算法);
⑵能够输入进程的基本信息,如进程名、到达时间和运行时间等;
⑶根据选择的调度算法显示进程调度队列;
⑷根据选择的调度算法计算平均周转时间和平均带权周转时间。
此次做的进程调度模拟系统,用户可以输入各进程信息(包含进程名、到达时间、运行时间)。
输入进程数,然后输入进程的提交时间和运行时间,显示优先级和非强占式短进程优先调度算法的进程名、提交时间、运行时间、开始时间、结束时间、周转时间、带权周转时间、执行时间、平均周转时间和平均带权周转时间。
优先级法:
优先级法可被用做作业或进程的调度策略。
首先,系统或用户按某种原则为作业或进程指定一个优先级来表示该进程或作业所享有的优先权。
改算法的核心是确定进程或作业的优先级。
确定优先级的方法可分为两类。
即静态法和动态法。
静态法根据作业的或进程的静态特性,在作业或进程开始执行前就确定它们的优先级,一旦开始执行之后就不能改变。
动态法则不然,它把作业或进程的静态特性结合起来确定作业或进程的优先级,随着作业或进程的执行过程,其优先级不断变化。
非抢占短作业优先法:
不可抢占式Non-preemptive(非剥夺式):
某一进程被调度运行后,除非由于它自身的原因不能运行,否则一直运行下去。
短作业优先调度算法(SJF,ShortestJobFirst),又称为“短进程优先”SPN(ShortestProcessNext);
这是对FCFS算法的改进,其目标是减少平均周转时间。
基本思想:
对预计执行时间短的作业(进程)优先处理。
通常后来的短作业不抢先正在执行的作业。
在一般情况下这种调度算法比先来先服务调度算法的效率要高一些。
实现相对先来先服务调度算法要困难些,如果作业的到来顺序及运行时间不合适,会出现饿死现象,例如,系统中有一个运行时间很长的作业J,和几个运行时间小的作业,然后,不断地有运行时间小于J的作业的到来,这样,作业J就得不可调度而饿死。
另外,作业运行的估计时间也有问题。
三.功能设计
1.数据结构
在此次课程设计中主要采用了结构体数组的存储方式,将一个进程信息存储在一个结构体中,包括进程名称、进程优先级、进程提交时间、进程运行时间、进程周转时间。
具体实现如下:
structPRO{
charname[10];
//进程名
floatarrivetime;
进程时间
floatservicetime;
//进程执行时间
floatstarttime;
//开始时间
floatfinishtime;
//完成时间
intxy;
//优先级
floatzztime;
//周转时间
floatdqzztime;
//带权周转时间
};
2.程序流程框图
优先级
非抢占式短作业优先
综合流程图
3.模块说明
本次课程设计中一共涉及五个模块(结构体定义,要处理进程信息的输入,两种算法的实现,处理完毕后进程信息的输出,主函数)
(1)结构体定义如上所示
(2)进程信息的输入
voidinput(PRO*p,intn)
P为结构体数组名,n为进程个数。
(3)两种算法的实现
优先级算法的具体实现
voidYX(PRO*p,intN){
floatarrivetime=0,servicetime=0,starttime=0,finishtime=0,zztime=0;
floatdqzztime;
intxy=0;
sortxy(p,N);
//基于时间的排序同时处理多个进程同时到达情况。
for(intm=0;
m<
N-1;
m++)
{if(m==0)
p[m].finishtime=p[m].arrivetime+p[m].servicetime;
else
p[m].finishtime=p[m-1].finishtime+p[m].servicetime;
inti=0;
for(intn=m+1;
n<
=N-1;
n++)
{if(p[n].arrivetime<
=p[m].finishtime)
i++;
}
floatmin=p[m+1].xy;
intnext=m+1;
//m+1=n
for(intk=m+1;
k<
m+i;
k++)
{
if(p[k+1].xy<
min)
{min=p[k+1].xy;
next=k+1;
}
PROtemp;
temp=p[m+1];
p[m+1]=p[next];
p[next]=temp;
}//令优先级高的执行
deal(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime,N,xy);
//将排好序的进程处理计算出其周转时间和带权周转时间
print(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime,N,xy);
//输出处理完毕后进程信息
voidSJF(PRO*p,intN){
floatdqzztime=0;
sortt(p,N);
//按到达时间进行排序
printf(p[0].name);
for(intm=0;
if(m==0)
}//得出在第m+1个进程执行完之前有多少个进程需要进行比较
floatmin=p[m+1].servicetime;
if(p[k+1].servicetime<
{min=p[k+1].servicetime;
}//
}//将执行时间最短的进程放在数组最前面
deal(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime,N,xy);
print(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime,N,xy);
(4)处理完进程信息的输出
voidprint(PRO*p,floatarrivetime,floatservicetime,floatstarttime,floatfinishtime,floatzztime,floatdqzztime,intN,intxy)
(5)主函数
主要设计一个菜单功能。
四.开发平台及源代码主要部分
1.开发平台
VisualStdio2010
2.源代码主要部分
五.测试用例,运行结果与运行情况分析
1.测试优先级
进程在同一时刻到达
进程名
进程到达时间
进程执行时间
进程优先级
a
2
3
b
4
c
7
可以得出当进程同时到达时,按优先级顺序执行。
当进程不是同时到达,且优先级高的到的比较晚。
优先级
6
5
从这个实例可以得出尽管c的优先级最高,但它最后到达,所以在c之前会执行已到达的进程。
当进程不是全部同时到达,但有部分同时到达。
尽管b的优先级最低,但其最先到达,所以最先执行,由于a,c进程,c进程的优先级高,所以c先执行。
2.测试非抢占短作业优先
当进程同时到达
进程处理时间