我正在阅读一些有关“信号”的 Linux 文档,但我的脑海中仍然有这些问题:
1)“信号”处理程序执行当“目标”进程接收到它时完成执行令牌来自调度程序?
2) 或“信号”处理程序执行发生在任何进程“上下文”发生待执行“信号”何时发送? (与硬件 ISR 风格相同)。
3)流程执行情况如何优先事项?他们在处理“信号”时是否被冲走了?
答案1
1) 信号处理程序在下次执行时执行目标进程从内核态返回到用户态。
当进程被安排在硬件中断后再次运行时(并且它尚未在内核模式下运行),或者当进程从系统调用返回时(在某些体系结构上,这些是同一件事),就会发生这种情况。
在正常操作中,当离开内核模式时,您的进程将简单地返回到最初离开用户模式的点之后的下一条指令。
但是,如果您的进程有一个信号待处理,内核将改写您的进程上下文,以便返回到用户模式将转至信号处理程序的第一条指令,并且您的堆栈将被修改为看起来像您在最初的位置对信号处理程序进行了“特殊”子例程调用离开用户模式(从这个“特殊”子例程调用返回涉及进行系统调用以恢复原始状态)。
所以“目标”进程可能会收到它的执行令牌来自调度程序在信号处理程序最终执行之前任意多次(如果它由于某种原因恰好停留在内核模式)。
2) 否 - 信号处理程序只会在进程的用户模式上下文中执行。
3)实际上并没有任何执行优先事项在像Linux这样的分时系统中,除非你算上好的过程的价值,所以你不能扫走一些不存在的东西。
事情因线程和所谓的即时的调度策略,因此上面的注释仅适用于使用非实时调度策略运行的单线程进程(唯一存在的进程类型)在过去的美好时光:-)。