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