【问题标题】:Does a context switch occur in a system whose ready queue has only one process and which uses round-robin scheduling?上下文切换是否发生在就绪队列只有一个进程且使用循环调度的系统中?
【发布时间】:2012-02-18 08:04:09
【问题描述】:

在就绪队列只有一个进程且使用循环调度的系统中是否会发生上下文切换?

假设单独进程的当前 cpu 突发跨越循环算法的多个时间片。

我的推理如下

典型情况下发生定时器中断时可能发生的步骤是

  1. 发生中断。切换到内核模式
  2. OS 将当前上下文保存到 PCB(保存当前进程的寄存器、进程状态和内存管理信息)
  3. 执行许多特定于体系结构的操作,包括刷新 数据和指令缓存和TLB。
  4. 将当前进程放入就绪队列
  5. 选择要执行的新进程
  6. 从该进程的 PCB 加载上下文
  7. 切换到用户模式。开始执行新进程

我现在认为操作系统不妨先检查就绪队列并检查是否有其他进程。如果没有,则不需要上下文切换。因此,处理定时器中断需要在用户模式和内核模式之间切换,检查就绪 Q,然后切换回用户模式以恢复进程的执行。

这是怎么回事?或者是否进行了适当的上下文切换,涉及不必要地保存单独进程的当前状态并恢复该状态?

如果后者确实发生了,有什么特殊原因吗?

这种混淆是由于试卷中的一个问题涉及计算在这种情况下上下文切换所花费的时间。给出的答案暗示确实发生了上下文切换。

我希望研究过内核代码的人能够对此有所了解。因此这个关于stackoverflow的问题。

【问题讨论】:

    标签: operating-system scheduling round-robin


    【解决方案1】:

    以下来自 Linux Kernel 的代码将澄清您的疑问。在不同的时间,内核会调用调度器来选择一个新的进程来运行。但可能会发现调度程序除了当前正在运行的任务之外没有找到其他任务。在这种情况下,调度程序将不会进行“上下文切换”,而只是什么都不做而返回。

    例如,我给你Linux内核的代码

       .........
       if (likely(prev != next)) {<-- if next and current are same, then no context switch
                sched_info_switch(prev, next);
                perf_event_task_sched_out(prev, next);
    
                rq->nr_switches++;
                rq->curr = next;
                ++*switch_count;
    
                context_switch(rq, prev, next); /* unlocks the rq */
                /*
                 * The context switch have flipped the stack from under us
                 * and restored the local variables which were saved when
                 * this task called schedule() in the past. prev == current
                 * is still correct, but it can be moved to another cpu/rq.
                 */
                cpu = smp_processor_id();
                rq = cpu_rq(cpu);
        } else {
         ............
    

    【讨论】:

    • 我并不是说这些是确切的步骤和顺序。我的意思是说这些是可能的步骤,如果准备好的 Q 中没有其他流程,则可能不需要它们。我将尝试在我的问题中更清楚地说明这一点。是的,它们来自教科书。我现在正在学习操作系统。
    • 好!一本书会列出操作系统在一般情况下的作用。但是,正如您所提到的,实际的实现将处理极端情况。请注意,根据调度策略,即使有超过 1 个就绪进程,OS 仍可能选择时间片刚刚用完的进程。所以这是一个非常有用的检查。您不想运行额外的代码,只是发现它会使您的系统变慢。
    • 我想接受您的回答,因为您显示的 linux 代码清楚地表明,如果只有一个进程,则不会发生上下文切换。但是我觉得代码上面的解释并没有自然而然地引出代码所表达的观点。这发生在我澄清这个问题之前。您能否编辑您的答案(非 linux 代码部分),以便我可以接受您的答案。欢迎任何编辑我的问题的建议。
    • 谢谢。确实,前面的解释有点离题了。
    猜你喜欢
    • 2014-03-21
    • 2012-02-11
    • 1970-01-01
    • 2016-07-13
    • 2020-11-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 2018-07-30
    相关资源
    最近更新 更多