Linux 调度程序代码在什么上下文中运行?
有两种情况会调用调度程序代码Linux 调度程序代码在什么上下文中运行?,linux,linux-kernel,scheduling,interrupt,Linux,Linux Kernel,Scheduling,Interrupt,有两种情况会调用调度程序代码schedule()- 当进程自愿调用schedule() 计时器中断调用schedule() 在案例2中,我认为schedule()是在中断上下文中运行的,但是第一个案例呢?它是否在调用它的进程的上下文中运行 当进程调用schedule()它在基于中断的系统调用上下文中运行时,还有其他调用schedule()的场景吗?。在第二种情况下,硬件中断触发schedule()调用。在这两种情况下,它都作为中断运行。好的,这是调用schedule()的唯一时间,因为大多数调度
schedule()
-
schedule()
schedule()
schedule()
是在中断上下文中运行的,但是第一个案例呢?它是否在调用它的进程的上下文中运行
当进程调用
schedule()
它在基于中断的系统调用上下文中运行时,还有其他调用schedule()
的场景吗?。在第二种情况下,硬件中断触发schedule()
调用。在这两种情况下,它都作为中断运行。好的,这是调用schedule()
的唯一时间,因为大多数调度操作都涉及修改要调度的事情的内核运行队列,尽管进程可以被中断,但这通常是通过中断来完成的,以通知进程屈服或进程屈服本身。schedule()
始终在流程上下文中运行。在第二种情况下,当它由计时器中断启动时,它位于从内核返回到中断进程的返回路径中,在该进程中调用schedule()
。\u 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相同