信号和中断比较

时间:2012-11-12 10:18:00

标签: linux signals posix interrupt isr

根据各种参考资料,我在Linux中对信号的主观定义是“用于通知进程发生特定事件的触​​发器。此处的事件可能涉及软件异常。此外,信号也可能用于IPC机制。“我的问题是

  • 我假设只通过信号通知异常(软件中断)。硬件中断的情况如何。
  • 信号的各种来源是什么?对我而言,内核始终是信号的来源。(除了用于IPC)
  • 信号处理程序和ISR之间的区别?。
  • 信号阻塞和中断屏蔽之间的区别?

3 个答案:

答案 0 :(得分:82)

可以将中断视为CPU与OS内核之间通信的一种方式。信号可以被视为OS内核和OS进程之间通信的一种手段。

中断可以由CPU启动(例外:例如:除以零,页面错误),设备(硬件中断 - 例如:输入可用),或者由CPU指令(陷阱 - 例如:系统调用,断点)启动。它们最终由CPU管理,中断"中断"当前任务,并调用OS内核提供的ISR /中断处理程序。

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

答案 1 :(得分:48)

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

从哪里开始?有很多不同的案例。请记住,中断是调用cpu的硬件。中断主要包括"硬件需要注意"信号类似但有2个参数:目标进程id和int(32位或64位,取决于arch)。硬件中断总是在内核空间中处理,而信号只是用户空间的事情。内核出于各种原因使用硬件中断。

与信号无关的硬件中断的一个示例是VM子系统。您知道在现代操作系统上,您可以分配比系统上实际存在的内存更多的内存。那么这是如何工作的呢?那么它通过利用硬件中断来工作。当您分配内存时,内核会记录它,但实际上并没有做任何事情。然后,当你试图访问分配的内存时,cpu会抱怨"但是这个内存不存在",这将产生硬件中断。内核将查看它的注释,发现你确实要求内存,清除它有空闲的内存,然后告诉cpu" map"那个记忆在预期的位置。之后内核在硬件中断发生之前恢复程序,这次进程将找到内存就好了。

通过利用硬件中断也可以实现多任务处理。所有司机通常都会通过解释中断来工作。

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

进程暂停是通过信号(ctrl-z),进程中断(ctrl-c),进程退出(ctrl-),终端断开连接(sighup)来实现的......可以在这里找到更完整的列表:{{ 3}}

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

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

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

信号的各种来源是什么?对我而言,内核始终是信号的来源。(除了用于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存在于内核空间中,并且必须考虑到整个计算机在执行期间被冻结。这意味着它们可以中断任何进程,以及内核中的任何进程。他们还“停止了世界”#34;在处理中断时,不会发生任何其他事情。因此,如果中断处理程序等待某事,机器会冻结。如果中断处理程序进入循环,则唯一的选择是重新启动计算机。

ISR很难做对。关于它们有很多理论,在linux上它们有上半部分和下半部分,具有各种优先级处理,特殊内存分配......而且它是一个雷区。 ISR中错误方向的一步会杀死机器。 ISR中的错误会导致数据丢失,甚至可能导致硬件故障。事实上,从经验来看,仅仅提出怀疑,你可能会计划在ISR中做错事,这会导致完全不可预测的机器行为。

您无法在ISR中使用任何内核工具。打开文件,忘掉它。分配记忆,忘记它。调用内核的任何其他部分,忘记它(有一些,但只有少数例外)。名单还在继续。

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

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

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

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

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

答案 2 :(得分:2)

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

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

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

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

信号处理程序的行为与ISR类似 - 它们可以随时调用,因此它们无法对程序状态做出任何假设,就像ISR一样 - 并且阻塞信号在虚拟地址空间内的行为与屏蔽中断在物理机上。