关于信号的传递,TLPI指出当下一次调度任务时,从内核模式切换到用户模式时"正常"传递信号,或者当任务已经运行时"立即"传递(可能"立即"必须通过先发射一个中断,否则怎么办呢).嗯,无论这意味着什么,它都不是严格约束,但它与发生的事情非常接近.
您必须区分实时和"正常"信号以及同步生成的"正常"信号之间,大部分时间是由于硬件事件(例如分段故障)而非那些(它们是异步生成的) ).
实时信号排队,正常信号不排队.这意味着正常信号的实现很可能仅仅是一个用作位掩码的每个任务字.
生成"正常"信号意味着设置一个位,当OS下一步决定是否必须传送信号时,它会测试该字对零,并在必要时确定设置了哪个位,并调用信号处理程序(s),如果有的话,相应的.
人们需要知道这一点的唯一实际原因是因为它可能"丢失"信号.如果在第一次传递之前生成了两个或更多信号,那么它仍然只有一个信号.
实时信号的实现(排队到依赖于实现的长度所需)显然要复杂得多.
由于硬件事件(例如段错误)而发生的信号是同步生成的,其方式与调用kill
自身的过程(第22.4章TLPI)相同,即它们是"立即"传递的,原因有两个.首先,做其他事情是没有意义的,第二,当陷阱处理程序返回时,已经发生了内核/用户切换.因此,无论如何,交付总是"立即".
归档时间: |
|
查看次数: |
1040 次 |
最近记录: |