假设我们有一个只有一个内核的 CPU,并且有许多线程在这个内核上运行。
假设线程A发出了一个系统调用,现在系统调用的中断处理程序将被执行。
现在,当系统调用正在执行时,假设硬件定时器中断(负责线程调度的中断)触发。在这种情况下会发生什么,CPU 会停止运行系统调用并去执行调度程序代码,还是 CPU 必须等待系统调用完全执行才能切换到另一个线程?
最佳答案
在 Linux 中,答案实际上取决于称为 CONFIG_PREEMPT 的内核构建时配置选项。实际上有三种选择:
如果没有设置CONFIG_PREEMPT,中断处理程序会标记一个标志,表明调度器需要运行。该标志将在系统调用终止时返回到用户空间时进行检查。
如果设置了 CONFIG_PREEMPT_VOLUNTARY,除了将检查标志并在系统调用代码中的特定静态代码点运行调度程序(如果需要,还可能切换任务),将发生相同的情况
如果设置了 CONFIG_PREEMPT_FULL,调度程序将在大多数情况下在从中断处理程序到系统调用代码的返回代码路径上运行,除非抢占临界区生效。
关于linux - 如果在执行系统调用时硬件定时器中断触发,会发生什么情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43826924/