我有一个结构 vector ,结构看起来像这样:
struct myData{
int ID;
int arrivalTime;
int burstTime;
};
用此数据填充 vector 后:
1 1 5
2 3 2
3 5 10
其中每一行都是一个单独的结构的ID,到达时间和猝发时间,我将如何使用“for”或“while”循环遍历 vector 的索引并以可以打印出类似以下内容的方式计算数据:
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的方式是首先根据到达时间对 vector 进行排序,然后,如果两个或多个 vector 索引具有相同的到达时间,则首先根据最短的burstTime对它进行排序。之后,使用
int currentTime = 0;
跟踪经过了多少时间,以及
int i = 0;
用作 vector 的索引并控制“while”循环,如何实现允许我打印出上面所示的所需输出的算法?我对需要发生的事情有一个大致的了解,但是我似乎无法以一种可行的方式将其全部摆在代码中。
我知道,只要currentTime小于下一个最快的到达时间,那么这意味着处理器处于空闲状态,并且currentTime需要设置为此到达时间。
如果vector [i + 1] .arrivalTime
我知道这些是要实现的简单数学运算,但是我想不出如何按照我想要的方式进行布置。它的循环方式以及某些进程有时具有相同的到达时间的方式使我不满意。我是否需要更多变量来跟踪发生了什么?每当一个进程被抢占并被更新的,中断时间较短的进程打断时,是否应该改变 vector 中所有项目的到达时间?我们将不胜感激C++代码甚至伪代码中的任何帮助。我觉得我对SJF的工作原理非常满意,但是我很难将我所理解的东西转换成代码。
谢谢!
最佳答案
我认为那是不对的。至少那不是我学到的。 RR比SJF更接近FCFS(先到先得)。
实现SJF的一种方法是根据运行时间将传入作业插入待处理列表中。如果新作业的运行时间比末尾作业的运行时间长,则插入位置在末端。否则,它比第一个作业的运行时间长于传入作业的时间。计划很容易:删除待处理列表顶部的作业,然后运行该作业以完成任务。如果短作业不断进入并在运行时间较长的作业之前得到处理,则可能永远不会运行运行时间较长的作业。
实现循环的一种方法是使用FIFO,就像使用FCFS一样。新作业将添加到队列的末尾。调度再次变得容易:删除队列开头的作业并进行处理。到目前为止,这正是FCFS所做的。两者的区别在于,RR对作业可以运行多长时间有限制。如果作业花费的时间超过某个时间段,则作业仅运行该时间量,然后将其添加回队列的末尾。请注意,如果时间量长于最长运行作业的运行时间,则RR等效于FCFS。
我想您可以像SJF一样将那些不完整的作业重新插入到流程列表的中间,但这对我来说似乎不是很轮流,而且调度工作也很麻烦。您不能使用“始终先行作业”的调度规则,因为那样的话,您所拥有的只是SJF,只是变得更加复杂。
关于c++ - 我将如何实现SJF和Round Robin调度模拟器?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12794933/