信号并中断比较

基于各种参考文献,我在Linux中信号主观定义是“用于通知进程关于特定事件发生的触发器。这里的事件可能涉及软件exception。另外,信号也可以用于IPC机制。 “ 我有的问题是

  • 我认为只有exception(软件中断)通过信号通知。关于硬件中断的情况。
  • 信号的各种来源是什么? 对我来说,内核始终是信号的来源(除了用于IPC)
  • 信号处理程序和ISR之间的区别?
  • 信号阻塞和中断屏蔽之间的区别?

Solutions Collecting From Web of "信号并中断比较"

中断可以被看作CPU和操作系统内核之间通信的一种手段。 信号可以被看作是操作系统内核和操作系统进程之间通信的一种手段。

中断可能由CPU(异常 – 例如:除以零,页错误),设备(硬件中断 – 例如:输入可用)或CPU指令(陷阱 – 例如:系统调用,断点)启动。 它们最终由CPU进行管理,CPU“中断”当前的任务,并调用一个由OS内核提供的ISR /中断处理程序。

信号可以由OS内核(例如:SIGFPE,SIGSEGV,SIGIO)或进程(kill())启动。 它们最终由OS内核管理,OS内核将它们传递给目标线程/进程,调用通用操作(忽略,终止,终止和转储内核)或进程提供的信号处理程序。

我认为只有异常(软件中断)通过信号通知。关于硬件中断的情况。

从哪里开始? 有很多不同的情况。 请记住,中断是调用CPU的硬件。 中断本质上由“硬件需要注意”和0到255之间的一个数字组成。信号是相似的,但有2个参数:目标进程ID和一个int(32位或64位,取决于拱)。 硬件中断总是在内核空间中处理,而信号只是用户空间的东西。 内核出于各种原因使用硬件中断。

与信号无关的硬件中断的一个例子是VM子系统。 您知道,在现代操作系统上,您可以分配比系统上实际存在更多的内存。 那么这是如何工作的? 那么它通过利用硬件中断来工作。 当你分配内存的时候,内核会记录下来,但实际上并没有做任何事情。 然后,当你尝试访问分配的内存时,CPU会抱怨“但这个内存不存在”,这将产生一个硬件中断。 内核会去查看它的注释,发现你确实要求这个内存,清除一些已经释放的内存,并告诉CPU在预期的位置“映射”那个内存。 之后,内核会在硬件中断发生之前恢复您的程序,这一次该进程会发现内存正常。

多任务也是通过利用硬件中断来实现的。 所有驱动程序通常通过解释中断来工作。

信号用于进程之间的通信。 一些非常“信号-y”的东西就是linux守护进程在SIGHUP上重新加载配置的常见行为,被系统管理员所喜爱和讨厌。 当你修改一个apache配置时,进程不会自动开始使用新的配置。 您可能会终止并重新启动该进程,但这意味着您的http服务器将在4-5秒内无法播放。 所以相反,你可能会“killall -HUP apache”。 这将在apache进程中调用一个子例程,这将使其重新读取它的配置文件。

进程挂起是通过信号(ctrl-z),进程中断(ctrl-c),进程退出(ctrl-),终端断开(sighup)来实现的,…更完整的列表可以在这里找到: http:// en .wikipedia.org / wiki / Unix_signal 。

一个结论可能是它们是类似的,但它们在不同的层面上运行:硬件中断是硬件要求关注的硬件,最低级别的软件是必须的。 一般来说,内核处理所有硬件,通知进程在某种程度上与硬件中断无关。 对于许多信号,默认的处理是提供的(例如ctrl-z,ctrl-c,…),对于其他的实现是非常依赖于应用程序的(例如SIGHUP)。

说到信号,这些只是软件定义的。 他们做你想做的任何事情,而且linux用方便的方法来调用这些子程序。 在某些情况下,内核可能会调用一个信号例程(例如SIGSEGV,SIGCHILD,…),但几乎不涉及硬件。 它们只是在应用程序中触发特定例程的便捷方式。

曾经有一个特例:在DOS 21h中的“OS”中断。 这不再使用(虽然仍然有效),但是这个想法是。 程序可以触发一个特定的中断来请求内核执行特定的操作。 这些操作是系统调用(打开一个文件,关闭一个套接字,你有什么)。 正如我所说,有趣,但不再真正使用。

信号的各种来源是什么? 对我来说,内核始终是信号的来源(除了用于IPC)

一个信号要么来自进程本身(SIGABRT),要么来自内核(SIGSEGV,…),要么来自其他进程,比如shell(ctrl-z,ctrl-c,ctrl- \,…)或从杀人。 但是通过使用kill libc函数,它们可以来自任何其他程序:

#include <sys/types.h> #include <signal.h> int kill(pid_t pid, int sig); 

信号处理程序和ISR之间的区别?

主要区别在于ISR存在于内核空间中,并且必须考虑到整个计算机在执行期间被冻结。 这意味着它们可以中断任何进程和内核中的任何内容。 他们也“停止世界”。 当正在处理中断时,没有其他事情会发生。 所以如果一个中断处理程序等待某个东西,机器就会冻结。 如果中断处理程序进入循环,唯一的选择是重新启动机器。

ISR真的很难得到正确的。 他们有很多的理论,在Linux上他们有上半部分和下半部分,各种优先级处理,特殊的内存分配,…这是一个雷区。 ISR中一个错误的方向将会导致机器死机。 ISR中的一个错误会导致数据丢失,甚至可能是硬件故障。 事实上,从经验来讲,只是提出怀疑,你可能计划在ISR中做错事情立即导致完全不可预知的机器行为。

在ISR中不能使用任何内核工具。 打开一个文件,忘记它。 分配内存,忘记它。 调用内核的任何其他部分,忘记它(只有少数例外)。 名单继续。

信号只是被调用的特定进程中的函数。 一个信号可以阻塞(例如ctrl-z),这将阻止进程进行,但是例如你的shell会话仍然会响应。 这个过程需要考虑到程序的任何部分可能已经被中断,但是它仍然是正常的用户空间。 你可以阻止,你可以循环,你可以打开文件,分配内存,…任何你想要的。

信号阻塞和中断屏蔽之间的区别?

他们非常相似。 除了信号阻塞是在每个进程的基础上完成的。 在这两种情况下都有不可阻塞的信号,并且有一个NMI(不可屏蔽中断)(两者都表示严重错误)。

最后,信号和中断正在向内核或特定进程发送一个数字。 信号阻塞和中断屏蔽只是告诉系统忽略特定的数字。

一个区别是中断屏蔽是在硬件中实现的。

信号和中断的行为方式非常相似。 不同之处在于信号发生在一个进程(生活在虚拟环境中),而异常是系统范围的。

某些故障被CPU标记为异常,然后映射到由内核传递给进程的信号。 内核可以选择隐藏进程中的任何异常(例如,对未映射内存的访问是通过分页静默地修复的)。

硬件中断只是一种异常,内核可能会选择映射到一个信号(例如,如果使用alarm(2) )。

内核产生响应各种事件的信号,其中包括异常,I / O完成,显式用户空间请求,…

信号处理程序的行为与ISR类似 – 可以随时调用它们,所以它们不能像程序状态一样做任何关于程序状态的假设,而且屏蔽信号在虚拟地址空间中的行为与屏蔽中断一样在物理机器上。