gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 14:49:42 25 4
gpt4 key购买 nike

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

假设当前单个进程的cpu突发跨越了轮询算法的一个以上时间片。

我的推理如下

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

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

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

    这会发生什么吗?还是进行了适当的上下文切换,包括不必要地保存了单独进程的当前状态并还原了该进程的当前状态?

    如果以后发生,是否有特殊原因?

    这种困惑是由于试卷中有关在这种情况下进行上下文切换所花费的时间的计算问题而引起的。给出的答案暗示上下文切换确实发生。

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

    最佳答案

    以下来自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 {
    ............

    关于operating-system - 在就绪队列只有一个进程且使用循环调度的系统中是否发生上下文切换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8997616/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com