短作业优先调度算法.docx
《短作业优先调度算法.docx》由会员分享,可在线阅读,更多相关《短作业优先调度算法.docx(25页珍藏版)》请在冰豆网上搜索。
![短作业优先调度算法.docx](https://file1.bdocx.com/fileroot1/2022-12/1/61bf1b3d-04d9-4119-b621-95148919bc21/61bf1b3d-04d9-4119-b621-95148919bc211.gif)
短作业优先调度算法
课程设计报告
课程设计题目:
短作业优先(SJF)调度算法模拟
专业:
计算机科学与技术
班级:
姓名:
学号:
指导教师:
2013年01月09日
目录
摘要2
第一章概述3
1.1课程设计的目的3
1.2主要完成的任务3
1.3使用的开发工具3
1.4解决的主要问题3
第二章课程设计的基本概念和原理4
第三章总体设计5
第四章详细设计6
4.1数据结构6
4.2具体数据结构和模块设计简要说明6
4.3程序相关数据6
第五章短作业优先调度的算法实现9
第六章设计结果及分析16
总结20
参考文献21
评分表22
摘要
在多道程序环境下,主存中有着多个进程,其数目往往多于处理机数目。
这就要求系统能按某种算法,动态地把处理机分配给就绪队列中的一个进程,使之执行。
分配处理机的任务是由处理机调度程序完成的。
由于处理机是最重要的计算机资源,提高处理机的利用率及改善系统性能(吞吐量、响应时间),在很大程度上取决于处理机调度性能的好坏,因而,处理机调度便成为操作系统设计的中心问题之一。
在多道程序系统中,一个作业被提交后必须经过处理机调度后,方能获得处理机执行。
对于批量型作业而言,通常需要经历作业调度和进程调度两个过程后方能获得处理机。
作业调度是对成批进入系统的用户作业,根据作业控制块的信息,按一定的策略选取若干个作业使它们可以去获得处理器运行的一项工作。
而对每个用户来说总希望自己的作业的周转时间是最小的,短作业优先(SJF)便是其中一种调度方法。
本次课程设计主要是模拟短作业优先(SJF)调度算法。
关键字:
多道程序进程调度短作业优先(SJF)调度算法
第一章概述
1.1课程设计的目的
加深对作业概念的理解,掌握短作业优先(SJF)算法,深入了解批处理系统如何组织作业、管理作业和调度作业,了解作业控制块的作用,以及作业控制块的内容和组织方式。
进行操作系统课程设计主要是在学习操作系统课程的基础上,在完成操作系统各部分实验的基础上,对操作系统的整体进行一个模拟,通过实践加深对各个部分的管理功能的认识,还能进一步分析各个部分之间的联系,最后达到对完整系统的理解。
同时,可以提高运用操作系统知识解决实际问题的能力;锻炼实际的编程能力、开发软件的能力;还能提高调查研究、查阅技术文献、资料以及编写软件设计文档的能力。
1.2主要完成的任务
本次课程设计主要的任务是用C语言来实现对N个进程采用短作业优先算法对进程调度进行模拟。
1.3使用的开发工具
MicrosoftVisualC++6.0
1.4解决的主要问题
随着计算机进入多道程序系统,如何分配CPU资源就成为了操作系统不可避免要面临的一个问题。
计算机只有一个CPU,或者只有有限的CPU资源,当系统中有多个进程处于就绪状态,要竞争CPU资源时,操作系统就要负责完成如何分配资源的任务。
在操作系统中,由调度程序来完成这一选择分配工作,调度程序所使用的算法即是调度算法,调度算法需要考虑的指标主要有尽量保证CPU资源分配的公平性,按照一定的策略强制执行算法调度;平衡整个计算机系统,尽量保持各部分都正处于忙碌状态。
因此短作业优先算法就是一个较好的算法。
第二章课程设计的基本概念和原理
本次课程设计主要是采用短作业优先算法进程的进程调度过程。
短作业优先调度算法,是指对短作业或短进程优先调度的算法。
他们可以分别用于作业调度和进程调度,短作业优先的调度算法是从后备队列中选择一个或若干个估计运行时间最短的作业,将他们调入内存运行。
而短进程优先调度算法则是从就绪队列中选出一个估计运行时间最短的进程,将处理机分配给他,使它立即执行并一直执行到完成,或发生某事件而被阻塞放弃处理机时再度重新调度。
本程序采用了非抢占式短作业优先调度。
而非抢占式这种方式,一旦把处理机分配给某进程后,便让该进程一直执行,直至该进程完成或发生某事件而被阻塞时,才再把处理机分配给其它进程,决不允许某进程抢占已经分配出去的处理机。
这种调度方式的优点是实现简单,系统开销小,适用于大多数的批处理系统环境。
但它难以满足紧急任务的要求——立即执行,因而可能造成难以预料的后果。
因此,在要求比较严格的实时系统中,不宜采用这种调度方式。
本课程设计主要是在满足要求多道单处理机的情况下进行短作业的优先调度。
第三章总体设计
本次课程设计主要是通过比较各个进程的优先级以及各进程所需要占用的CPU时间来确定哪个作业优先运行,短作业优先调度算法除了能保证优先级更高的作业优先运行外,还能使相同优先级的前提下,所需CPU时间最短的那个作业优先运行,次外,本次课程设计还增加了阻塞时间和被阻塞时间来对个进程的运行加以控制。
此次课程设计的总体流程图如下:
图1总体流程图
第四章详细设计
4.1数据结构
每个用来标识进程的进程控制块PCB用结构来描述,包括以下字段:
进程标识数ID;进程优先数PRIORITY,并规定优先数越大的进程,其优先权越高;进程已占用的CPU时间CPUTIME;进程还需占用的CPU时间ALLTIME。
当进程运行完毕时,ALLTIME变为0;进程的阻塞时间STARTBLOCK,表示当进程再运行STARTBLOCK个时间片后,进程将进入阻塞状态;进程被阻塞的时间BLOCKTIME,表示已阻塞的进程再等待BLOCKTIME个时间片后,进程将转换成就绪状态;进程状态STATE;队列指针NEXT,用来将PCB排成队列。
在这个模拟程序中作业控制块PCB的数据结构类型可定义为:
StructPCB{//作业控制块
intID;//进程编号ID
intPriority;//进程优先级随机产生
intCPUtime;//进程占用CPU时间
intAlltime;//进程还需占用的CPU时间,随机产生
intStartblock;//进程的阻塞时间
intBlocktime;//进程被阻塞的时间
intstate;//进程状态
structPCB*next;//结构体指针
}
4.2具体数据结构和模块设计简要说明
(1)短作业优先算法:
首先比较各进程的优先级,优先级越大的进程优先执行,在优先级相同的情况下,判断作业的alltime,alltime最小的最先执行,依次按照时间从小到大执行进程。
(2)数据结构(见详细设计)
(3)主函数模块
4.3程序相关数据
假设在调度前,系统中有5个进程,它们的初始状态如下:
ID
0
1
2
3
4
PRIORITY
26
8
2
1
1
CPUTIME
0
0
0
0
0
ALLTIME
3
2
6
3
1
STARTBLOCK
2
-1
-1
-1
-1
BLOCKTIME
2
0
0
0
0
STATE
READY
READY
READY
READY
READY
(2)为了清楚地观察诸进程的调度过程,程序应将每个时间片内的进程的情况显示出来,参照的具体格式如下:
RUNNINGPROG:
i
READY_QUEUE:
->id1->id2
BLOCK_QUEUE:
->id3->id4
ID01234
PRIORITYP0P1P2P3P4
CPUTIMEC0C1C2C3C4
ALLTIMEA0A1A2A3A4
STARTBLOCKT0T1T2T3T4
BLOCKTIMEB0B1B2B3B4
STATES0S1S2S3S4
详细流程图如下:
第5章短作业优先调度的算法实现
//使用短作业优先调度算法的模拟
#include
#defineN5
voidinit();
voidprint();
intgetRunning();
voidsort();
intrun(inttime);
enumSTATE{Ready,Run,Block,RunOut};
structPROCESS{
intID;//进程标志数ID
intPriority;//进程优先数
intCputime;//进程已占用的CPU时间
intAlltime;//进程已占用的CPU时间
intStartblock;//进程的阻塞时间
intBlocktime;//进程被阻塞的时间
enumSTATEState;//进程的状态
}Process[N];
intREADY[N];
intBLOCK[N];
intRUNOUT[N][2];
intmain(){//主函数
intTime=0;
init();
printf("Time:
%d\n",Time);
sort();
print();
while
(1){
Time++;
getchar();
printf("Time:
%d\n",Time);
if(run(Time))
break;
}
return0;
}
voidinit()
{
inti;
for(i=0;iREADY[i]=-1;
BLOCK[i]=-1;
RUNOUT[i][0]=-1;
RUNOUT[i][1]=-1;
Process[i].ID=i;
Process[i].Cputime=0;
Process[i].State=Ready;
Process[i].Startblock=-1;Process[i].Blocktime=0;
}
Process[0].Priority=26;Process[0].Alltime=3;Process[0].Startblock=2;Process[0].Blocktime=2;
Process[1].Priority=8;Process[1].Alltime=2;
Process[2].Priority=2;Process[2].Alltime=6;
Process[3].Priority=1;Process[3].Alltime=3;
Process[4].Priority=1;Process[4].Alltime=1;//数据初始化
}
voidprint()
{
inti;
if(getRunning()>=0)
printf("\tRUNNINGPROG:
%d\n",getRunning());
printf("\tREADY_QUEUE:
");
for(i=0;iif(READY[i]>=0)
printf("->%d",Process[READY[i]].ID);
else{
break;
}
}
printf("\n\tBLOCK_QUEUE:
");
for(i=0;iif(BLOCK[i]>=0)
printf("->%d",Process[BLOCK[i]].ID);
else{
break;
}
}
printf("\n=====================================================\n");
printf("ID\t");
for(i=0;iprintf("\t%d",Process[i].ID);
}
printf("\nPRIORITY");
for(i=0;iprintf("\t%d",Process[i].Priority);
}
printf("\nCPUTIME\t");
for(i=0;iprintf("\t%d",Process[i].Cputime);
}
printf("\nALLTIME\t");
for(i=0;iprintf("\t%d",Process[i].Alltime);
}
printf("\nSTARTBLOCK");
for(i=0;iprintf("\t%d",Process[i].Startblock);
}
printf("\nBLOCKTIME");
for(i=0;iprintf("\t%d",Process[i].Blocktime);
}
printf("\nSTATE\t");
for(i=0;iswitch(Process[i].State){
case0:
printf("\tReady");break;
case1:
printf("\tRun");
if(Process[i].Alltime==0)
{
Process[i].State=RunOut;
}
elseProcess[i].State=Ready;
break;
case2:
printf("\tBlock");break;
case3:
printf("\tRunOut");break;
}
}
printf("\n");
printf("\tRUNOUTLIST:
");
for(i=0;iif(RUNOUT[i][0]>=0)
printf("->%d(%d)",Process[RUNOUT[i][0]].ID,RUNOUT[i][1]);
else{
printf("\n");
break;
}
}
printf("\n");
}
intgetRunning()
{
inti;
for(i=0;iif(Process[i].State==Run)
returni;
}
for(i=0;iif(Process[i].Startblock==0)
returni;
}
return-1;
}
voidsort()
{
inti,j,k;
for(i=0;iREADY[i]=-1;
BLOCK[i]=-1;
}
for(i=0;iif(Process[i].State==Ready||Process[i].State==Run){
if(Process[i].Alltime==0)
continue;
for(j=0;jif(READY[j]<0)
{
READY[j]=i;
break;
}
elseif(Process[i].Priority//比较相邻两个进程优先级的大小
{
continue;}
elseif((Process[i].Priority=Process[READY[j]].Priority)&&(Process[i].Alltime>Process[READY[j]].Alltime))//在相邻两个进程优先级相同的情况下,比较各进程所需占用CPU时间的大小
{
continue;
}
else{
for(k=N-1;k>j;--k){
READY[k]=READY[k-1];
}
READY[j]=i;
break;
}
}
}
elseif(Process[i].State==Block){
for(j=0;jif(BLOCK[j]<0)
{
BLOCK[j]=i;
break;
}
elseif(Process[i].Blocktime>=Process[BLOCK[j]].Blocktime)
{continue;}
else{
for(k=N-1;k>j;--k){
BLOCK[k]=BLOCK[k-1];
}
BLOCK[j]=i;
break;
}
}
}
}
}
intrun(inttime)
{
inti,runNum;
runNum=READY[0];
if(runNum<0&&BLOCK[0]<0){
printf("EveryprocessisOVER!
\n");
return1;
}
else{
if(runNum>=0){
Process[runNum].Alltime-=1;
Process[runNum].Cputime+=1;
Process[runNum].State=Run;
for(i=0;iif(i!
=runNum){
if(Process[i].State==Ready){
}
elseif(Process[i].State==Block){
Process[i].Blocktime-=1;
if(Process[i].Blocktime==0){
Process[i].State=Ready;
}
}
}
}
if(Process[runNum].Alltime==0)
{
for(i=0;iif(RUNOUT[i][0]<0){
RUNOUT[i][0]=runNum;
RUNOUT[i][1]=time;
break;
}
}
}
elseif(Process[runNum].Startblock>=0){
Process[runNum].Startblock-=1;
if(Process[runNum].Startblock==0){
Process[runNum].State=Block;
}
}
}
elseif(BLOCK[0]>=0){
for(i=0;iif(Process[i].State==Block){
Process[i].Startblock=-1;
Process[i].Blocktime-=1;
if(Process[i].Blocktime==0){
Process[i].State=Ready;
}
}
}
}
}
sort();
print();
return0;
}
第六章设计结果及分析
从程序的运行结果来看,开始应先比较各进程的优先级,优先级越高的进程先执行,执行顺序为0,1,2,由于进程3和4的优先级一样,因此应选一个作业更短的进程运行,进程4比进程3所需占用的CPU时间更少,所以先执行进程4,后执行进程3。
从分析结果来看,
本次课程设计基本上实现了短作业优先调度算法的模拟,由于短作业优先调度算法与动态优先调度算法类似,我通过在网上找到动态优先调度算法的程序,并且通过看书,查资料,对短作业优先调度思想加以熟悉后,对此程序进行更改以及调试后,最终成功运行了,因此在程序方面没有遇到什么大问题。
总结
通过本次课程设计,使我对计算机操作系统短作业优先调度算法这一节的知识有了更深的了解。
短作业优先调度算法易于实现,并且效率很高,但是短作业只考虑到短作业的利益,而不顾长作业,这样就可能会使得长作业一直处于等待状态而不能运行。
所以,短作业优先算法适用于系统中短作业较多的情况。
此外,我对操作系统中的作业调度模拟和短作业优先算法有了更深的认识。
并且发现,只看课本上的知识远远不够,只一味学习也根本没用,必须要动手亲自实践,才能真正掌握所学的东西。
虽然在这次课程设计过程中,我们也遇到了很多问题,但我们都能保持一个良好的心态,不急不躁,并且能通过请教老师,与同学们积极讨论,查看课外资料,反复实验,反复检查,将问题一个个解答,并最终成功的完成本次课程设计。
总之,本次课程设计让我们学到了很多东西,包括课本上的和课外的,是一个非常有意义的课程设计。
参考文献
[1]汤小丹梁红兵哲凤屏汤子瀛计算机操作系统(第三版)西安电子科技大学出版社,2007年5月
[2]任爱华李鹏刘方毅操作系统实验指导清华大学出版社,2004年[3]吕凤翥C++语言基础教程清华大学出版社,2007年[4]谭浩强C程序设计(第三版)清华大学出版社,2005年[5]操作系统课程设计(第二版)
[6]C语言程序设计(清华大学出版社)
东华理工大学信息工程学院
课程设计评分表
学生姓名:
雷小芳班级:
10204102学号:
1020410214
课程设计题目:
短作业优先(SJF)调度算法模拟
项目内容
满分
实评
选
题
能结合所学课程知识、有一定的能力训练。
符合选题要求
(5人一题)
10
工作量适中,难易度合理
10
能
力
水
平
能熟练应用所学知识,有一定查阅文献及运用文献资料能力
10
理论依据充分,数据准确,公式推导正确
10
能应用计算机软件进行编程、资料搜集录入、加工、排版、制图等
10
能体现创造性思维,或有独特见解
10
成
果
质
量
总体设计正确、合理,各项技术指标符合要求。
10
说明书综述简练完整,概念清楚、立论正确、技术用语准确、结论严谨合理;分析处理科学、条理分明、语言流畅、结构严谨、版面清晰
10
设计说明书栏目齐全、合理,符号统一、编号齐全。
格式、绘图、表格、插图等规范准确,符合国家标准
10
有一定篇幅,字符数不少于5000
10
总分
100
指导教师评语:
指导教师签名:
年月日