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

时间:2012-10-09 07:29:00

标签: c++ algorithm vector struct scheduling

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

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

使用此数据填充载体后:

1 1 5
2 3 2
3 5 10

其中每一行是一个单独的struct 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的方法是首先根据到达时间对矢量进行排序,然后如果两个或多个矢量索引具有相同的到达时间,则首先根据最短的burstTime对其进行排序。之后,使用

int currentTime = 0;

跟踪已经过了多长时间,

int i = 0;

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

我知道每当currentTime小于下一个最快的到达时间,那么这意味着处理器处于空闲状态,currentTime需要设置为此到达时间。

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

我知道这些是简单的数学运算来实现,但我不能想到如何以一种按照我想要的方式工作。它循环的方式以及有时几个进程有相同的到达时间会让我失望。我是否需要更多变量来跟踪发生的情况?每次进程被抢占时,我是否应该移动向量中所有项目的到达时间,并使用较短的突发时间的新进程中断?任何C ++代码甚至伪代码的帮助将不胜感激。我觉得我对SJF如何运作的概念非常坚定,但我只是在将我理解的内容翻译成代码时遇到了麻烦。

谢谢!

1 个答案:

答案 0 :(得分:1)

  

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

我认为没错。至少那不是我学习它的方式。 RR比SJF更接近FCFS(先到先得)。

实现SJF的一种方法是根据运行时间将传入的作业插入到挂起列表中。如果新作业的运行时间长于最后作业的运行时间,则插入位置在最后;否则它在第一个作业之前的运行时间比传入的作业长。调度很简单:删除挂起列表头部的作业并运行该作业完成。如果短作业不断进入并且在该作业之前以较长的运行时间进行处理,则可能永远不会运行具有长运行时间的作业。

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

我认为你可以像SJF那样将那些不完整的工作重新插入到流程列表的中间,但这对我来说似乎并不是非常循环,而且调度会很好。你无法使用"总是在头上运行工作"调度规则,因为那时你所拥有的就是SJF,只是变得更加复杂。