短作业优先调度算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
短作业优先调度算法
学院计算机科学与技术
专业
学号
学生姓名
指导教师姓名
2014-3-18
目录
九参考文献………………………………………………………………………………………………………
实验题目
采用短作业优先算法的进程调度程序
课程设计的目的
操作系统课程设计是计算机专业重要的教学环节,它为学生提供了一个既动手又动脑,将课本上的理论知识和实际有机的结合一起,独立分析和解决实际问题的机会。
进一步巩固和复习操作系统的基础知识。
培养学生结构化程序、模块化程序设计的方法和能力。
提高学生调试程序的技巧和软件设计的能力。
提高学生分析问题、解决问题以及综合利用C语言进行程序设计的能力。设计内容
设计并实现一个采用短作业优先算的进程调度算法演示程序
设计要求
1. 每一个进程有一个PCB,其内容可以根据具体情况设定。
2. 进程数、进入内存时间、要求服务时间、优先级等均可以在界面上设定
3. 可读取样例数据(要求存放在外部文件中)进行进程数、进入内存时间、时间片长度、进程优先级的初始化
4. 可以在运行中显示各进程的状态:就绪、执行(由于不要求设置互斥资源与进程间同步关系,故只有两种状态)
5. 具有一定的数据容错性
主要数据结构及其说明
算法的简要说明:短作业(进程)优先调度算法SJ(P)F,是指对短作业或短进程优先调度的算法。它们可以分别用于作业调度和进程调度。短作业优先(SJF)的调度算法是从后备队列中选择一个或若干个估计运行时间最短的作业,将它们调入内存运行。而短进程(SPF)调度算法则是从就绪队列中选出一个估计运行时间最短的进程,将处理机分配给它,使它立即执行并一直执行到完成,或发生某事件而被阻塞放弃处理机再重新调度。优点是SJ(P)F 调度算法能有效地降低作业(进程)的平均等待时间,提高系统吞吐量。缺点是该算法对长作业不利;完全未考虑作业的紧迫程度,因而不能保证紧迫性作业(进程)长期不被调度;由于作业(进程)的长短只是根据用户所提供的估计执行时间而定的,而用户又可能会有意或无意地缩短其作业的估计运行时间,致使该算法不一定能真正做到短作业游戏那调度。
该程序定义了一个进程数据块(struct spf),该数据块有进程名(name)、到达时间(arrivetime)、服务时间(servicetime)、开始执行时间(starttime)、完成时间(finishtime)、周转时间(zztime)、带权周转时间(dqzztime)。用到的公式有:完成时间=到达时间+服务时间;周转时间=完成时间-到达时间;带权周转时间=周转时间/服务时间;(第一次执行的进程的完成时间=该进程的到达时间;下一个进程的开始执行时间=上一个进程的完成时间)。运行进程的顺序需要对进程的到达时间和服务时间进行比较。如果某一进程是从0时刻到达的,那么首先执行该进程;之后就比较进程的服务时间,谁的服务时间短就先
执行谁(如果服务时间相同则看它们的到达时间,到达时间短的先执行);如果到达时间和服务时间相同,则按先来先服务算法执行。
程序运行结果
1 进入操作界面如下
2输入进程的数目
3输入进程的信息
4 运行顺序
流程图
源程序文件
#include
#include
#include
#define MAX 100 //最多能管理的作业数目
struct jcb //作业控制块JCB,定义为结构体
{
char name[10]; //作业名
float arrivetime; //作业到达时间
float servicetime;//作业服务时间
float starttime; //作业开始执行时间
float finishtime; //作业完成时间
float zztime; //作业周转时间
float avezztime; //作业平均周转时间
};
jcb a[MAX];
void input(jcb *p,int N)
{
int i;
printf("请分别输入:\n\t作业名,到达时间,服务时间(如:JOB1 5 10)\n\n"); for(i=0;i<=N-1;i++)
{
printf("请输入第%d个作业信息:",i+1);
scanf("%s%f%f",&p[i].name,&p[i].arrivetime,&p[i].servicetime);
printf("\n");
}
}
void Print(jcb *p,float arrivetime,float servicetime,float starttime,float finishtime,float zztime,float avezztime,int N)
{
int k;
printf("调度顺序:");
printf("%s",p[0].name);
for(k=1;k { printf("-->%s",p[k].name); } printf("\n\n"); printf("\t\t\t作业信息:\n"); printf("\nname\tarrive\tservice\tstart\tfinish\tzz\tavezz\n"); for(k=0;k<=N-1;k++) {