Linux 中信号是如何实现的?

Linux 中信号是如何实现的?

当一个进程向另一个进程发送信号时,接收进程是否会等到它重新调度运行?那么,如果我们每 1 毫秒选择运行一个进程,这是否意味着从生成信号到传递信号的延迟约为 0.5 毫秒? (假设我们只有两个进程。)
更一般地说,信号在 Linux 中是如何实现的?

答案1

这是(某种程度上)未定义的。

如果接收进程被设置为在收到信号后采取行动(即该信号没有被忽略或阻塞,那么该进程就变得可运行。如果它有足够的优先级,那么它也会立即被调度,但事实并非如此)保证。

答案2

不要猜测价值。

向进程发送信号就像(不可靠地)将事件排队到该进程一样。当进程被重新调度运行时,调度程序检查进程的队列,并安排要采取的操作。问题是你永远不知道调度程序何时会关注这个进程。

因此,使用信号的程序员必须意识到会有一个不可预测且不可避免的信号到达和采取行动之间的延迟。所以,不要试图猜测它的价值。

即使是实时信号也对这种延迟没有帮助。提高进程的计划优先级会更有效。但是您的代码永远不应该依赖任何调度程序的功能才能正确运行。

请参阅 APUE 第 10 章。

相关内容