短作业优先调度算法

合集下载

操作系统短作业优先进程调度算法

操作系统短作业优先进程调度算法

操作系统短作业优先进程调度算法操作系统中的进程调度算法是指决定哪个进程在一些时间点被执行的规则和策略。

短作业优先(SJF)是一种常见的进程调度算法,它根据进程的执行时间来安排执行顺序。

短作业优先算法的思想是,优先调度执行所需执行时间最短的进程,以最大程度地减少平均等待时间和周转时间。

这个算法适合用于处理那些执行时间相对较短的任务。

SJF算法可以按两种方式实现:非抢占和抢占。

非抢占式短作业优先调度算法是指一旦一个进程开始执行,就不能被中断或抢占,直到它完成或由于其中一种原因被阻塞。

抢占式短作业优先调度算法是指一个新到达的进程可以抢占正在执行的进程,如果新到达的进程的执行时间比当前正在执行的进程更短。

对于非抢占式短作业优先调度算法,可以使用一个队列来保存进程,并通过比较它们的执行时间来确定下一个要执行的进程。

具体实现如下:1.首先,将所有待处理的进程添加到队列中。

2.对队列中的进程按照执行时间进行排序,按照从短到长的顺序执行。

3.执行每个进程直到完成,然后将其从队列中移除。

4.重复步骤3,直到所有进程都执行完成。

对于抢占式短作业优先调度算法,可以使用一个就绪队列和一个运行队列来实现。

就绪队列用于保存已到达但尚未执行的进程,而运行队列是当前正在运行的进程。

具体实现如下:1.首先,将所有到达的进程添加到就绪队列中,按照到达时间进行排序。

2.从就绪队列中选择执行时间最短的进程,并将其添加到运行队列中。

3.执行运行队列中的进程直到完成或被抢占。

4.如果有新的进程到达,将其加入到就绪队列中。

5.如果当前运行的进程被抢占,将其放回就绪队列中,并选择一个新的执行时间最短的进程来执行。

6.重复步骤3至5,直到所有进程都完成。

非抢占式短作业优先调度算法可以保证最短平均等待时间和周转时间,但存在一个问题,即长作业会被无限期地推迟。

为了解决这个问题,可以使用抢占式短作业优先调度算法,但这也会导致较多的上下文切换。

因此,根据具体情况和需求,可以选择适合的算法来实现进程调度。

作业调度算法之短作业优先调度算法和先来先服务调度算法

作业调度算法之短作业优先调度算法和先来先服务调度算法

作业调度算法之短作业优先调度算法和先来先服务调度算法假设有四个作业,他们的提交、运⾏时间如下表所⽰。

请回答下列问题:
(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的分配,造成长时间的等待。

短作业先服务调度算法和时间片轮转调度算法

短作业先服务调度算法和时间片轮转调度算法

短作业先服务调度算法和时间片轮转调度算法
1.短作业先服务(SJF)调度算法
短作业先服务调度算法是一种根据作业执行时间进行调度的算法。

它假设系统中所有作业的执行时间是已知的,并按照执行时间的大小来进行排序。

在每个时间片(或者说CPU的一个时间段)内,调度器会选择一个执行时间最短的作业来执行。

如果有多个作业的执行时间相同,则根据其到达时间进行比较,选择先到达的作业来执行。

短作业先服务调度算法的优点是可以最大程度地减少平均等待时间。

因为执行时间较短的作业会更早执行完毕,并释放CPU资源给其他作业使用。

然而,这种算法的缺点是可能会导致长作业的等待时间过长,从而降低了长作业的优先级。

时间片轮转调度算法是一种基于时间片的调度算法。

每个进程被分配一个时间片,该时间片内进程可以执行。

当时间片用完后,调度器会将进程放到就绪队列的末尾,并选择队列中的下一个进程来执行,直到所有进程执行完毕。

时间片轮转调度算法的优点是公平性,所有进程的等待时间都是相同的。

此外,该算法避免了长作业等待时间过长的问题。

但是,对于长时间执行的作业,其执行会被不断中断,导致一定的上下文切换开销。

时间片轮转调度算法适用于作业执行时间相对均匀的场景,保证了所有作业的等待时间公平,但会增加一定的上下文切换开销。

综上所述,短作业先服务调度算法和时间片轮转调度算法都有各自的优点和缺点,需要根据具体的应用场景选择合适的调度算法。

同时,考虑
到实际情况,也可以采用其他调度算法的变种或综合算法来更好地满足实际需求。

几种操作系统调度算法

几种操作系统调度算法

几种操作系统调度算法操作系统调度算法是操作系统中用于确定进程执行的顺序和优先级的一种方法。

不同的调度算法有不同的优缺点,适用于不同的场景和需求。

下面将介绍几种常见的操作系统调度算法:1.先来先服务(FCFS)调度算法:先来先服务调度算法是最简单的调度算法之一、按照进程到达的顺序进行调度,首先到达的进程先执行,在CPU空闲时执行下一个进程。

这种算法实现简单,并且公平。

但是,由于没有考虑进程的执行时间,可能会导致长作业时间的进程占用CPU资源较长时间,从而影响其他进程的响应时间。

2.短作业优先(SJF)调度算法:短作业优先调度算法是根据进程的执行时间进行排序,并按照执行时间最短的进程优先执行。

这种算法可以减少平均等待时间,提高系统的吞吐量。

然而,对于长作业时间的进程来说,等待时间会相对较长。

3.优先级调度算法:优先级调度算法是根据每个进程的优先级来决定执行顺序的。

优先级可以由用户设置或者是根据进程的重要性、紧迫程度等因素自动确定。

具有较高优先级的进程将具有更高的执行优先级。

这种算法可以根据不同情况进行灵活调度,但是如果不恰当地设置优先级,可能会导致低优先级的进程长时间等待。

4.时间片轮转(RR)调度算法:时间片轮转调度算法将一个固定的时间片分配给每个进程,当一个进程的时间片用完时,将该进程挂起,调度下一个进程运行。

这种算法可以确保每个进程获得一定的CPU时间,提高系统的公平性和响应速度。

但是,对于长时间运行的进程来说,可能会引起频繁的上下文切换,导致额外的开销。

5.多级反馈队列(MFQ)调度算法:多级反馈队列调度算法将进程队列划分为多个优先级队列,每个队列有不同的时间片大小和优先级。

新到达的进程被插入到最高优先级队列,如果进程在时间片内没有完成,则被移到下一个较低优先级队列。

这种算法可以根据进程的执行表现自动调整优先级和时间片,更好地适应动态变化的环境。

以上是几种常见的操作系统调度算法,每种算法都有其优缺点和适用场景。

操作系统短作业优先调度算法

操作系统短作业优先调度算法

操作系统短作业优先调度算法操作系统的短作业优先调度算法(Shortest Job First Scheduling,简称SJF)是一种用于进程调度的算法。

它的优势在于能够最小化平均等待时间,并且适用于批处理系统。

在本文中,我们将对SJF算法进行详细解释,并讨论其优缺点以及适用场景。

SJF算法的基本思想是优先选择估计完成时间最短的任务进行调度。

在该算法中,每个进程都与一个估计运行时间相关联,估计时间越短的进程将被优先调度执行。

通常情况下,进程的估计运行时间由之前的执行时间或者进程已经消耗的CPU周期数量来确定。

SJF算法可以分为两种类型:非抢占式和抢占式。

在非抢占式SJF中,一旦进程开始执行,它将一直运行直到完成。

而在抢占式SJF中,如果一个新进程的估计时间更短,则当前正在执行的进程将被暂停,并且将被新进程替换。

具体来说,SJF算法的执行步骤如下:1.从就绪队列中选择估计运行时间最短的进程。

2.若操作系统支持抢占式调度,则如果有一个新进程的估计时间更短,那么当前正在执行的进程将被抢占。

3.执行选定的进程,并更新进程的状态和估计运行时间。

4.如果进程未完成,则将其放回就绪队列,并重复第1步。

5.如果所有进程都已完成,则算法结束。

SJF调度算法的优点在于能够最小化平均等待时间,因为估计时间最短的进程将会先执行,而不会被长时间的进程阻塞。

这使得系统能够更高效地利用CPU资源,提高运行效率。

然而,SJF算法也有一些缺点。

首先,它要求对进程的估计运行时间有准确的预测,但在实际情况中,很难准确预测每个进程的运行时间。

其次,SJF算法对于长时间的进程可能会产生不公平现象,因为这些进程可能需要等待很长时间才能得到执行。

此外,SJF算法还有一些适用场景。

它特别适合用于批处理系统或长时间运行的作业,其中有多个进程需要按照最短运行时间进行调度。

这样可以确保任务能够快速完成并提高整体系统效率。

综上所述,SJF算法是一种用于进程调度的短作业优先调度算法。

先来先服务和短作业优先调度算法

先来先服务和短作业优先调度算法

先来先服务调度算法和短作业优先调度算法
作业
提交 时间
运行 时间
开始 时间
1 8.00 2.00 8.00
1 8.00 2.00 8.00
2 8.50 0.50 10.00
2 8.50 0.50 10.30
3 9.00 0.10 10.50
3 9.00 0.10 10.00
4 9.50 0.20 10.60
可有效降低作业/进程的平均等待时间。 4
SJ(P)F缺点:
(1) 该算法对长作业不利,如作业C的周转时间由10增 至16,其带权周转时间由2增至3.1。更严重的是,如果有 一长作业(进程)进入系统的后备队列(就绪队列),由于调度 程序总是优先调度那些(即使是后进来的)短作业(进程),将 导致长作业(进程)长期不被调度。(不利长作业)
(2) 该算法完全未考虑作业的紧迫程度,因而不能保证 紧迫性作业(进程)会被及时处理。(不及时)
(3) 由于作业(进程)的长短只是根据用户所提供的估计 执行时间而定的,而用户又可能会有意或无意地缩短其作 业的估计运行时间,致使该算法不一定能真正做到短作业 优先调度。(不完全可靠)
5
调度算法练习题
6
4 9.50 0.20 10.10
先来先服务调度算法
平均周转时间
t = 1.725
平均带权周转时间 w = 6.875
完成 周转 带权周转 执行 时间 时间 时间 顺序
10.00 2.00
1
1
10.00 2.00
1
1
10.50 2.00
4
2
10.80 2.30 4.6
4
10.60 1.60 16
3
10.10 1.10 11

短作业优先调度算法(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算法是一种简单有效的调度算法,在处理大量短作业请求时具有较好的性能表现。

但是,由于其存在的问题,需要根据实际情况进行合理的改进和调整,以提高系统的性能和稳定性。

短作业优先算法

短作业优先算法

短作业(进程)优先调度算法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.心得体会课程设计结束了,在这次的课程设计中不仅检验了我所学习的知识,也培养了我如何去做一件事情,又如何完成一件事情的能力。

操作系统——先来先服务(FCFS)和短作业优先(SJF)调度算法

操作系统——先来先服务(FCFS)和短作业优先(SJF)调度算法

进程号到达时刻服务时间(⼩时)A9:002B9:301C9:400.5D10:300.4进程号到达时刻服务时间(⼩时)开始时间完成时间周转时间(⼩时)带权周转时间A9:00291121B9:3011112 2.5 2.5C9:400.51212:30 2.83 5.66D10:300.412:3012:54 2.46操作系统——先来先服务(FCFS )和短作业优先(SJF )调度算法例题:计算在单CPU 环境下,采⽤FCFS 调度算法、SJF 优先调度算法时的平均周转时间和平均带权周转时间,并指出它们的调度顺序。

公式:周转时间 = 完成时间 - 到达时间带权周转时间 = 周转时间 / 服务时间平均周转时间 = 周转时间 / 进程数量平均带权周转时间 = 带权周转时间 / 进程数量完成时间的计算⽅法不同,分别如下:先来先服务(FCFS )调度算法:FCFS 调度顺序:A 、B 、C 、D (先来先服务)FCFS 完成时间:A (完成时间)=A (到达时间)+A (服务时间)=9+2=11B (完成时间)=A (完成时间)+B (服务时间)=11+1=12C (完成时间)=B (完成时间)+C (服务时间)D (完成时间)=C (完成时间)+D (服务时间)(该进程完成时间 =上⼀进程的完成时间 + 这个进程的服务时间)单位要转化进程号到达时刻服务时间(⼩时)开始时间完成时间周转时间(⼩时)带权周转时间A9:00291121B9:30111:5412:54 3.4 3.4C9:400.511:2411:54 2.4 4.8D10:300.41111:240.9 2.25平均周转时间:(2+2.5+2.38+2.4)/4=2.32平均带权周转时间:(1+2.5+5.66+6)/4=3.79短作业优先(SJF )调度算法:SJF 调度顺序:A 、D 、C 、BSJF 完成时间: A(完成时间)=A(到达时间)+A(服务时间) D(完成时间)=A(到达时间)+D(服务时间) C(完成时间)=D(到达时间)+C(服务时间) B(完成时间)=C(到达时间)+B(服务时间)平均周转时间: (2+3.4+2.45+0.9)/4=2.6875平均带权周转时间: (1+3.4+4.8+2.25)/4=2.8625。

先来先服务调度算法和短作业优先调度算法

先来先服务调度算法和短作业优先调度算法

先来先服务调度算法和短作业优先调度算法先来先服务调度算法是一种简单的调度策略,即按照进程到达时间的顺序来分配CPU时间片。

当一个进程到达CPU时间的时候,它会被加入到就绪队列中,并在队列中等待调度。

当一个进程完成执行或者发生I/O等等中断时,会使得另一个就绪队列中最前面的进程进入执行状态。

FCFS 的核心思想是谁先到谁先服务,且进程的执行顺序是固定的。

FCFS调度算法的优点是简单直观,易于实现。

在短期调度中,它能够保证不会产生饥饿现象,即保证每个进程都有机会执行。

这使得FCFS 成为一种公平的调度算法。

此外,由于该算法不需要频繁的上下文切换,它在处理长作业的性能上会比其他算法高。

然而,先来先服务调度算法也存在一些缺点。

最主要的问题是平均等待时间较长。

由于所有进程都需要按照到达时间顺序执行,如果前面存在一个执行时间较长的进程,那么后面的进程都需要等待很久才能执行。

这会导致平均等待时间增加,系统的响应时间变慢。

此外,FCFS算法无法适应实时环境,即使有一个紧急的进程,也要等待前面的进程执行完成才能运行。

为了解决FCFS调度算法的平均等待时间较长的问题,短作业优先调度算法应运而生。

短作业优先调度算法是根据进程的执行时间进行排序,选择执行时间最短的进程先执行。

该算法的核心思想是尽量选择执行时间短的进程,以减少平均等待时间。

短作业优先调度算法的优点是能够最大程度地减少平均等待时间,提高系统的响应性能。

由于执行时间短的进程能够快速完成,其他进程就能更快地得到执行。

这种调度算法适用于多任务操作系统,在系统内同时存在多个进程的情况下能够提高系统效率。

此外,SJF算法也可以应用于实时系统,并能够满足紧急任务的需求。

然而,短作业优先调度算法也存在一些问题。

首先,该算法需要准确地预测每个进程的执行时间,否则可能会导致执行时间较长的进程一直等待。

其次,该算法可能产生饥饿现象,即执行时间长的进程可能会一直等待执行。

这是因为短作业优先调度算法会优先选择执行时间短的进程,导致执行时间长的进程无法得到及时执行。

短作业优先调度算法例题详解

短作业优先调度算法例题详解

短作业优先调度算法例题详解
【最新版】
目录
1.短作业优先调度算法的概念和原理
2.短作业优先调度算法的例题
3.短作业优先调度算法的例题详解
正文
一、短作业优先调度算法的概念和原理
短作业优先调度算法(Shortest Job First, SJF)是一种常见的作业调度算法,其基本原理是优先执行估计运行时间最短的作业,直至完成。

当有两个或两个以上的作业都等待执行时,选择估计运行时间最短的作业执行。

这种算法能够使得平均等待时间最短,从而提高系统的效率。

二、短作业优先调度算法的例题
假设有一个计算机系统,其中有如下三个作业:
作业 1:运行时间为 20 分钟
作业 2:运行时间为 30 分钟
作业 3:运行时间为 10 分钟
系统按照短作业优先调度算法进行调度。

三、短作业优先调度算法的例题详解
1.作业 1、作业 2 和作业 3 都到达,系统按照短作业优先调度算法选择运行时间最短的作业 1 执行。

2.作业 1 执行完毕,作业 2 和作业 3 等待执行。

3.系统选择运行时间最短的作业 3 执行。

4.作业 3 执行完毕,作业 2 等待执行。

5.系统选择运行时间最短的作业 2 执行。

最终,三个作业的完成顺序为作业 1、作业 3、作业 2,平均等待时间为(20+10)/3=10 分钟。

通过这个例题,我们可以看到短作业优先调度算法能够使得平均等待时间最短,从而提高系统的效率。

然而,这种算法也有其不足之处,即长作业可能会被频繁地中断,从而影响系统的稳定性。

操作系统实验_先来先服务的调度算法和短作业优先

操作系统实验_先来先服务的调度算法和短作业优先

操作系统实验_先来先服务的调度算法和短作业优先先来先服务(FCFS)调度算法是一种非抢占式调度算法,在这种算法中,进程按照到达系统的先后顺序执行,并且在一个进程执行完毕之前,不会有其他进程执行。

如果一个进程没有执行完成,后续进程需要等待。

FCFS调度算法的优点是实现简单,公平性好。

由于按照到达时间先后顺序执行进程,能够保证所有进程都能够得到执行的机会。

然而,FCFS调度算法容易出现“饥饿”现象,即如果一个进程占用了较长的CPU时间,其他进程可能需要等待较长时间。

短作业优先(SJF)调度算法是一种非抢占式调度算法,它选择下一个执行的进程是根据预计的执行时间最短的进程。

在SJF调度算法中,进程按照预计的执行时间进行排序,并按照顺序执行。

SJF调度算法的优点是能够最大程度地减少平均等待时间。

因为进程按照预计的执行时间最短的顺序执行,执行时间短的进程优先执行,可以最大限度地减少其他进程等待的时间。

然而,SJF调度算法需要预先知道所有进程的执行时间,并且如果一个进程执行时间长,其他进程需要等待的时间可能会很长。

FCFS调度算法和SJF调度算法都有各自的优点和局限性。

FCFS调度算法适用于进程执行时间相对均匀的情况,可以保证所有进程都能够得到执行的机会。

但是,如果一个进程执行时间很长,可能会导致其他进程等待的时间非常长,容易出现“饥饿”现象。

SJF调度算法适用于进程执行时间差异较大的情况,可以最大程度地减少平均等待时间。

但是,SJF调度算法需要预先知道所有进程的执行时间,而且在实际应用中,很难准确预测进程的执行时间。

在实验中,可以通过编写相应的模拟程序来实现FCFS调度算法和SJF调度算法。

可以设定一个进程队列,每个进程有自己的到达时间和执行时间。

按照FCFS算法,按照到达时间先后顺序执行进程;按照SJF算法,按照执行时间从小到大的顺序执行进程。

通过模拟进程的调度过程,可以观察到FCFS算法和SJF算法的效果差异。

短作业优先调度算法例题详解(一)

短作业优先调度算法例题详解(一)

短作业优先调度算法例题详解(一)短作业优先调度算法例题简介短作业优先调度算法(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请求的问题。

sfj调度算法

sfj调度算法

sfj调度算法
SFJ算法,全称为Shortest Job First,即最短作业优先调度算法,是一种基于时间片轮转的调度算法。

该算法通过计算每个作业的运行时间,然后将当前时刻与所有作业的运行时间进行比较,选择最短作业投入运行。

SFJ算法的优点在于其简单易用,能够充分利用系统资源。

因为在系统中有大量作业等待运行时,该算法可以最大限度地减少系统的等待时间。

同时,由于SFJ算法是基于时间片轮转的调度算法,因此可以保证系统的公平性,即每个作业都有机会获得系统的资源。

请注意,以上只是SFJ算法的部分内容,如需更多信息,建议阅读计算机科学、运筹学或相关专业教材。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

青岛理工大学操作系统课程设计报告院(系):计算机工程学院专业:计算机科学与技术专业学生姓名:班级:__学号:题目:短作业优先调度算法的进程调度程序_起迄日期:________设计地点:指导教师:2011—2012年度第 1 学期完成日期: 2012 年 1 月日一、课程设计目的进行操作系统课程设计主要是在学习操作系统课程的基础上,在完成操作系统各部分实验的基础上,对操作系统的整体进行一个模拟,通过实践加深对各个部分的管理功能的认识,还能进一步分析各个部分之间的联系,最后达到对完整系统的理解。

同时,可以提高运用操作系统知识解决实际问题的能力;锻炼实际的编程能力、开发软件的能力;还能提高调查研究、查阅技术文献、资料以及编写软件设计文档的能力。

二、课程设计内容与要求设计目的:在多道程序和多任务系统中,系统内同时处于就绪状态的进程可能有若干个,且进程之间也存在着同步与互斥的关系,要求采用指定的调度策略,使系统中的进程有条不紊地工作,通过观察诸进程的运行过程,以巩固和加深处理机调度的概念。

2、设计要求(多道、单处理机):1)每一个进程有一个PCB,其内容可以根据具体情况设定。

2)可以在界面设定的互斥资源(包括两种:输入设备与输出设备)的数目3)进程数、进入内存时间、要求服务时间可以在界面上进行设定4)进程之间存在一定的同步与互斥关系,可以通过界面进行设定,其表示方法如下:进程的服务时间由三段组成:I2C10O5(表示进程的服务时间由2个时间片的输入,10个时间片的计算,5个时间片的输出)进程间的同步关系用一个段表示:W2,表示该进程先要等待P2进程执行结束后才可以运行因此,进程间的同步与互斥关系、服务时间可以统一用四段表示为:I2C10O5W25)可以在运行中显示各进程的状态:就绪、阻塞、执行6)采用可视化界面,可在进程调度过程中随时暂停调度,查看当前进程的状态以及相应的阻塞队列7)具有一定的数据容错性三、系统分析与设计1、系统分析本系统主要是采用短作业优先算法进程的进程调度过程。

短作业优先调度算法,是指对短作业或短进程优先调度的算法。

他们可以分别用于作业调度和进程调度,短作业优先的调度算法是从后备队列中选择一个或若干个估计运行时间最短的作业,将他们调入内存运行。

而短进程优先调度算法则是从就绪队列中选出一个估计运行时间最短的进程,将处理机分配给他,,使它立即执行并一直执行到完成,或发生某事件而被阻塞放弃处理机时再度重新调度。

本程序采用了非抢占式短作业优先调度。

而非抢占式这种方式,一旦把处理机分配给某进程后,便让该进程一直执行,直至该进程完成或发生某事件而被阻塞时,才再把处理机分配给其它进程,决不允许某进程抢占已经分配出去的处理机。

这种调度方式的优点是实现简单,系统开销小,适用于大多数的批处理系统环境。

但它难以满足紧急任务的要求——立即执行,因而可能造成难以预料的后果。

因此,在要求比较严格的实时系统中,不宜采用这种调度方式本系统的主要是在满足要求多道单处理机的情况下进行短作业的优先调度。

本系统在测试时输入了五个进程,按实验要求如I2C10O5(表示进程的服务时间由2个时间片的输入,10个时间片的计算,5个时间片的输出,5个时间片的计算组成)的方式输入,各进程的信息如下:(0 0 1 1 1 )(1 2 1 2 2 )(2 4 1 1 1 )(3 6 2 1 1 )(4 8 1 0 1),其中括号内第一个数字代表进程标识,第二个数字代表进程的到达时间,第三的字符串则代表的是服务时间,由此可得五个进程的服务时间分别为3,6,4,5,2。

进程进入内存,则按照优先级进行执行进程。

主要是实现了进程执行过程的界面演示以及在暂停演示时各进程此时的状态,主要包括三种状态——就绪、执行、阻塞。

同时,在暂停执行时可以查看当前时间的阻塞队列。

其中进程执行界面的演示过程中用到了坐标轴,x 轴代表时间,y轴代表进程的标志(默认进程标志为0,1,2,3,4……n-1,n表示进程的个数,在计数过程中按进程的到达时间开始计数),用灰色表示一个时间片,每个进程的执行过程即可表示为时间片不断增加的过程。

下面是进程信息的输入界面,界面介绍如下:需要录入的进程数:输入需要执行的进程的个数。

保存文件:输入数据后将自动保存进程信息,保存在txt文件中,因此输入你要保存的txt文件的名子,或者在输入进程信息时直接输入已保存的txt文件名(不包括扩展名.txt)便可直接点击“录入完毕”按钮,进行后续操作。

输入设备数目:主要是输入输入设备的数目。

输出设备数目:主要是输入输出设备的数目。

进入内存的时间:表示进程的到达时间。

要求服务时间:进程的服务时间由四段组成:I2C10O5(表示进程的服务时间由2个时间片的输入,10个时间片的计算,5个时间片的输出),按此格式输入信息,如若没有其中一步如没有计算这一步表示有0个时间片的计算,服务时间可以表示为I2C105 。

以此格式输入进程的服务时间。

“录入第1个数据“按钮:当你输入完毕第一个数据时,点击此按钮,进入第二个进程数据信息的录入。

“录入完毕进行演示“按钮:当你将所有进程的信息输入完毕后点击此按钮。

进入演示界面进行演示。

“退出“按钮:在执行此界面的任何时刻均可点击此按钮,退出此界面。

录入完毕点击按钮“录入完毕进行执行”后便会弹出进程的执行演示界面如下:右上角带颜色的三个矩形分别表示进程的执行状态,蓝色矩形代表进程正在执行,绿色矩形代表进程已经执行完成,红色矩形则代表进程受到阻塞。

“开始演示“按钮:点击此按钮则开始演示进程的执行过程。

“暂停演示“按钮:点击此按钮则暂停进程的演示过程。

“重新开始“按钮:点击此按钮则重新演示进程的执行过程。

“退出界面“按钮:点击此按钮则退出演示界面。

“查看阻塞队列”按钮:在点击“暂停演示”按钮之后,点击此按钮,可查看此时的阻塞队列。

1、系统设计本调度算法在设计的时候主要运用了四个类库。

PCB类库主要是包括了要运用到得相关类有三个,Process类主要是声明了进程的相关属性以及方法结构体,GetProcess 和SetProcess类主要是对进程相关属性进行处理。

Scheduling类库主要是实现短作业优先调度,同样包括三个类,BlockQueue类主要是实现对阻塞队列的处理,Rank类主要是实现按进程的优先级进行排序实现进程的短作业优先调度,SJF类主要是为了实现进程执行演示的方便设计的一个类,它声明了一个数组,将每个时刻的进程作为数组元素放入数据组中。

Used类库主要是对演示界面的处理,里面包括一个类Drawing,这个类主要是完成对演示界面所运用到得坐标轴的实现。

最后一个类库为短作业优先调度演示程序,主要包含了AddFrom和ShowFrom两个类,这两个类主要是实现程序界面的设计,以及相关控件事件的连接以及实现。

在本程序中主要运用的数据结构是数组,如Process[]数组主要使用了存放进来的进程(存放顺序按进程的到达时间,为方便描述一下均简写为P[]),block[]数组用来存放阻塞队列,exeQ[]是将进程按短作业优先级排序后的数组,okP[]数组则是某一时刻到达的所有进程所形成的数组,以上数组均已进程作为数组元素。

短作业优先调度流程图如下:短作业优先调度阻塞队列的流程图如下:阻塞队列进程调度演示流程图:进程调度演示四、系统测试与调试分析1、系统测试本程序主要是采用功能测试,对程序进行的相关的测试与分析。

共输入五个进程信息,输入设备和输出设备各输入一个然后分别输入各进程的到达时间和服务时间,分别如下:(0 1 1 1 )(2 1 2 2 )(4 1 1 1 )(6 2 1 1 1)(8 1 0 1)。

再输入过程中,进程的个数、到达时间以及输入设备和输出设备的个数分别是整数,否则将提示输入错误。

进程的服务时间必须严格按照要求来填写,否则将提示输入错误。

由此可得五个进程的执行顺序为:3,6,4,5,2。

2、调试分析在调试本程序时和演示过程中,出现了不少的错误。

其中在编写短作业优先调度算法的代码中,用到了不少的for循环以及for循环的嵌套,在这部分出现了变量的混淆,大括号的缺失或多余,经过检查后改正。

在编写短作业优先算法代码的时候,出现了思路紊乱,算法思路不清晰,不能够完成短作业的优先,后经请教同学以及通过画相关流程图得到解决。

还有由于对c#的运用并不熟练以及对c#的可视化界面的制作不太了解,使自己在做程序过程中遇到了很大的阻力,后经过翻看相关书籍以及请教同学,解决的这个问题。

本程序的演示界面做的很简陋,只是简单的实现了非抢占式的短作业优先调度,但是在本程序的功能中有一项实现输入设备和输出设备只是实现了设备数目的输入功能,但是没有实现设备之间的互斥问题。

因此,本程序无论是在界面还是在功能上均有很大的缺点和不足之处,需要不断的改进和完善。

五、用户手册1、程序的编写是在win7系统下的VS2010成的。

2、由于电脑系统里已经安装了vs2010此不需要再进行安装。

3、使用本程序界面的步骤。

(1)运行本程序会弹出界面如图5-1:图5-1(2)在以上弹出的界面上输入进程的数目以及保存的文件名和输入设备和输出设备的数目。

然后输入第一个进程的进入内存的时间和要求服务的时间。

如图5-2:图5-2(3)点击“录入第1个数据”按钮,弹出以下窗口,开始输入第二个数据的进入内存的时间和要求服务的时间。

如若输入的数据格式正确,则会弹出图5-3:图5-3点击确定按钮,进入下一个数据的输入图5-4:图5-4如此依次输入所有进程的相关信息,直到所有的进程信息都输入完毕。

如若输入数据不正确则会弹出窗口图5-5:图5-5点击确定重新输入正确的进程信息。

(4)当将所有的进程信息都输入完毕后,点击“录入完毕进行演示”按钮。

则会弹出演示界面图5-6:图5-6(5)点击开始演示按钮,进程开始执行。

演示状态如图5-7:图5-7(6)点击暂停按钮,演示暂停,进程停止执行,此时可查看各进程的状态图5-8。

图5-8(7)在暂停的情况下,点击“查看阻塞队列”按钮。

则会弹出以下窗口,并显示此刻的阻塞队列。

如图5-9:图5-9(8)如果想重新演示,可以点击“重新开始”按钮。

当演示完毕后,可以点击“退出界面”按钮。

退出演示界面。

六、程序清单using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace QD.Mg.Winform.Processpublic class Process{static int num = 0;private int privatePcb;//程序内部使用的PCBpublic int PrivatePcb{get { return privatePcb; }set { privatePcb = value; }}private int enteringTime;//进入内存的时间public int EnteringTime{get { return enteringTime; }set { enteringTime = value; }}private double serviceTime;//要求服务的时间public double ServiceTime{get { return serviceTime; }set { serviceTime = value; }}public Process(){privatePcb = num++;enteringTime = -1;serviceTime = -1;}///<summary>///重载的方法///</summary>///<returns></returns>public override string ToString(){return privatePcb + "|" + enteringTime + "|" + serviceTime ; }}}using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.IO;namespace QD.Mg.Winform.Processpublic class SetProcess{private static bool save(string filePosition,string content){try{StreamWriter sw = new StreamWriter(filePosition, true, System.Text.Encoding.Default);//在原有的基础上添加sw.Write(content);sw.Close();}catch(IOException e){Console.WriteLine(e.Message);return false;}return true;}public static int setProcesses(string filePosition,Process p){//将Process中的每个进程对象都拼接成一个string字符串,存放到txt文件中string saveString = p.ToString();saveString = saveString + "\r\n";//在字符串的最后加上换行的标志//调用save函数,实现存储save(filePosition, saveString);return 0;}}}using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.IO;using System.Text.RegularExpressions;namespace QD.Mg.Winform.Process{public class GetProcess{public static Process[] getProcesses(string filePosition){string content = read(filePosition);string []childString = content.Split(newstring[]{"\r\n"},StringSplitOptions.RemoveEmptyEntries);//Process[] process = new Process[childString.Length];for (int i = 0; i < process.Length;i++ ){process[i] = new Process();}for (int i = 0; i < process.Length; i++){//将一个进程的转化成对应的类string[] grandsonString = childString[i].Split('|');//为各个变量赋值process[i].PrivatePcb = Convert.ToInt32(grandsonString[0]);process[i].EnteringTime = Convert.ToInt32(grandsonString[1]); process[i].ServiceTime = Convert.ToInt32(grandsonString[2]);}return process;}private static string read(string filePosition){FileStream fs = new FileStream(filePosition, FileMode.Open, FileAccess.Read);StreamReader sr = new StreamReader(fs, Encoding.Default);string content = sr.ReadToEnd();sr.Close();return content;}}}using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace QD.Mg.Winform.Scheduling{///<summary>///阻塞队列的处理函数///</summary>public class BlockQueue{public static Process.Process[] getBlockQueue(int time, Process.Process[] process){#region变量初始化Process.Process[] block = newQD.Mg.Winform.Process.Process[process.Length];//阻塞队列数组Process.Process[] exeQ;//每个算法的执行顺序Process.Process[] okP;//给定时间内到达的进程int num = 0;//阻塞队列的下标int okPNumber = 0;int isFinish = -1;//完成的进程的最后一个的下标int isFinishTotalServiceTime = 0;//完成进程的总的服务时间#endregion#region SJF 短作业优先调度算法//首先获取得到执行的序列exeQ = Rank.getRank(process);//符合条件的okP = new QD.Mg.Winform.Process.Process[process.Length];#region获取得到给定时间内到达的进程,进行阻塞队列的计算for (int i = 0; i < exeQ.Length; i++){if (exeQ[i] != null && exeQ[i].EnteringTime <= time){okP[okPNumber++] = exeQ[i];}}#endregion#region获取已经执行完了的进程的标志已经执行完了的总的服务时间for (int i = 0; i < okP.Length; i++){if (okP[i] != null){isFinishTotalServiceTime = isFinishTotalServiceTime + Convert.ToInt32(okP[i].ServiceTime);if (isFinishTotalServiceTime > time){isFinish = i - 1;break;}}}#endregion#region去除不符合条件的for (int j = 0; j < isFinish + 2; j++){okP[j] = null;}#endregion#region将okP中的非空值,按照在数组中的顺序,存入阻塞数组中for (int i = 0; i < okP.Length; i++){if (okP[i] != null){block[num++] = okP[i];}}#endregion#endregionreturn block;}}}using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace QD.Mg.Winform.Scheduling{public class Rank{public static Process.Process[] getRank(Process.Process[] process){//首先按照进入时间排序,然后根据服务时间对排序进行调整#region按照进入时间进行排序Process.Process temp;for (int i = 0; i < process.Length - 1; i++){for (int j = i + 1; j < process.Length; j++){if (process[i].EnteringTime > process[j].EnteringTime) {temp = process[i];process[i] = process[j];process[j] = temp;}}}#endregionfor (int i = 0; i < process.Length; i++){//获取前面一段的要求服务总时间int totalServiceTime = 0;for (int x = 0; x <= i; x++){totalServiceTime = totalServiceTime +Convert.ToInt32(process[x].ServiceTime);}//找到要处理的进程数组,即在前一个进程处理时间内到达的进程 Process.Process[] front = newQD.Mg.Winform.Process.Process[process.Length];//注意空值for (int j = i + 1; j < process.Length; j++){if (Convert.ToInt32(process[j].EnteringTime) < totalServiceTime){front[j] = process[j];}}#region将front中的非空数据Process.Process m;for (int ii = 0; ii < front.Length - 1; ii++){for (int j = ii + 1; j < front.Length; j++){//if (front[ii] != null && front[j] != null){if (front[ii].ServiceTime >front[j].ServiceTime)//将作业大的排在后面,实现短作业优先{m = front[ii];front[ii] = front[j];front[j] = m;}}}}//将front中的非空数据,覆盖process中的相应位置的数据for (int a = 0; a < front.Length; a++){if (front[a] != null){process[a] = front[a];}}}return process;}}}using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace QD.Mg.Winform.Scheduling{public class SJF{public static int[] getExecuteQueue(Process.Process[] process){int totalServiceTime = 0;for (int i = 0; i < process.Length; i++){totalServiceTime = totalServiceTime +Convert.ToInt32(process[i].ServiceTime);}int[] executeQueue = new int[totalServiceTime];int tips = 0;Process.Process[] exequeue = Rank.getRank(process);for (int i = 0; i < exequeue.Length; i++){for (int j = 0; j < exequeue[i].ServiceTime; j++){executeQueue[tips++] = exequeue[i].PrivatePcb;}}return executeQueue;}}}七、体会与自我评价短作业优先调度算法,是指对短作业或短进程优先调度的算法。

相关文档
最新文档