信号和中断的比较

49

根据各种参考资料,我对Linux中的信号有以下主观定义:“用于通知进程某个特定事件发生的触发器。该事件可能是软件异常。此外,信号也可用于IPC机制。” 我的问题是:

  • 我认为只有异常(软件中断)通过信号被通知。那硬件中断呢?
  • 信号的各种来源是什么?在我看来,内核似乎总是信号的来源。(除了用于IPC时)
  • 信号处理程序和ISR之间的区别是什么?
  • 信号阻塞和中断屏蔽之间的区别是什么?
4个回答

128

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

中断可能由CPU(例如:除以零,页面错误等异常情况),设备(硬件中断--例如:输入可用性)或CPU指令(陷阱--例如:系统调用,断点)发起。最终由CPU管理它们,它“中断”当前任务,并调用由操作系统内核提供的ISR /中断处理程序。

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


8
硬件中断也可以生成信号,例如键盘中断生成SIGINT信号。因此,中断和信号密切相关。 - RajSanpui
7
内核将硬件与用户应用程序解耦。键盘(实际上是键盘控制器)生成硬件中断。内核在ISR中服务于该硬件中断,并记下相关内容,可能将大部分实际工作推迟到任务/延迟处理过程中。然后,当任务/延迟处理程序触发时,内核可以决定向特定进程发送信号。 - ninjalj
3
请注意我选择的示例:除以零→ SIGFPE,页面错误→ SIGFPE,输入可用→ SIGIO。虽然这些示例暗示了中断和信号之间的关系,但并非一一对应;例如:许多类型的页面错误(不存在的页面,COW等)不会向用户空间生成信号,只有在应用程序明确请求时,输入可用才会生成SIGIO信号,... - ninjalj
在硬件中断的情况下,信号生成发生在ISR期间的底半部分(tasklets或SoftIRQ)之后?我不知道这一点,我认为一旦中断发生,就会向进程生成信号,然后它会切换到ISR。感谢您指出这一点。基本上,正如您所说,在ISR完成后,它会切换到信号处理程序。 - RajSanpui
IRQ → 内核ISR → 任务队列/DPCs → 用户空间(如果进程还有时间片,则可能是信号处理程序) - ninjalj

63
我假设只有异常情况(软件中断)通过信号通知。那硬件中断的情况呢?
从哪里开始?有许多不同的情况。请记住,中断是硬件调用CPU。中断基本上包括“硬件需要注意”和0到255之间的数字。信号类似,但具有两个参数:目标进程ID和一个int(32位或64位,取决于架构)。硬件中断始终在内核空间中处理,而信号仅限于用户空间。内核出于各种原因使用硬件中断。
一个与信号无关的硬件中断的例子是VM子系统。您知道,在现代操作系统上,您可以分配比实际存在于系统上的内存更多的内存。那么这是如何工作的?它通过利用硬件中断来工作。当您分配内存时,内核会记录下来,但实际上什么也不做。然后,当您尝试访问已分配的内存时,CPU会抱怨“但这个内存不存在”,从而生成硬件中断。内核将查找它的笔记,发现您确实请求了该内存,清除一些它有空闲的内存,并告诉CPU在预期位置上“映射”该内存。之后,内核将在硬件中断发生之前的点恢复您的程序,这次进程将正常找到内存。

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

Signals被用于进程间通信。在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。但是它们也可以通过使用kill libc函数来自任何其他程序:

   #include <sys/types.h>
   #include <signal.h>

   int kill(pid_t pid, int sig);

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

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

ISR真的很难正确处理。它们有许多理论,在Linux上,它们具有上半部分和下半部分部分,具有各种优先级处理、特殊内存分配等,是一个雷区。在ISR中向错误方向迈出一步就会导致机器崩溃。 ISR中的错误会导致数据丢失,甚至可能导致硬件故障。实际上,根据经验,仅引起对ISR中可能计划做错事情的怀疑立即会导致完全不可预测的机器行为。

在ISR中无法使用任何内核设施。打开文件,忘掉它。分配内存,忘掉它。调用内核的任何其他部分,忘掉它(只有很少数的例外)。列表还在继续。

Signals只是在特定进程中调用的函数。信号可以阻塞(例如ctrl-z),这将阻止该进程继续执行,但例如您的shell会话仍然会响应。进程需要考虑到程序的任何部分都可能被打断,但它仍然是正常的用户空间。您可以阻塞、循环、打开文件、分配内存等等。
信号阻塞和中断屏蔽的区别是什么?
它们非常相似。除了信号阻塞是基于每个进程的。在两种情况下都有无法阻止的信号,以及NMI(不可屏蔽中断)(两者都表示严重错误)。
最终,信号和中断发送一个数字,无论是发送到内核还是发送到特定进程。信号阻塞和中断屏蔽只是告诉系统忽略特定的数字。
其中一个区别是中断屏蔽是由硬件实现的。

感谢您的解释! - user1559897

2
信号和中断的行为方式非常相似。不同之处在于信号发生在进程(存在于虚拟环境中),而异常是系统范围内的。
CPU将某些故障标记为异常,然后将其映射到由内核传递给进程的信号。内核可以选择隐藏进程中的任何异常(例如,对未映射内存的访问会被分页静默修复)。
硬件中断只是一种异常,内核可以选择将其映射到信号上(例如,如果使用alarm(2))。
内核响应各种事件生成信号,其中包括异常、I/O完成、显式用户空间请求等。
信号处理程序的行为类似于ISR - 它们可以在任何时候调用,因此不能像ISR一样对程序状态做出任何假设 - 阻塞信号在虚拟地址空间内的行为方式与屏蔽中断在物理机器上的行为方式相同。

1
我认为只有异常(软件中断)通过信号通知。那硬件中断的情况呢?
SIGHUP可以来自串行设备。还有与网络和驱动器相关的信号。这些也可能来自硬件中断。
各种信号的来源是什么?在我看来,内核似乎总是信号的源头(除非用于IPC)。
内核(操作系统软件)始终是传递信号的那个。信号的“源头”可能在不同的国家。因此,用户可能会挂断澳大利亚的调制解调器,该调制解调器会发送信号到本地调制解调器,后者会发送串行信号,提醒内核UART驱动程序向进程发送信号。
这取决于您对源头的定义。当然,硬件可能会涉及,并且根据您的定义,始终如此。因为RTC /计时器和CPU可以被视为硬件。许多这些术语都是模糊的,并且受到某些定义的限制。 POSIX信号是定义良好的(或至少更好定义)。
信号处理程序和ISR之间的区别是什么?
信号处理程序是异步用户空间代码。ISR发生在内核空间中。许多操作系统原语在ISR中不可用。例如,您几乎不可能读/写文件。从信号处理程序可能会更加困难,但并非不可能。
此外,即使在不同的操作系统(甚至是Linux内核版本)之间,也有人可能将某些上下文视为“ISR”。 ISR非常具体和深奥,只有系统程序员才能掌握。信号处理程序具有许多概念上类似的属性,但它们更接近于“标准”。
引用块:
信号阻塞和中断屏蔽之间的区别?
它们在概念上相似。但是,中断屏蔽可以出现在许多地方。您可以通过本地CPU、一组CPU、通过中断控制器芯片(可能以不同方式链接)以及通常与物理设备本身来屏蔽中断。信号阻塞相当标准,在Posix的上下文中,通常有一个规范答案(或者至少不超过10个)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接