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

时间:2012-10-10 13:12:33

标签: c++ struct scheduling deque

使用看起来像这样的结构的双端队列:

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

如何输入结构的双端队列,以便输入如下:

0 0 3
1 5 2
3 8 4 

其中每一行分别是struct的ID,arrivalTime和burstTime,我可以打印出这样的内容:

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

此输出假设时间量为2.有没有办法只使用一个双端队列或者更容易创建另一个套牌作为FIFO队列来处理它?我知道我需要一个整数来记录已经过了多长时间,但除此之外这个问题真的让我很难过。它的空闲时间让我失望。任何C ++代码甚至psuedocode的帮助都会有所帮助。谢谢!

1 个答案:

答案 0 :(得分:0)

  

我知道我需要一个整数来跟踪已经过了多长时间

我将从三个值开始 - 经过时间,当前流程和下一个流程。您的调度循环可能如下所示。为简单起见,我将选择下一个过程的逻辑放在一个独立的函数中:

time = 0;
currentProcess = deque.end();
while(some processes remaining)
{
    nextProcess = getNextProcess(time, currentProcess, deque);

    if(nextProcess->arrivalTime > time)
    {
        // nothing to do now
        // advance time by smaller of quota or nextProcess->arrivalTime
    } else {
        // at least one process has work ready
        if(currentProcess != nextProcess)
        {
            // preemt currentProcess
            // start nextProcess
            // advance time by the smaller of quota or nextProcess->burstTime
            // reduce nextProcess->burstTime by the time advanced
        } else {
            // continue with current process for quota or its remaining burstTime
            // reduce its burstTime
        }
    }

    currentProcess = nextProcess;
}

实施getNextProcess取决于您的优先级标准,一种天真的方法可能如下所示:

  • 从位置deque开始,您需要currentProcess + 1。当你到达终点时,从头开始。
  • 记下最小arrivalTime大于time的流程。让我们称之为closestCandidate
  • 如果您找到包含arrivalTime <= timeburstTime > 0的合适流程,请返回
  • 如果您再次点击currentProcess,请在currentProcessclosestCandidate之间做出决定,最好处理并返回。{/ li>

最后要做的是有效地实现循环条件。我会留下让你弄明白的。

注意:我不确定deque是否是最好的容器,我可能会使用forward_list并在完成后删除这些流程。您也可以在deque中执行此操作,但这是O(n)操作。