linux - 如果在执行系统调用时硬件定时器中断触发,会发生什么情况?

标签 linux x86 operating-system interrupt scheduler

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

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

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

最佳答案

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

如果没有设置CONFIG_PREEMPT,中断处理程序会标记一个标志,表明调度器需要运行。该标志将在系统调用终止时返回到用户空间时进行检查。

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

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

关于linux - 如果在执行系统调用时硬件定时器中断触发,会发生什么情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43826924/

相关文章:

Android 日期选择器月份作为数字

c - 向数千个文件添加 trec 格式标签

linux - 文件夹名称 文件夹内

c - 初始化 char[] 失败,esi 包含错误值

python - 进入子目录、运行命令然后返回的最优雅的方式是什么?

operating-system - 识别通用保护故障 (x86) 上的故障地址

assembly - 在 token 上编写 nasm 循环

linux - bash 脚本一次选择多种文件格式进行编码过程

linux - 如何在 redhat 上安装 jenkins 服务器

linux - watir headless 测试在本地 linux 上运行良好,但在 headless linux box 上出错