如果我错了,请纠正我。以下是我对信号的理解:
据我所知,信号生成 和信号传递有两种不同 的东西。为了产生信号, OS只是在bitarray中设置了一点 在过程控制中维护 块(PCB)的过程。每一点 对应于特定信号, 当一个位置位时,它意味着 对应于该位的信号是 悬而未决。
交货:转让控制权之前 回到用户模式的进程, 内核始终检查挂起 这个过程的信号。这个检查 必须在内核空间中发生,因为 一些信号永远不会被a忽略 过程 - 即SIGSTOP和SIGKILL。
这是否意味着只有在内核调度该进程(即分配CPU)时才能将信号传递给进程?当一个进程在CPU上实际执行时,它是否可以获得信号?如果是这样,那怎么可能,即该过程如何知道信号正在等待它(因为它在用户模式下执行而无法访问PCB)
假设存在多处理器机器,因此存在真正的并行性,即多个进程同时执行。进程P1在cpu 1上执行,进程P2在cpu2上执行,现在进程P2(具有足够的权限)向进程P1发送信号。此信号是立即传送到P1还是在P1因某种原因放弃CPU之后传送,并在稍后由内核重新安排,然后将此信号传送到过程P1。
请不要说这个问题是依赖于实现的。如果您发现正确的答案是实现定义,那么我正在寻找Linux,FreeBSD或您所了解的任何* nix平台的答案。
非常感谢您的帮助和耐心:)
此致
拉利
答案 0 :(得分:12)
答案是依赖于实现的:)。在Mac OS X(和FreeBSD)上,信号是异步处理的 - 内核找到一个没有阻塞信号的线程,并在该线程上设置Asynchronous System Trap标志。下次内核调度该线程时,它会处理陷阱(退出进程,忽略陷阱,或在用户空间中调用信号处理程序),而不是在用户空间中安排线程的常规延续。
在Solaris上,实现有点类似,虽然它还提供基于硬件陷阱的同步信号 - 同步信号被传递到引发陷阱的线程,而异步信号以上述方式工作。
Linux does something similar到Solaris(我不确定该引用的结论是如何从讨论中得出的,但讨论是有用的)。
Posix.4还定义了实时信号,但我没有使用过它们。
答案 1 :(得分:3)
简短的回答是 - 是的,进程仅在下一个计划的CPU时间片上获得信号的知识。
如何知道进程已收到信号 - 它可能会调用sigprocmask(2)。
答案 2 :(得分:0)
进程P1在cpu 1上执行,进程P2在cpu2上执行,现在进程P2(具有足够的权限)向进程P1发送信号。此信号是立即传送到P1还是在P1因某种原因放弃CPU之后传送,并在以后由内核重新安排,然后将此信号传送到过程P1。
据我所知,在最后一个linux内核上,当P2发出信号并且信号将立即传送时,P1的执行可能暂停。对于实时信号可能是真的
答案 3 :(得分:0)
如果我没记错的话,在8085指令的最后一个T状态期间检查中断到达位。因此必须有一种方法可以在信号到达时产生实际中断,或者在检查信号位之前必须有一个(常数?)代码片。
不幸的是,似乎回答一些内核行为相关问题的唯一方法是通过源代码,因为它们是如此依赖于实现"。对电脑进行编程实际上就是骚扰 - 这是一个什么样的职业选择!
尽量做到完美,希望这个网站有所帮助。