linux - 什么是不间断进程?

标签 linux scheduling preemption

有时,每当我在 Linux 中编写一个程序并且它由于某种错误而崩溃时,它会变成一个不间断的进程并继续运行直到我重新启动我的计算机(即使我注销)。我的问题是:

  • 是什么导致流程变得不可中断?
  • 如何阻止这种情况发生?
  • 这可能是个愚蠢的问题,但是有什么办法可以在不重新启动计算机的情况下中断它吗?

最佳答案

不可中断进程是恰好处于系统调用(内核函数)中且不能被信号中断的进程。

要理解这意味着什么,您需要理解可中断系统调用的概念。经典的例子是read()。这是一个可能需要很长时间(几秒)的系统调用,因为它可能涉及旋转硬盘驱动器或移动磁头。在此期间的大部分时间里,进程将处于休眠状态,阻塞在硬件上。

当进程在系统调用中休眠时,它可以接收到一个 Unix 异步信号(比如 SIGTERM),然后会发生以下情况:

  • 系统调用提前退出,并设置为将 -EINTR 返回给用户空间。
  • 信号处理程序被执行。
  • 如果进程仍在运行,它会从系统调用中获取返回值,并可以再次进行相同的调用。

提前从系统调用返回使用户空间代码能够立即改变其行为以响应信号。例如,干净地终止以响应 SIGINT 或 SIGTERM。

另一方面,有些系统调用是不允许这样中断的。如果系统调用由于某种原因停止,进程可以无限期地保持在这种无法杀死的状态。

LWN 运行了一个 nice article在 7 月份触及了这个话题。

回答原来的问题:

  • 如何防止这种情况发生:弄清楚是哪个驱动程序给您带来了麻烦,要么停止使用,要么成为内核黑客并修复它。

  • 如何在不重新启动的情况下终止不间断进程:以某种方式终止系统调用。在不按下电源开关的情况下执行此操作的最有效方法通常是拉电源线。您还可以成为内核黑客并让驱动程序使用 TASK_KILLABLE,如 LWN 文章中所述。

关于linux - 什么是不间断进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42039803/

相关文章:

linux - 管道如何工作?

python - Matplotlib 不适用于 Linux Mint Debian Edition 上的 Canopy 1.3

linux - Shell 脚本未完全执行并在中间退出

linux-kernel - Linux系统上的优先级处理

sql-server - 连接到 SQL Server(在 Linux 上)失败

java - 为任务分配优先级

Java、线程和优先级

linux - 何时为 Linux 内核 4.11 发布 RT_PREEMPT 补丁

multithreading - 基本多线程

c - 如何限制 C/POSIX 中函数的执行时间?