我将如何实现SJF和循环调度模拟器

How would I implement a SJF and Round Robin scheduling simulator?

本文关键字:SJF 循环调度 模拟器 实现 何实现      更新时间:2023-10-16

我有一个结构向量,结构看起来像这样:

struct myData{
int ID;
int arrivalTime;
int burstTime;
};

在用这个数据填充我的矢量之后:

1 1 5
2 3 2
3 5 10

如果每一行都是一个单独的结构的ID、arrivalTime和burstTime,我该如何使用"for"或"while"循环来遍历矢量的索引并计算数据,这样我就可以打印出这样的东西:

Time 0 Processor is Idle
Time 1 Process 1 is running
Time 3 Process 2 is running
Time 5 Process 1 is running
Time 8 Process 3 is running 

我知道SJF和RR调度非常相似,只是RR有时间量,所以在被另一个进程抢占之前,任何进程都不能持续超过任意时间限制。考虑到这一点,我认为在我实现SJF之后,只需对SJF算法进行一些修改,RR就会很容易实现。

我考虑实现SJF的方法是首先根据到达时间对向量进行排序,然后如果两个或多个向量索引具有相同的到达时间,则首先根据最短突发时间对其进行排序。之后,使用

int currentTime = 0;

以跟踪经过了多少时间,以及

int i = 0;

要用作矢量的索引并控制"while"循环,我将如何实现一种算法,使我能够打印出上面所示的所需输出?我对需要发生的事情有一个大致的想法,但我似乎无法以一种有效的方式将其全部放在代码中。

我知道,每当currentTime小于下一个最快的arrivalTime时,就意味着处理器空闲,需要将currentTime设置为这个arrivalTime。

如果向量[i+1].arrivalTime<currentTime+vector[i].burstTime,我需要将vector[i].burstTime设置为vector[i+1].arrivalTime-currentTime,然后将currentTime设置为vector[i+1].arrivalTime,然后打印出currentTime和进程ID

我知道这些都是简单的数学运算,但我想不出如何以我想要的方式来实现。它的循环方式,以及有时几个过程的到达时间相同,让我很困惑。我需要更多的变量来跟踪发生了什么吗?每次进程被突发时间较短的新进程抢占并中断时,我是否应该移动向量中所有项目的到达时间?如果您对C++代码甚至psuedo代码有任何帮助,我们将不胜感激。我觉得我对SJF的工作原理很了解,但我只是很难将我所理解的内容翻译成代码。

谢谢!

我知道SJF和RR调度非常相似,只是RR有时间量,因此任何进程在被另一个进程抢占之前都不能持续超过任意时间限制。

我认为这不对。至少我不是这么学的。RR比SJF更接近FCFS(先到先得)。

实现SJF的一种方法是根据运行时间将传入作业插入挂起列表。如果新作业的运行时间比结束时的作业长,则插入位置在结束时;否则,它在第一个作业之前,运行时间比传入作业长。日程安排很简单:删除挂起列表顶部的作业,然后运行该作业直至完成。如果短作业不断出现并在长运行时间作业之前得到处理,则长运行时间的作业可能永远不会运行。

实现循环的一种方法是使用FIFO,就像FCFS一样。新作业将添加到队列的末尾。调度再次变得简单:删除队列顶端的作业并进行处理。到目前为止,这正是FCFS所做的。两者的不同之处在于RR对作业的运行时间有限制。如果作业完成所需的时间超过某个时间段,则只运行该时间段,然后将其添加回队列的末尾。请注意,使用此公式,如果时间量比运行时间最长的作业的运行时间长,则RR等效于FCFS。

我想你可以像SJF那样,把那些不完整的工作重新插入到流程列表的中间,但这对我来说似乎不是很全面,日程安排也会更加混乱。你不能使用"总是在头上运行作业"的调度规则,因为那样你就只有SJF了,只会变得更复杂。