如果正在执行系统调用,硬件计时器中断会触发,会发生什么?

时间:2017-05-07 01:19:37

标签: linux x86 operating-system interrupt scheduler

假设我们有一个只有一个核心的CPU,并且有很多线程在这个核心上运行。

假设线程A 已发出系统调用,现在将执行系统调用的中断处理程序。

现在正在执行系统调用时,请说出硬件定时器中断(负责调度线程的中断)会触发。在这种情况下会发生什么情况,CPU是否会停止运行系统调用并执行调度程序代码,或者CPU是否必须等待系统调用完全执行才能切换到另一个线程?

2 个答案:

答案 0 :(得分:1)

在Linux中,答案实际上取决于名为CONFIG_PREEMPT的内核构建时配置选项。实际上有三种选择:

如果未设置CONFIG_PREEMPT,则中断处理程序将标记一个标志,指示调度程序需要运行。系统调用终止后,将在返回用户空间时检查该标志。

如果设置了CONFIG_PREEMPT_VOLUNTARY,则会发生相同的情况,除非在系统调用代码中的特定静态代码点处检查标志并运行调度程序(并且可能需要切换任务)

如果设置了CONFIG_PREEMPT_FULL,调度程序将在大多数情况下在从中断处理程序到系统调用代码的返回代码路径上运行,除非有一个抢占关键部分生效。

答案 1 :(得分:0)

除非系统调用阻止中断,否则将调用中断处理程序。