非阻塞信号需要多长时间才能完成?

WiS*_*GaN 9 linux signals

  1. 当一个进程向另一个进程发送信号时,接收进程在什么情况下等待,直到它被重新安排为运行?
  2. 在什么情况下立即调用已安装的信号处理程序?
  3. 与仅直接调用相应的信号处理程序相比,在发出信号时进程会产生多少开销?

Dam*_*mon 6

关于信号的传递,TLPI指出当下一次调度任务时,从内核模式切换到用户模式时"正常"传递信号,或者当任务已经运行时"立即"传递(可能"立即"必须通过先发射一个中断,否则怎么办呢).嗯,无论这意味着什么,它都不是严格约束,但它与发生的事情非常接近.

您必须区分实时和"正常"信号以及同步生成的"正常"信号之间,大部分时间是由于硬件事件(例如分段故障)而非那些(它们是异步生成的) ).

实时信号排队,正常信号排队.这意味着正常信号的实现很可能仅仅是一个用作位掩码的每个任务字.
生成"正常"信号意味着设置一个位,当OS下一步决定是否必须传送信号时,它会测试该字对零,并在必要时确定设置了哪个位,并调用信号处理程序(s),如果有的话,相应的.
人们需要知道这一点的唯一实际原因是因为它可能"丢失"信号.如果在第一次传递之前生成了两个或更多信号,那么它仍然只有一个信号.

实时信号的实现(排队到依赖于实现的长度所需)显然要复杂得多.

由于硬件事件(例如段错误)而发生的信号是同步生成的,其方式与调用kill自身的过程(第22.4章TLPI)相同,即它们是"立即"传递的,原因有两个.首先,做其他事情是没有意义的,第二,当陷阱处理程序返回时,已经发生了内核/用户切换.因此,无论如何,交付总是"立即".