Linux 调度程序代码在什么上下文中运行?

Linux 调度程序代码在什么上下文中运行?,linux,linux-kernel,scheduling,interrupt,Linux,Linux Kernel,Scheduling,Interrupt,有两种情况会调用调度程序代码schedule()- 当进程自愿调用schedule() 计时器中断调用schedule() 在案例2中,我认为schedule()是在中断上下文中运行的,但是第一个案例呢?它是否在调用它的进程的上下文中运行 当进程调用schedule()它在基于中断的系统调用上下文中运行时,还有其他调用schedule()的场景吗?。在第二种情况下,硬件中断触发schedule()调用。在这两种情况下,它都作为中断运行。好的,这是调用schedule()的唯一时间,因为大多数调度

有两种情况会调用调度程序代码
schedule()
-

  • 当进程自愿调用
    schedule()

  • 计时器中断调用
    schedule()

  • 在案例2中,我认为
    schedule()
    是在中断上下文中运行的,但是第一个案例呢?它是否在调用它的进程的上下文中运行


    当进程调用
    schedule()
    它在基于中断的系统调用上下文中运行时,还有其他调用
    schedule()
    的场景吗?

    。在第二种情况下,硬件中断触发
    schedule()
    调用。在这两种情况下,它都作为中断运行。好的,这是调用
    schedule()
    的唯一时间,因为大多数调度操作都涉及修改要调度的事情的内核运行队列,尽管进程可以被中断,但这通常是通过中断来完成的,以通知进程屈服或进程屈服本身。

    schedule()
    始终在流程上下文中运行。在第二种情况下,当它由计时器中断启动时,它位于从内核返回到中断进程的返回路径中,在该进程中调用
    schedule()

    \u schedule()是主要的调度程序函数

    驱动调度程序并因此进入此功能的主要方式有:

  • 显式阻塞:互斥、信号量、等待队列等

  • t如果在中断和用户空间返回路径上选中“需要重新设置”标志。例如,请参见arch/x86/entry_64.S。为了在任务之间驱动抢占,调度程序在计时器中断处理程序调度程序_tick()中设置标志

  • 唤醒并不会真正导致进入计划()。他们将任务添加到运行队列,就这样。现在,如果添加到运行队列的新任务抢占了当前任务,则唤醒将设置TIF_NEED_RESCHED,并在最近的可能情况下调用schedule()

    • 如果内核是可抢占的(CONFIG\u PREEMPT=y):
      • 在syscall或exception上下文中,在下一个最外层的preempt_enable()。(这可能是在wake_up()的旋转解锁()时发生的!)
      • 在IRQ上下文中,从中断处理程序返回可抢占上下文
    • 如果内核不可抢占(未设置CONFIG_PREEMPT),则在下一步:
      • cond_resched()调用
      • 显式schedule()调用
      • 从系统调用或异常返回到用户空间
      • 从中断处理程序返回到用户空间

  • Well schedule()作为一个系统调用发生,这只是一个陷阱中断,对吗?@Jesus Ramos:“进程上下文”和“中断上下文”是Linux内核开发术语,用于描述在内核空间中执行的代码的上下文:是否可以将其视为代表特定进程执行(如在系统调用中)或者替代性地为硬件中断提供服务。是的,我知道这个术语,但在这个意义上,它有点令人困惑,因为系统调用在技术上是一种中断,所以我不确定这是他的意思还是调用实际执行的方式。@Jesus Ramos:根据内核的方式来分类是没有意义的输入,因为它总是通过某种中断的方式输入
    schedule()
    本身始终是代表要调度的进程执行的代码路径,即使内核是通过计时器中断(这意味着进程上下文)进入的。@JesusRamos:无论如何,传统的(非英特尔)术语是:中断(来自设备)、陷阱/系统调用(来自软件)、异常/故障(前者中的任何一个+来自CPU)。Intel将是:异常/故障(来自CPU),中断(来自任何地方)。调用schedule()的另一种情况是:当进程阻塞时(例如由于I/O操作)。@omer当进程阻塞时调用schedule()的是计时器中断。因此,您的情况与情况2相同