信号和中断比较

Viv*_*ran 32 linux posix signals interrupt isr

基于各种参考文献,我在Linux中信号的主观定义是"用于通知进程有关特定事件发生的触发器.此处的事件可能涉及软件异常.此外,信号也可用于IPC机制. " 我的问题是

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

nin*_*alj 86

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

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

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

  • 硬件中断也可以生成信号,就像键盘中断生成SIGINT一样.因此,中断和信号彼此紧密相关. (5认同)
  • @ kingsmasher1:内核将硬件与用户应用程序分离.键盘(实际上是键盘控制器)会生成硬件中断.内核服务ISR中的硬件中断,并记录它,可能将大多数实际工作推迟到tasklet/DPC.然后,当tasklet/DPC触发时,可能决定向特定进程发送信号的内核. (4认同)
  • 另请注意我选择的示例:除以零→SIGFPE,页面错误→SIGFPE,输入可用→SIGIO.虽然这些例子暗示了中断和信号之间的关系,但没有1:1的对应关系; 例如:多种页面错误(不存在页面,COW,...)不向用户空间生成信号,输入可用仅在应用程序明确请求时生成SIGIO,... (3认同)

chr*_*her 50

我假设只通过信号通知例外(软件中断).硬件中断的情况.

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

与信号无关的硬件中断的一个示例是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,...),但它几乎不涉及硬件.它们只是触发应用程序中特定例程的便捷方式.

过去有一种特殊情况:"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);
Run Code Online (Sandbox Code Playgroud)

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

主要区别在于ISR存在于内核空间中,并且必须考虑到整个计算机在执行期间被冻结.这意味着它们可以中断任何进程,以及内核中的任何进程.他们也"阻止世界".在处理中断时,不会发生任何其他事情.因此,如果中断处理程序等待某事,机器会冻结.如果中断处理程序进入循环,您唯一的选择是重新启动计算机.

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

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

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

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

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

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

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