短作业优先调度算法
短作业优先调度算法例题详解
短作业优先调度算法例题详解短作业优先调度算法例题详解什么是短作业优先调度算法?短作业优先调度算法是一种常见的进程调度算法,它的主要思想是优先调度执行当前剩余运行时间最短的作业。
在这种算法下,长时间作业的响应时间会相对较长,但是短时间作业的响应时间会更短。
算法原理短作业优先调度算法的原理是按照作业的执行时间来进行调度,优先选择执行时间较短的作业。
当一个作业到达时,操作系统会检查作业的执行时间,并将其与已有作业的执行时间进行比较,选择执行时间最短的作业进行调度。
算法实现以下是一个简单的短作业优先调度算法的例子:1.输入作业的数量和每个作业的执行时间。
2.按照作业的执行时间对作业进行排序,从执行时间最短的作业开始执行。
3.执行作业直到所有作业执行完毕。
例题解析假设有三个作业需要执行,它们的执行时间分别为5、2和8。
使用短作业优先调度算法对这些作业进行调度。
1.首先,按照作业的执行时间对作业进行排序,排序后的顺序为2、5和8。
2.执行时间最短的作业是2,因此首先执行该作业,剩下的两个作业的执行时间分别为5和8。
3.接下来,执行时间较短的作业是5,执行该作业后,剩下的作业的执行时间为8。
4.最后,执行剩下的唯一一个作业,执行时间为8。
根据以上步骤,最终的作业执行顺序为2、5和8。
优缺点分析短作业优先调度算法的优点是能够最大程度地缩短短时间作业的响应时间,提高系统的吞吐量。
然而,这种算法容易造成长时间作业的等待时间过长,可能会导致长时间作业的执行效率较低。
总结短作业优先调度算法是一种常见的进程调度算法,其核心原理是选择执行时间最短的作业进行调度。
通过对作业的排序和执行,可以最大程度地减少短时间作业的响应时间。
然而,这种算法也存在一些问题,如可能会导致长时间作业的等待时间过长。
因此,在实际应用中,需要根据具体情况选择合适的调度算法。
算法的应用场景短作业优先调度算法适用于作业的执行时间差异较大的情况。
在这种情况下,短时间作业可以迅速得到执行,提高系统的响应速度。
操作系统短作业优先进程调度算法
操作系统短作业优先进程调度算法操作系统中的进程调度算法是指决定哪个进程在一些时间点被执行的规则和策略。
短作业优先(SJF)是一种常见的进程调度算法,它根据进程的执行时间来安排执行顺序。
短作业优先算法的思想是,优先调度执行所需执行时间最短的进程,以最大程度地减少平均等待时间和周转时间。
这个算法适合用于处理那些执行时间相对较短的任务。
SJF算法可以按两种方式实现:非抢占和抢占。
非抢占式短作业优先调度算法是指一旦一个进程开始执行,就不能被中断或抢占,直到它完成或由于其中一种原因被阻塞。
抢占式短作业优先调度算法是指一个新到达的进程可以抢占正在执行的进程,如果新到达的进程的执行时间比当前正在执行的进程更短。
对于非抢占式短作业优先调度算法,可以使用一个队列来保存进程,并通过比较它们的执行时间来确定下一个要执行的进程。
具体实现如下:1.首先,将所有待处理的进程添加到队列中。
2.对队列中的进程按照执行时间进行排序,按照从短到长的顺序执行。
3.执行每个进程直到完成,然后将其从队列中移除。
4.重复步骤3,直到所有进程都执行完成。
对于抢占式短作业优先调度算法,可以使用一个就绪队列和一个运行队列来实现。
就绪队列用于保存已到达但尚未执行的进程,而运行队列是当前正在运行的进程。
具体实现如下:1.首先,将所有到达的进程添加到就绪队列中,按照到达时间进行排序。
2.从就绪队列中选择执行时间最短的进程,并将其添加到运行队列中。
3.执行运行队列中的进程直到完成或被抢占。
4.如果有新的进程到达,将其加入到就绪队列中。
5.如果当前运行的进程被抢占,将其放回就绪队列中,并选择一个新的执行时间最短的进程来执行。
6.重复步骤3至5,直到所有进程都完成。
非抢占式短作业优先调度算法可以保证最短平均等待时间和周转时间,但存在一个问题,即长作业会被无限期地推迟。
为了解决这个问题,可以使用抢占式短作业优先调度算法,但这也会导致较多的上下文切换。
因此,根据具体情况和需求,可以选择适合的算法来实现进程调度。
作业调度之最短作业优先算法5例题解析
作业调度之最短作业优先算法5例题解析例题一、某系统采用不能移动已在主存储器中作业的可变分区方式管理主存储器,现有供用户使用的主存空间100K,系统配有4台磁带机,有一批作业见下表:作业序号进输入井时间要求计算时间需要主存容量申请磁带机数110:0025分钟15K2台210:2030分钟60K1台310:3010分钟50K3台410:3520分钟10K2台510:4015分钟30K2台按计算时间最短者优先算法如下表:我的解释:系统首先装入1、2、4,但1结束时4沿未到达,因此先执行2;2执行完毕后,资源可以分配给3或5,考虑5的时间短优先分配5并执行,执行完5后,主存中只有4已就绪并等待执行,因此开始执行4,执行4的同时系统会将作业3装入主存,最后自然执行作业3;因此最后的顺序是:1\2\5\4\3作业序号进输入井时间进入主存时间开始计算时间结束计算时间周转时间解释110:0010:1010:00102525此时输入井中只有一个作业且满足资源要求,因此被选中运行。
2102010:2010:2510:5535作业2到达输入井,满足资源要求,装入主存,等到作业1运行完毕进入运行。
510:4010:5510:5511:1030由于作业3要求主存空间无法满足,因此作业4先行一步装入主存,当作业2让出处理器的同时,作业5满足资源要求进入主存就绪。
根据算法作业5先进入处理器运行最后作业3装入主存并运行平均周转时间:(25+35+30+55+70/5=43分钟 [分析]解答本题时应注意如下几个问题:第一,系统采用的是多道程序设计技术,但没有限定并行工作的道数,因此, 只要当前尚未分配的资源可以满足在输入井中等待的某些作业的要求时,作业 调度可以按照给定的算法从中选择一个或多个作业装人主存储器;第二,采用可变分区方式管理主存储器,但没给出主存空间的分配算法,因而,只要有合适的空间就可分配,题中还规定可用移动技术来合并分散的空闲区; 第三,对磁带机采用静态分配;第四,进程调度采用可抢占的最高优先级调度算法,即对已被装人主存储器的作业而言优先级高的作业可抢占处理器执行;第五,虽然作业需要使用磁带机,但题意中已提示忽略磁带机和调度所花的时问,所以,解题时不必考虑外围设备的启动二八D 中断等复杂情况,只需把它们当作纯计算型的作业; 第六,由于没有规定什么时候开始进行作业调度,故在一般情况下只要输入井中有等待处理的作业就可按选定的算法去选择满足必要条件的作业。
作业调度算法之短作业优先调度算法和先来先服务调度算法
作业调度算法之短作业优先调度算法和先来先服务调度算法假设有四个作业,他们的提交、运⾏时间如下表所⽰。
请回答下列问题:
(1)若采⽤短作业优先调度算法,求作业运⾏顺序和平均带权周转时间为多少?
(2)若采⽤先来先服务调度算法,求作业运⾏顺序和平均带权周转时间为多少?
作业号到达时间运⾏时间
18.0 2.0
28.30.5
38.50.4
48.70.1
解:
(1)短作业优先调度算法,作业运⾏顺序:4,3,2,1
(2)先来先服务调度算法,作业运⾏顺序:1,2,3,4
作业号1234
到达时间8.08.38.58.7
运⾏时间 2.00.50.40.1
短作业优先调度算法
完成时刻11.79.79.28.8周转时间 3.7 1.40.70.1带权周转时间 1.85 1.751平均带全周转时间 1.85
先来先服务调度算法
完成时刻1010.510.911周转时间2 2.2 2.4 2.3带权周转时间1 4.4623平均带全周转时间8.6
注:周转时间= 完成时刻—到达时刻带权周转时间= 周转时间/运⾏时间。
操作系统实验_先来先服务的调度算法及短作业优先
操作系统实验_先来先服务的调度算法及短作业优先1.引言操作系统的调度算法是指在多进程环境中,操作系统为进程分配CPU 的顺序和策略。
先来先服务(FCFS)调度算法是最简单的调度算法之一,它按照进程到达的顺序为其分配CPU。
而短作业优先(SJF)调度算法是根据进程的执行时间来为其分配CPU,执行时间越短的进程越先执行。
本文将分别介绍FCFS调度算法和SJF调度算法,并对其进行评价和比较。
2.先来先服务(FCFS)调度算法2.1调度原理FCFS调度算法的原理非常简单,按照进程到达的顺序为其分配CPU。
当一个进程进入就绪队列后,如果CPU空闲,则立即为其分配CPU。
如果CPU正忙,则进程进入等待队列,等待CPU空闲后再分配。
在该算法中,进程的运行时间不考虑,只考虑进程到达的时间。
2.2优点与缺点FCFS调度算法的主要优点是实现简单,无需对进程的运行时间进行估计。
但FCFS算法存在一定的缺点。
首先,长作业在短作业前面等待的时间较长,可能导致长作业的响应时间过长。
其次,如果有一个进程出现阻塞或响应时间过长,其后面的进程也会受到影响,造成整个系统的性能下降。
3.短作业优先(SJF)调度算法3.1调度原理短作业优先(SJF)调度算法是根据进程的执行时间来为其分配CPU。
当一个进程进入就绪队列后,如果其执行时间比当前正在运行的进程短,则优先为该进程分配CPU。
如果当前没有运行的进程或者当前运行的进程执行完毕,则立即为该进程分配CPU。
在该算法中,进程的到达时间不考虑,只考虑进程的执行时间。
3.2优点与缺点SJF调度算法的主要优点是可以最大程度地减少平均等待时间,提高系统的吞吐量。
短作业可以快速执行完毕,从而让更多的作业得以执行。
但SJF算法存在一定的缺点。
首先,需要对进程的执行时间有一个准确的估计,对于实时系统或动态系统来说,估计执行时间可能会有一定的误差。
其次,在长作业激增的情况下,短作业可能会一直得不到CPU的分配,造成长时间的等待。
短作业优先调度算法
青岛理工大学操作系统课程设计报告院(系):计算机工程学院专业:计算机科学与技术专业学生姓名:班级:__学号:题目:短作业优先调度算法的进程调度程序_起迄日期:________设计地点:指导教师:2011—2012年度第 1 学期完成日期: 2012 年 1 月日一、课程设计目的进行操作系统课程设计主要是在学习操作系统课程的基础上,在完成操作系统各部分实验的基础上,对操作系统的整体进行一个模拟,通过实践加深对各个部分的管理功能的认识,还能进一步分析各个部分之间的联系,最后达到对完整系统的理解。
同时,可以提高运用操作系统知识解决实际问题的能力;锻炼实际的编程能力、开发软件的能力;还能提高调查研究、查阅技术文献、资料以及编写软件设计文档的能力。
二、课程设计内容与要求设计目的:在多道程序和多任务系统中,系统内同时处于就绪状态的进程可能有若干个,且进程之间也存在着同步与互斥的关系,要求采用指定的调度策略,使系统中的进程有条不紊地工作,通过观察诸进程的运行过程,以巩固和加深处理机调度的概念。
2、设计要求(多道、单处理机):1)每一个进程有一个PCB,其内容可以根据具体情况设定。
2)可以在界面设定的互斥资源(包括两种:输入设备与输出设备)的数目3)进程数、进入内存时间、要求服务时间可以在界面上进行设定4)进程之间存在一定的同步与互斥关系,可以通过界面进行设定,其表示方法如下:进程的服务时间由三段组成:I2C10O5(表示进程的服务时间由2个时间片的输入,10个时间片的计算,5个时间片的输出)进程间的同步关系用一个段表示:W2,表示该进程先要等待P2进程执行结束后才可以运行因此,进程间的同步与互斥关系、服务时间可以统一用四段表示为:I2C10O5W25)可以在运行中显示各进程的状态:就绪、阻塞、执行6)采用可视化界面,可在进程调度过程中随时暂停调度,查看当前进程的状态以及相应的阻塞队列7)具有一定的数据容错性三、系统分析与设计1、系统分析本系统主要是采用短作业优先算法进程的进程调度过程。
短作业优先调度算法例题详解
短作业优先调度算法例题详解
(原创实用版)
目录
1.短作业优先调度算法的概述
2.算法的例子
3.算法的详解
4.算法的优点和缺点
正文
一、短作业优先调度算法的概述
短作业优先调度算法(Shortest Job First, SJF)是一种常见的作业调度算法。
这种算法的基本原则是优先执行估计运行时间最短的作业,直到完成。
然后,再从剩下的作业中选择估计运行时间最短的作业执行,以此类推。
这种算法的目的是尽可能减少作业的平均等待时间。
二、算法的例子
假设有一个计算机系统,其中有三个作业需要执行,它们的运行时间分别是:作业 1 需要 20 分钟,作业 2 需要 30 分钟,作业 3 需要 10 分钟。
按照短作业优先调度算法,执行顺序应为:先执行作业 3(10 分钟),然后执行作业 1(20 分钟),最后执行作业 2(30 分钟)。
三、算法的详解
短作业优先调度算法的执行过程可以分为以下几个步骤:
1.首先,将等待执行的作业按照运行时间从短到长进行排序。
2.然后,选择运行时间最短的作业执行,直到完成。
3.完成后,再从剩下的作业中选择运行时间最短的作业执行,以此类推。
四、算法的优点和缺点
短作业优先调度算法的优点是能够使得作业的平均等待时间最短,从而提高了系统的效率。
然而,这种算法也有其缺点,那就是长作业可能会被频繁地打断,导致其执行效率低下。
作业调度算法先来先服务算法短作业算法页
作业调度算法: 先来先服务算法、短作业优先算法引言在计算机操作系统中,作业调度算法是一种重要的技术,用于管理和调度计算机系统中的作业。
作业调度算法决定了如何分配计算机资源,以便最大化系统的效率和吞吐量。
本文将介绍两种常见的作业调度算法:先来先服务算法(First Come First Serve,FCFS)和短作业优先算法(Shortest Job First,SJF)。
先来先服务算法(FCFS)先来先服务算法是最简单的作业调度算法之一。
按照作业提交的顺序进行调度,先提交的作业先执行,后提交的作业则等待。
这种调度算法不考虑作业的执行时间或优先级,只根据作业提交的先后顺序来进行调度。
算法流程1.将作业按照提交的先后顺序排列。
2.按照排列顺序执行作业。
优点•算法实现简单,易于理解和实现。
•适用于短作业或者作业提交顺序代表了作业的优先级的情况。
缺点•短作业可能因为长作业的存在而等待时间过长,导致响应时间较长。
•不考虑作业执行时间,可能导致平均等待时间和平均周转时间较长。
•无法适应不同作业的执行时间需求。
短作业优先算法(SJF)短作业优先算法是一种将作业按照执行时间长度进行排序的作业调度算法。
在短作业优先算法中,最短执行时间的作业先执行,以此类推。
该算法可以最大程度地减少作业的等待时间和周转时间。
算法流程1.将作业按照执行时间长度从短到长进行排序。
2.按照排列顺序执行作业。
优点•可以最大程度地减少作业的等待时间和周转时间。
•适用于短作业和长作业相互混合的情况。
缺点•难以准确估计作业的执行时间,可能导致长作业等待时间过长。
•需要预先知道作业的执行时间长度才能进行排序。
•不适用于长作业占主导地位的情况。
性能对比与选择先来先服务算法和短作业优先算法都有其优点和缺点。
选择合适的算法取决于具体的应用场景和需求。
•如果作业都很短,并且没有严格的截止时间要求,先来先服务算法可以简单高效地满足需求。
•如果作业的执行时间非常重要,并且具有较严格的截止时间要求,短作业优先算法可以最大程度地减少作业的等待时间和周转时间。
操作系统短作业优先调度算法
操作系统短作业优先调度算法操作系统的短作业优先调度算法(Shortest Job First Scheduling,简称SJF)是一种用于进程调度的算法。
它的优势在于能够最小化平均等待时间,并且适用于批处理系统。
在本文中,我们将对SJF算法进行详细解释,并讨论其优缺点以及适用场景。
SJF算法的基本思想是优先选择估计完成时间最短的任务进行调度。
在该算法中,每个进程都与一个估计运行时间相关联,估计时间越短的进程将被优先调度执行。
通常情况下,进程的估计运行时间由之前的执行时间或者进程已经消耗的CPU周期数量来确定。
SJF算法可以分为两种类型:非抢占式和抢占式。
在非抢占式SJF中,一旦进程开始执行,它将一直运行直到完成。
而在抢占式SJF中,如果一个新进程的估计时间更短,则当前正在执行的进程将被暂停,并且将被新进程替换。
具体来说,SJF算法的执行步骤如下:1.从就绪队列中选择估计运行时间最短的进程。
2.若操作系统支持抢占式调度,则如果有一个新进程的估计时间更短,那么当前正在执行的进程将被抢占。
3.执行选定的进程,并更新进程的状态和估计运行时间。
4.如果进程未完成,则将其放回就绪队列,并重复第1步。
5.如果所有进程都已完成,则算法结束。
SJF调度算法的优点在于能够最小化平均等待时间,因为估计时间最短的进程将会先执行,而不会被长时间的进程阻塞。
这使得系统能够更高效地利用CPU资源,提高运行效率。
然而,SJF算法也有一些缺点。
首先,它要求对进程的估计运行时间有准确的预测,但在实际情况中,很难准确预测每个进程的运行时间。
其次,SJF算法对于长时间的进程可能会产生不公平现象,因为这些进程可能需要等待很长时间才能得到执行。
此外,SJF算法还有一些适用场景。
它特别适合用于批处理系统或长时间运行的作业,其中有多个进程需要按照最短运行时间进行调度。
这样可以确保任务能够快速完成并提高整体系统效率。
综上所述,SJF算法是一种用于进程调度的短作业优先调度算法。
短作业优先调度算法(SJF)
短作业优先调度算法(SJF)假设有n项作业位于就绪队列中,这些作业的提交时间⽤数组requestTimes按照提交时间的先后顺序存储,对应的作业服务时间(持续时间)⽤数组durations存储。
采⽤SJF算法,计算n项作业的平均等待时间。
当存在多个相同长度的短作业时,按照提交时间的先后顺序进⾏调度。
假设0<= n <= 100。
求出所有作业的平均等待时间。
函数原型:void minWaitingTime(int requestTimes[],int durations[],int n)测试⽤例:输⼊40 2 4 57 4 1 4输出:4.01 #include <stdio.h>2 #include <stdlib.h>3 #include <string.h>45#define MAX 0x7FFFFFFF67void minWaitingTime(int requestTimes[],int durations[],int n)8 {9int i,time,j,k;10float res;11int index,arriveTime,indextemp;12int *done = (int *)malloc(sizeof(int) * n); //表⽰作业是否执⾏过,1表⽰执⾏完毕,0表⽰未执⾏13int *wait = (int *)malloc(sizeof(int) * n); //表⽰等待时间14for(i = 0; i < n; ++i){15 wait[i] = 0;16 done[i] = 0;17 }1819 time = 0; //time表⽰总作业执⾏时间20for(i = 0; i < n; i++){21if(i == 0){ //执⾏第⼀个作业22 time += durations[i];23 done[i] = 1;24for(j = 1; j < n; j++){25if(requestTimes[j] < time)26 wait[j] = time - requestTimes[j];27 }28 }29else{30 index = GetMin(durations,done,n);31//判断是否有多个最短作业,如有选择其中先到达的32 arriveTime = requestTimes[index];33for(indextemp = index + 1; indextemp < n; indextemp++){34if(done[indextemp] == 0 && durations[indextemp] == durations[index] &&35 requestTimes[indextemp] < arriveTime)36 index = indextemp;37 }3839 time += durations[index];40 done[index] = 1;41//执⾏选出的最短作业,并更新其它作业的等待时间42for(indextemp = 0; indextemp < n && i < n-1; indextemp++)43if(done[indextemp] == 0 &&requestTimes[indextemp] < time)44 wait[indextemp] = time - requestTimes[indextemp];45 }46 }4748 res = 0.0;49for(i = 0; i < n; i++)50 res += wait[i];5152 printf("%f\n",res / n);5354 }55//每次取出服务时间最短且⽰执⾏过的作业56int GetMin(int durations[],int done[],int n)57 {58int i,j,min = MAX;59for(i = 0; i < n; i++)60if(durations[i] < min && done[i] == 0){61 min = durations[i];62 j = i;63 }64return j;65 }6667int main()68 {69int requestTimes[100];70int durations[100];71int i,n;72 scanf("%d",&n);73for(i = 0; i < n; i++)74 scanf("%d",&requestTimes[i]);75for(i = 0; i < n; i++)76 scanf("%d",&durations[i]);7778 minWaitingTime(requestTimes,durations,n); 7980 system("pause");81return0;82 }。
最短作业优先算法例题
最短作业优先算法例题最短作业优先算法(Shortest Job First,简称SJF)是一种用于调度作业的算法,根据作业的执行时间来确定优先级。
具体例题如下:假设有5个作业,它们的执行时间分别为:作业1:5个单位时间作业2:2个单位时间作业3:9个单位时间作业4:7个单位时间作业5:3个单位时间按照最短作业优先算法进行调度,首先选择执行时间最短的作业来执行。
1. 初始状态下,作业队列为空。
2. 比较所有作业的执行时间,找到执行时间最短的作业作为第一个执行的作业。
最短执行时间为2,因此选择执行时间为2个单位时间的作业2,并将其加入作业队列。
作业队列:作业23. 接下来,比较作业队列中的作业和剩下的作业的执行时间,选择执行时间最短的作业。
作业队列中只有一个作业,无需比较,因此选择剩下的作业中执行时间最短的作业。
最短执行时间为3,因此选择执行时间为3个单位时间的作业5,并将其加入作业队列。
作业队列:作业2 -> 作业54. 继续比较作业队列中的作业和剩下的作业的执行时间,选择执行时间最短的作业。
最短执行时间为5,因此选择执行时间为5个单位时间的作业1,并将其加入作业队列。
作业队列:作业2 -> 作业5 -> 作业15. 继续比较作业队列中的作业和剩下的作业的执行时间,选择执行时间最短的作业。
最短执行时间为7,因此选择执行时间为7个单位时间的作业4,并将其加入作业队列。
作业队列:作业2 -> 作业5 -> 作业1 -> 作业46. 最后一个作业3的执行时间为9,因此将其加入作业队列。
作业队列:作业2 -> 作业5 -> 作业1 -> 作业4 -> 作业3最终的作业队列为:作业2 -> 作业5 -> 作业1 -> 作业4 -> 作业3按照最短作业优先算法的调度顺序,作业将按照执行时间从短到长的顺序被执行。
最短作业优先调度算法
最短作业优先调度算法一、前言最短作业优先调度算法(Shortest Job First,简称SJF)是一种常见的进程调度算法,主要用于处理多个进程同时请求资源的情况。
SJF算法的核心思想是优先调度执行时间最短的进程,以提高系统的响应速度和效率。
二、SJF算法的原理SJF算法是一种非抢占式调度算法,即一旦一个进程被分配到CPU上运行,它将一直运行直到完成或者被阻塞。
该算法基于每个进程的执行时间来进行排序,并按照顺序依次执行。
三、SJF算法的实现1. 首先需要获取所有待调度进程的执行时间,并按照从小到大的顺序进行排序。
2. 将排序后的进程依次加入就绪队列中。
3. 从就绪队列中选择执行时间最短的进程,并将其分配给CPU进行运行。
4. 如果该进程在运行过程中发生阻塞,则将其移到阻塞队列中等待唤醒。
5. 当一个进程完成时,检查就绪队列中是否还有未完成的进程,如果有,则重复步骤3;否则结束调度。
四、SJF算法存在的问题1. SJF算法假设能够准确地知道每个进程的执行时间,但实际上这是很难做到的。
如果估算不准,可能会导致进程等待时间过长或者资源浪费。
2. SJF算法容易出现“饥饿”现象,即某些进程由于执行时间较长而一直无法被调度执行。
3. SJF算法可能会导致运行时间较短的进程优先级过高,而忽略了其他因素如优先级、进程类型等。
五、SJF算法的改进针对SJF算法存在的问题,可以采取以下措施进行改进:1. 引入抢占式调度机制,在某些情况下可以强制中断正在运行的进程,并将CPU分配给更紧急的任务。
2. 采用动态优先级调度策略,将每个进程的优先级根据其等待时间进行动态调整。
当一个进程等待时间越长时,其优先级越高。
3. 综合考虑多种因素来确定每个进程的优先级。
除了执行时间外,还应考虑其他因素如I/O操作、内存需求、用户优先级等。
六、总结SJF算法是一种简单有效的调度算法,在处理大量短作业请求时具有较好的性能表现。
但是,由于其存在的问题,需要根据实际情况进行合理的改进和调整,以提高系统的性能和稳定性。
短作业优先算法例题
短作业优先算法例题
短作业优先算法(Shortest Job First Algorithm,SJF)是一种
资源调度算法,它以最短作业(或进程)的时间为基准来调度进程,
即将剩余未完成的进程中第一个就绪最短作业优先分配。
它可以用于
处理器调度、磁盘调度等多种资源控制。
SJF算法将所有等待的作业按照它们需要的运行时间从短到长的顺
序组成一个队列,当一个作业抵达后,它就被插入到队列中,在队列
的最前端则放置了需要最少运行时间的作业。
然后,当CPU由空闲变
成可用时,它就从队列的首元素开始选择作业来执行,即先加载最短
运行时间的作业,这样可以使整个系统更加有效地使用CPU,减少等待
时间和提高吞吐量。
总之,SJF算法的优点是显著减少了平均等待时间,但是它的缺点
也很明显:第一,要求系统具有对各作业运行时间的精确预测能力,
否则它无法正确排序;第二,有时候短作业也会受阻,因为它需要等
待更长作业的结束,这样就会增加空闲时间;第三,这种算法不能有
效地分配I/O资源。
下面为SJF算法例题:
假定系统中有4个作业A,B,C,D,它们的运行时间分别为3,3,2,4。
(1)如果采用先来先服务调度,则运行结果如下,平均周转时间为(12+7+4+4)/4=7.25
A -->
B -->
C --> D
时间: 0 3 6 8 12
(2)如果采用短作业优先算法,则运行结果如下,平均周转时间为(6+3+4+4)/4=4.5
C --> A --> B --> D
时间: 0 2 5 8 12。
短作业优先调度和时间片轮转调度算法
短作业优先调度和时间片轮转调度算法Prepared on 22 November 2020电子科技大学实验报告学生姓名:胡钟文学号:指导教师:罗惠琼一、实验室名称:主楼A2-412二、实验项目名称:进程调度算法的设计三、实验原理:短作业(进程)优先调度算法:短作业调度算法是从后备队列中选择一个或者若干个估计运行时间最短的作业,将他们调入内存运行。
而短进程优先调度算法则是从就绪队列中选出一个估计运行时间最短的进程,将处理机分配给它,使它立即执行并一直执行到完成,或者发生某事件而被阻塞放弃处理机时再重新调度。
时间片轮转法:系统将所有的就绪进程按先来先服务的原则排成一个队列,每次调度时,把CPU分配给队首进程,并令其执行一个时间片。
当执行的时间片用完时,由一个计时器发出时钟中断请求,调度程序便据此信号来停止该进程的执行,并将它送往就绪队列的队尾;然后,再把处理机分配给就绪队列中的新的队首进程,同时也让它执行一个时间片。
这样就可以保证就绪队列中的所有进程在一个给定的时间内均能获得一时间片的处理机执行时间。
四、实验目的:通过对进程调度算法的设计,深入理解进程调度的原理五、实验内容:1.编写程序实现SJ(P)F算法2.编写程序实现RR算法六、实验器材(设备、元器件):装有VC++的PC机一台七、实验步骤:1.打开VC,设计编写程序的源代码2.编译运行程序的源代码3.分析检验程序的结果是否正确4.总结实验结果及结论短进程优先调度源代码:#include ""struct sjf{char name[10];float arrivetime;float servicetime;float starttime;float finishtime;float zztime;float dqzztime;};sjf a[100];void input(sjf *p,int N){ int i;printf("intput the process's name & arrivetime & servicetime:\nfor exmple: a 0 100\n"); for(i=0;i<=N-1;i++){printf("input the %dth process's information:\n",i+1);scanf("%s%f%f",&p[i].name,&p[i].arrivetime,&p[i].servicetime);}}void Print(sjf *p,float arrivetime,float servicetime,float starttime,float finishtime,float zztime,float dqzztime,int N){int k;printf("run order:");printf("%s",p[0].name);for(k=1;k<N;k++){printf("-->%s",p[k].name);}printf("\nthe process's information:\n");printf("\nname\tarrive\tservice\tstart\tfinish\tzz\tdqzz\n");for(k=0;k<=N-1;k++){ printf("%s\t%\t%\t%\t%\t%\t%\t\n",p[k].name,p[k].arrivetime,p[k].servicetime,p[k].starttime ,p[k].finishtime,p[k].zztime,p[k].dqzztime);}}rrivetime<p[j].arrivetime){sjf temp;temp=p[i];p[i]=p[j];p[j]=temp;}}tarttime=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++){p[k].zztime=p[k].finishtime-p[k].arrivetime;p[k].dqzztime=p[k].zztime/p[k].servicetime;}}void sjff(sjf *p,int N){floatarrivetime=0,servicetime=0,starttime=0,finishtime=0,zztime=0,dqzztime=0;inishtime=p[m].arr ivetime+p[m].servicetime;elsep[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)ervicetime;int next=m+1;ervicetime<min){min=p[k+1].servicetime;next=k+1;}}sjf temp;temp=p[m+1];p[m+1]=p[next];p[next]=temp;}deal(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime,N); Print(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime,N); }void main(){ int N;printf("------短作业优先调度算法------\n");printf("input the process's number:\n");scanf("%d",&N);input(a,N);sjf *b=a;sjf *c=a;sjff(b,N);}时间片轮转法源代码:#include <>#define M 5 D=-1;}}int GetNum()D!=-1){j++;}}return j;}int GetReach(int time)eachTime<=time){a[i].ReachTime=100;return i;}}return -1;}int GetInsert()D==-1)return i;}return -1;}void Forward(int num)D=A[i+1].ID;A[i].TotalTime=A[i+1].TotalTime;}A[num-1].ID=-1;}void Process()D;K++;A[0].TotalTime--;=A[0].ID;=A[0].TotalTime;}void main(){int i;int time;int t=0;int reach;int insert;int num;printf("RR算法\n\n");INIT();for(i=0;i<M;i++){printf("请输入进程ID:");scanf("%d",&a[i].ID);printf("请输入到达时间:");scanf("%d",&a[i].ReachTime);printf("请输入服务时间:");scanf("%d",&a[i].TotalTime);}for(i=0;i<M;i++)otalTime;}for(i=0;i<50;i++)D=a[reach].ID;A[insert].TotalTime=a[reach].TotalTime;num=GetNum();if(num==1)continue;D=;A[num-1].TotalTime=;}}}elseD=-1;}}else if(num==0)continue;D=;A[num-1].TotalTime=;}}}}printf("\n");printf("调度顺序为:\n");Myprintf;for(i=0;i<50;i++){if(queue[i]!=-1)printf("|%2d ",queue[i]);}printf("|\n");Myprintf;printf("\n");}八、实验数据及结果分析:短作业优先调度算法的实验结果:时间片轮转调度算法结果:九、实验结论:本次实验成功的完成了短作业优先调度算法和轮转时间片调度算法的模拟,通过本次实验我们了解到短作业优先调度算法不利于长作业的处理,因为长作业将长期得不到处理,而轮转时间片调度算法则解决了这一问题。
实验 短作业优先进程调度算法模拟
1.写出你对给出的程序的理解,可以包括学到了那些程序设计的语法或方法,以及算法的设计思想。
2.写出实验指导中要求部分是如何实现的,
3.上述部分不能只是抄写代码,要有说明。
附录: 先来先服务进程调度模拟程序
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
printf("----------------------------------------------------------------------------------------------\n");
for(int i=0;i<N;i++)
{
printf(" %s %d %d %d %d \n",pcb[i].name,pcb[i].arrive_time,pcb[i].run_time,pcb[i].finish_time,pcb[i].zhouzhuan_time);
#include <conio.h>
#define N 5
struct PCB
{
char name[8];
int arrive_time;
int run_time;
int finish_time;
int zhouzhuan_time;
};
int total=0;
struct PCB pcb[N],temp;
output();
//运行第一个到达的进程得到它的完成时间、周转时间等,并设置为已访问
pcb[0].finish_time=pcb[0].arrive_time+pcb[0].run_time;
短作业优先算法
短作业(进程)优先调度算法1.短作业(进程)优先调度算法SJ(P)F,是指对短作业或短进程优先调度的算法。
它们可以分别用于作业调度和进程调度。
短作业优先(SJF)的调度算法是从后备队列中选择一个或若干个估计运行时间最短的作业,将它们调入内存运行。
而短进程(SPF)调度算法则是从就绪队列中选出一个估计运行时间最短的进程,将处理机分配给它,使它立即执行并一直执行到完成,或发生某事件而被阻塞放弃处理机再重新调度。
SJ(P)F调度算法能有效地降低作业(进程)的平均等待时间,提高系统吞吐量。
该算法对长作业不利,完全未考虑作业的紧迫程度。
2.流程图3.代码#include<iostream.h>#include<string.h>#include<stdlib.h>struct sjf{char name[10];float arrivetime;float servicetime;float starttime;float finishtime;float zztime;float dqzztime;};sjf a[100];void input(sjf *p,int N){ int i;printf("intput the process's name & arrivetime & servicetime:\nfor exmple: a 0 100\n");for(i=0;i<=N-1;i++){printf("input the %dth process's information:\n",i+1);scanf("%s%f%f",&p[i].name,&p[i].arrivetime,&p[i].servicetime);}}void Print(sjf *p,float arrivetime,float servicetime,float starttime,float finishtime,float zztime,float dqzztime,int N) {int k;printf("run order:");printf("%s",p[0].name);for(k=1;k<N;k++){printf("-->%s",p[k].name);}printf("\nthe process's information:\n");printf("\nname\tarrive\tservice\tstart\tfinish\tzz\tdqzz\n");for(k=0;k<=N-1;k++){ printf("%s\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t\n",p[k].na me,p[k].arrivetime,p[k].servicetime,p[k].starttime,p[k].finishtime, p[k].zztime,p[k].dqzztime);}}//pai xuvoid sort(sjf *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){sjf temp;temp=p[i];p[i]=p[j];p[j]=temp;}}//yun xing jieduanvoid deal(sjf *p, float arrivetime,float servicetime,float starttime,float finishtime,float &zztime,float &dqzztime,int N) { 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++){p[k].zztime=p[k].finishtime-p[k].arrivetime;p[k].dqzztime=p[k].zztime/p[k].servicetime;}}void sjff(sjf *p,int N){floatarrivetime=0,servicetime=0,starttime=0,finishtime=0,zztime=0,dq zztime=0;sort(p,N);for(int m=0;m<N-1;m++){if(m==0)p[m].finishtime=p[m].arrivetime+p[m].servicetime;elsep[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=nfor(int k=m+1;k<m+i;k++){if(p[k+1].servicetime<min){min=p[k+1].servicetime;next=k+1;}}sjf temp;temp=p[m+1];p[m+1]=p[next];p[next]=temp;}deal(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime, N);Print(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime ,N);}int main(){ int N;printf("------短作业优先调度算法------\n");printf("input the process's number:\n");scanf("%d",&N);input(a,N);sjf *b=a;sjf *c=a;sjff(b,N);system("PAUSE");}4.运行结果5.心得体会课程设计结束了,在这次的课程设计中不仅检验了我所学习的知识,也培养了我如何去做一件事情,又如何完成一件事情的能力。
调度算法之最短作业优先算法
调度算法之最短作业优先算法最短作业优先算法⼜叫做短进程优先算法写此博⽂⽬的:1.⽅便⾃⼰复习2.给正在学习此算法的⼈⼀点参考单道(⼀次只能运⾏⼀个进程)分析:先将进程按照到达时间升序排序,第⼀个进程到达的时候不等待,直接运⾏,因为他是第⼀个到达的进程,在他之前没有进程在运⾏,当有进程到达但是有其他进程在运⾏的时候,到达的进程处于等待状态,当某个正在运⾏的进程运⾏完毕的时候,需要选择下⼀个进程,依据是:处于等待状态的进程,且运⾏时间最短(当有多个进程处于等待状态的时候,选择运⾏时间最短的进程,这个结束最短作业优先算法的核⼼)代码如下:#include<bits/stdc++.h>using namespace std;#define TAKEIN "takein"//对应的进程状态#define WAIT "wait"#define RUN "run"#define FINISH "finish"#define PNUMBER 5//进程个数typedef struct pcb{char processName[20];//进程名称int arriveTime;//进程到达时间int startTime;//进程开始时间int endTime;//进程结束时间int runTime;//进程运⾏时间⼤⼩int turnOverTime;//周转时间int userweightTurnOverTime;//带权周转时间char provessStatus[10];//进程状态} pcb;pcb pcbs[PNUMBER];//进程数组int currentTime=0;//时间int processIndex=0;//进程的编号void createPcbs()//进程初始化函数{freopen("input.txt","r",stdin);//以只读操作读⽂件printf("进程名\t到达时间\t运⾏时间\n");for(int index=0; index<PNUMBER; index++)//遍历所有进程,给进程赋初值{scanf("%s",pcbs[index].processName);scanf("%d",&pcbs[index].arriveTime);scanf("%d",&pcbs[index].runTime);pcbs[index].endTime=0;pcbs[index].startTime=0;pcbs[index].turnOverTime=0;pcbs[index].userweightTurnOverTime=0;strcpy( pcbs[index].provessStatus,TAKEIN);printf("%s \t%d \t%d\n", pcbs[index].processName, pcbs[index].arriveTime, pcbs[index].runTime);}printf("\n***********************************************\n");}void printfPcbsInfo()//打印所有进程的所有信息{printf("当前时间为:%d时各进程的信息.....\n\n",currentTime);printf("进程名\t到达时间\t运⾏时间\t开始时间\t结束时间\t周转时间\t带权周转时间\t状态\n");for(int index=0; index<PNUMBER; index++){printf("%s\t%8d\t%8d\t%8d\t%8d\t%8d\t%8d\t%4s\n",pcbs[index].processName,pcbs[index].arriveTime,pcbs[index].runTime,pcbs[index].startTime,pcbs[index].endTime,pcbs[index].turnOverTime,pcbs[index].userweightTurnOverTime,pcbs[index].provessStatus); }}void sortPcbs()//按到达时间的升序排序{int minIndex=0,minValue=0;for(int i=0; i<PNUMBER; i++){minIndex=i;minValue=pcbs[i].arriveTime;for(int j=i; j<PNUMBER; j++){if(pcbs[j].arriveTime<minValue){minValue=pcbs[j].arriveTime;//保存最⼩的minIndex=j;}}pcb temp=pcbs[minIndex];//交换pcbs[minIndex]=pcbs[i];pcbs[i]=temp;}}int selNectProcess()//下⼀个进程的选择,条件:等待状态&&运⾏时间最短{int result=-1;int minTime=100;for(int index=0; index<PNUMBER; index++){if(strcmp(pcbs[index].provessStatus,WAIT)==0)//进程处于等待状态{if(pcbs[index].runTime<minTime)//且运⾏时间最短{minTime=pcbs[index].runTime;result=index;}}}return result;//返回下⼀个运⾏的进程的编号}int isHasProcessArrive()//检查在某⼀个时间点有没有进程到达{int result=-1;for(int index=0; index<PNUMBER; index++){if(pcbs[index].arriveTime==currentTime)//某个进程的到达时间等于当前时间{result=index;strcpy(pcbs[index].provessStatus,WAIT);//改变进程状态}}return result;}void runProcess(int pindex){int runTime=pcbs[pindex].runTime;//进程开始,需要改变进程的相关信息pcbs[pindex].startTime=currentTime;pcbs[pindex].endTime=pcbs[pindex].startTime+pcbs[pindex].runTime;strcpy(pcbs[pindex].provessStatus,RUN);printfPcbsInfo();//输出此时进程的信息for(int k=1; k<=runTime; k++) //进程运⾏中{currentTime++;//时间转动isHasProcessArrive();if(k==runTime)//进程结束条件{//改变进程相关信息strcpy(pcbs[pindex].provessStatus,FINISH);pcbs[pindex].turnOverTime=pcbs[pindex].endTime-pcbs[pindex].arriveTime;pcbs[pindex].userweightTurnOverTime=pcbs[pindex].turnOverTime*1.0/pcbs[pindex].runTime; }printfPcbsInfo();//打印进程此时信息}processIndex++;//准备运⾏下⼀个进程currentTime--;//收回⼀个时刻,因为下⼀个进程在此时运⾏}void startProcess()//开始进程的调度{int firstArriveTime=pcbs[0].arriveTime;//第⼀个到达的进程int nextIndex=0;printfPcbsInfo();while(1){currentTime++;//时间流动isHasProcessArrive();//检查这个时候有没有新到达的进程if(currentTime<firstArriveTime)//第⼀个进程都没有到{printfPcbsInfo();}else if(currentTime==firstArriveTime){runProcess(0);//执⾏进程}else//第⼀个进程执⾏完毕,选择下⼀个进程{nextIndex=selNectProcess();if(nextIndex!=-1)//存在下⼀个将要执⾏的进程{runProcess(nextIndex);}if(processIndex==PNUMBER)//所有进程执⾏完毕break;//跳出循环}}}int main(){createPcbs();//进程相关信息的初始化sortPcbs();//进程按照到达时间升序排序startProcess();//开始进程的调度return0;}输⼊⽂本如下:运⾏结果如下:如果有不⾜错误的地⽅,欢迎⼤家拍砖指正哦天⽓不错。
短作业优先调度算法例题详解(一)
短作业优先调度算法例题详解(一)短作业优先调度算法例题简介短作业优先调度算法(SJF)是一种常用的进程调度算法,也被称为最短作业优先调度算法。
它通过选择剩余执行时间最短的作业来调度进程,以提高系统的吞吐量和响应时间。
本文将在此背景下给出一个例题,并详细解释短作业优先调度算法的实现过程。
短作业优先调度算法的例题假设有以下四个进程需要执行:1.进程A,需要执行时间为5个单位时间2.进程B,需要执行时间为3个单位时间3.进程C,需要执行时间为8个单位时间4.进程D,需要执行时间为1个单位时间解题步骤使用短作业优先调度算法调度上述四个进程,按照以下步骤进行:1.计算每个进程的执行时间,得到以下结果:–进程A,需要执行时间为5个单位时间–进程B,需要执行时间为3个单位时间–进程C,需要执行时间为8个单位时间–进程D,需要执行时间为1个单位时间2.按照执行时间的大小对进程进行排序,得到以下顺序:–进程D(执行时间为1个单位时间)–进程B(执行时间为3个单位时间)–进程A(执行时间为5个单位时间)–进程C(执行时间为8个单位时间)3.按照排序后的顺序依次执行进程,得到以下调度结果:–进程D(执行时间为1个单位时间)–进程B(执行时间为3个单位时间)–进程A(执行时间为5个单位时间)–进程C(执行时间为8个单位时间)结论通过短作业优先调度算法,进程的执行顺序被合理调度,系统的响应时间得到了改善。
短作业优先调度算法可有效减少作业的平均等待时间,提高系统的吞吐量。
总之,短作业优先调度算法是一种简单且高效的进程调度算法,适用于在大多数情况下需要快速响应任务的系统。
它通过选择剩余执行时间最短的作业来调度进程,以提高系统性能。
在实际应用中,短作业优先调度算法需要根据系统实际情况进行调优,以获得更好的性能表现。
以上就是关于短作业优先调度算法例题的详细解释。
希望通过本文的介绍,读者能够对短作业优先调度算法有更加深入的了解。
短作业优先调度算法
短作业优先调度算法SJF算法的核心思想是最短作业先执行,这样可以最大化利用CPU资源,减少平均等待时间和作业的响应时间。
它适用于批处理系统和交互式系统。
SJF算法的实现包括两种方式:非抢占式和抢占式。
非抢占式SJF算法:在非抢占式SJF算法中,一旦CPU开始执行一个作业,它会一直执行完毕,直到作业完成或者发生I/O请求。
当一个新的作业到达时,系统会比较该作业的执行时间和当前正在执行的作业的剩余执行时间,如果新作业的执行时间较短,则优先执行新作业。
抢占式SJF算法:在抢占式SJF算法中,一旦有一个新的作业到达,并且它的执行时间比当前正在执行的作业短,操作系统会暂停当前作业的执行,将CPU分配给新作业,等新作业执行完毕后再继续执行之前的作业。
抢占式SJF算法需要操作系统具备抢占能力,即能够中断并恢复作业的执行。
SJF算法的优点是可以最大化利用CPU资源,减少平均等待时间和作业的响应时间,适用于CPU密集型的作业。
然而,SJF算法也存在一些问题和局限性:1.预测执行时间的困难:在实际系统中,很难准确预测一个作业的执行时间,因此SJF算法可能会出现误判,导致等待时间增加。
2.饥饿问题:如果有大量的短作业不断到达,长作业可能会一直等待。
这种情况称为饥饿问题,长作业可能无法获取足够的CPU时间,导致低响应性。
3.处理I/O请求的处理:SJF算法无法解决I/O请求的调度问题,因此需要结合其他算法来处理。
为了解决SJF算法存在的问题,还发展了一些改进的版本,如最短剩余时间优先算法(Shortest Remaining Time First, SRTF),该算法在抢占式的基础上,可以在作业执行过程中切换到更短的作业,以进一步减少等待时间。
总结起来,SJF算法是一种重要的进程调度算法,它按照作业的执行时间来确定优先级。
它的优点是可以最大化利用CPU资源,减少等待时间和作业响应时间。
然而,它也存在预测执行时间困难、饥饿问题和无法解决I/O请求的问题。
- 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<stdio.h>#include<conio.h>#include<windows.h>#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<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++){printf("%s\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t\n",p[k].name,p[k].arrive time,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){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){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++){p[k].zztime=p[k].finishtime-p[k].arrivetime;p[k].avezztime=p[k].zztime/p[k].servicetime;}}void jcbf(jcb *p,int N){floatarrivetime=0,servicetime=0,starttime=0,finishtime=0,zztime=0,avezztime=0; sort(p,N);for(int m=0;m<N-1;m++){if(m==0)p[m].finishtime=p[m].arrivetime+p[m].servicetime;elsep[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=nfor(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){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;}体会心得每一次课程设计度让我学到了在平时课堂不可能学到的东西。
所以我对每一次课程设计的机会都非常珍惜。
不一定我的课程设计能够完成得有多么完美,但是我总是很投入的去研究去学习。
整个课程设计下来,我浏览的相关网页已经超过了100个(不完全统计)。
当然网上的东西很乱很杂,自己要能够学会筛选。
不能决定对或错的,有个很简单的方法就是去尝试。
同学间的讨论,这是很重要的。