为什么 Unix 以这种方式传递信号?

为什么 Unix 以这种方式传递信号?

在 Unix 中,当发出信号时,如果接收进程正在运行多个线程,则首先选择一个线程来执行信号处理例程。

我不明白为什么这是必要的,甚至不明白这样做有什么意义。信号处理程序难道不需要自己的堆栈、寄存器集等吗?

答案1

当然,它需要自己的堆栈和寄存器集。但它在哪个线程上下文中运行也很重要。首先,它控制在处理信号时中断哪些工作。

例如,假设线程 A 持有递归锁,并将某些关键结构更改为不一致状态。但这没问题,因为它不会释放锁,直到它将这些结构恢复到一致状态。

现在,假设信号中断了线程 A,信号处理程序会获取锁来检查该关键结构。它会获取锁,因为该线程已经持有锁,并且锁是递归的。由于它刚刚获得了保护关键结构的锁,因此它希望能够访问该结构并发现它处于一致状态。但是,当然,它处于不一致状态。繁荣!你刚刚崩溃了。

因此在这种情况下,信号处理程序必须始终转到从不获取该锁的线程。这样,当信号处理程序获取锁时,可以确保没有其他代码持有该锁,因此结构必须处于一致状态。

在多线程代码中,通常有一个线程,其唯一目的是捕获发送到程序的所有外部信号。它逐个处理信号,因此信号永远不会中断可能持有锁的代码。

相关内容