Linux 非阻塞信号传输需要多长时间? 当一个进程向另一个进程发送信号时,在什么情况下,接收进程要等到重新安排运行时才能运行 在什么情况下会立即调用已安装的信号处理程序 与直接调用相应的信号处理程序相比,进程在发出信号时会产生多少开销

Linux 非阻塞信号传输需要多长时间? 当一个进程向另一个进程发送信号时,在什么情况下,接收进程要等到重新安排运行时才能运行 在什么情况下会立即调用已安装的信号处理程序 与直接调用相应的信号处理程序相比,进程在发出信号时会产生多少开销,linux,signals,Linux,Signals,基本上,信号是异步的。它们依赖于信号处理程序在接收到信号时执行代码,因为您永远不知道何时会由于进程调度器等因素而导致。发送信号的延迟基于硬件/软件中断,硬件/软件中断基于时钟速度 如果您想了解Linux上是如何实现的,请查看标准 关于信号的重要信息: 生成信号时,它将变为挂起。通常情况下,它仍然存在 仅在短时间内挂起,然后交付给 发出信号的进程。然而,如果这种信号是 当前被阻止,它可能会无限期地挂起,直到收到信号 这种情况是不受阻碍的。一旦解锁,它将被交付 马上 另一摘录: 信号发送时,无论是

基本上,信号是异步的。它们依赖于信号处理程序在接收到信号时执行代码,因为您永远不知道何时会由于进程调度器等因素而导致。发送信号的延迟基于硬件/软件中断,硬件/软件中断基于时钟速度

如果您想了解Linux上是如何实现的,请查看标准

关于信号的重要信息:

生成信号时,它将变为挂起。通常情况下,它仍然存在 仅在短时间内挂起,然后交付给 发出信号的进程。然而,如果这种信号是 当前被阻止,它可能会无限期地挂起,直到收到信号 这种情况是不受阻碍的。一旦解锁,它将被交付 马上

另一摘录:

信号发送时,无论是立即发送还是在长时间之后发送 延迟,则对该信号采取指定的操作


关于信号的传递,TLPI指出,当任务下一次调度时,当从内核模式切换到用户模式时,或者当任务已经运行时,信号“正常”传递,或者“立即”传递(假定“立即”必须首先触发中断,否则它怎么能做到这一点)。不管这意味着什么,它没有严格的约束力,但它非常接近实际情况

您必须区分实时信号和“正常”信号,以及同步生成的“正常”信号,大多数情况下是由于硬件事件(例如分段故障)和非同步生成的信号(它们被生成为非同步信号)

实时信号排队,正常信号不排队。这意味着正常信号的实现很可能只是每个任务字一个,用作位掩码。
生成一个“正常”信号意味着设置一个位,当操作系统下一步决定是否必须发送信号时,它将根据零测试该字,如果有必要,找出设置了哪些位,并相应地调用信号处理程序。
人们需要知道这一点的唯一实际原因是,可能会“丢失”信号。如果在第一个信号发送之前生成了两个或多个信号,那么它仍然只是一个信号

实时信号的实现(需要排队到与实现相关的长度)显然要复杂得多

由于硬件事件(如segfault)而发生的信号是同步生成的,其方式与进程本身被称为
kill
(第22.4章TLPI)的方式相同,即,出于两个原因,它们“立即”交付。首先,做其他事情是没有意义的,其次,当陷阱处理程序返回时,已经发生了内核/用户切换。所以无论如何,交付总是“立即”的