信号和中断的比较(Signals and interrupts a comparison)

2019-07-03 18:02发布

基于各种参考, 在Linux下我的信号主观的定义是“被用来在这里通知关于特定event.Event的发生过程的触发器可以指软件exception.Additionally信号也可用于IPC机制。 “ 我的问题是

  • 我相信唯一的例外(软件中断)通过有关硬件中断的情况下signals.What通知。
  • 什么是信号的各种来源? 对我来说,它看起来像内核始终是一个信号源(用于IPC时除外)
  • 信号处理程序和ISR之间的区别?
  • 信号阻塞的差异与中断屏蔽?

Answer 1:

中断可以被看作是在CPU和OS内核之间的通信的平均。 信号可以被看作是在OS内核和OS进程之间的通信的平均。

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

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



Answer 2:

我相信唯一的例外(软件中断)通过有关硬件中断的情况下signals.What通知。

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

硬件中断的一个例子是具有无关的信号是VM子系统。 你知道,在现代操作系统可以比实际存在于系统上分配更多的内存。 那么如何工作的呢? 那么它的工作原理是利用硬件中断。 当您分配内存,内核负责记录下来,但实际上并没有做任何事情。 然后,当您尝试访问分配的内存时,CPU会抱怨“但这种记忆不存在”,这将产生一个硬件中断。 内核会,并通过它的笔记看,发现你确实要求内存,清除它提供免费的一些内存,并告诉CPU预期的位置,以“地图”内存。 在这之后,内核在点恢复程序之前硬件中断发生,这一次的过程中会发现内存就好了。

多任务也通过利用一个硬件中断来实现。 所有司机一般通过解释中断合作。

信号被用于进程间通信。 东西很“信号-Y”将是共同的行为对于Linux守护程序重新加载上SIGHUP它们的配置,喜爱和系统管理员各地的地方讨厌。 当你修改,说的Apache配置,该过程不会自动开始使用新的配置。 你可能会终止,并重新启动的过程,但是这意味着4-5秒HTTP服务器是要被淘汰的空气。 因此,你可能“killall -HUP阿帕奇”。 这将调用apache进程的子程序,这将使它重新读取它的配置文件。

过程悬浮剂通过信号(CTRL-Z),过程中断(CTRL-C),处理退出(CTRL-),终端断开(SIGHUP)来实现,...更完整的列表可以在这里找到: HTTP:// EN .wikipedia.org /维基/ Unix_signal 。

一个结论可能是,他们是排序的相似,但它们在不同的级别进行操作:硬件中断,好了,硬件哭了关注,而最低级软件责成。 一般来说,内核处理所有的硬件,并通知流程做有点独立的硬件中断。 对于提供了多个信号默认处理(例如CTRL-Z,CTRL-C,...),对他人的实现是非常依赖于应用程序(如SIGHUP)。

当涉及到的信号,以及这些只是软件定义。 他们做任何你可能希望他们做的,和Linux自带的方便的方法来调用这些子程序。 在某些情况下,内核可能会调用一个信号程序(例如SIGSEGV,SIGCHILD,...),但它几乎没有涉及硬件。 他们只是以触发特定的程序在应用程序的便捷途径。

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

什么是信号的各种来源? 对我来说,它看起来像内核始终是一个信号源(用于IPC时除外)

的信号或者来自于过程本身(SIGABRT),从内核(SIGSEGV,...)或从其它过程,如壳例如(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中的错误会导致dataloss,甚至完全硬件故障。 其实从经验上讲,仅仅引起怀疑,你可能会打算做什么错在ISR立即导致完全不可预测的机器行为。

不能使用ISR中的任何核设施。 打开文件,算了吧。 分配内存,算了吧。 调用内核的任何其他部分,算了吧(有一些,但只有少数例外)。 这样的例子不胜枚举。

信号只是在特定的进程函数获取调用。 信号可以阻止(例如CTRL-Z),这将取得进展停止的过程,但例如在shell会话仍将会回应。 该过程需要考虑到该计划的任何部分可能被中断了,当然帐户,但它仍然是普通用户的空间。 您可以阻止,你可以循环,你可以打开文件,分配内存,......任何你想要的。

信号阻塞的差异与中断屏蔽?

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

到底信号和中断被发送的数,无论是内核或特定过程。 信号阻塞和中断只是屏蔽的含义是告诉系统忽略具体的数字。

一个区别是,中断屏蔽功能在硬件中实现。



Answer 3:

信号和中断的行为在相当类似的方式。 不同的是,信号发生在一个过程(其生活在一个虚拟环境中),而例外是全系统。

某些故障由CPU标记为异常,并且然后被映射到由所述核心传送到处理的信号。 内核可以选择隐藏从过程中的任何异常(例如,访问映射的内存通过寻呼被静默固定起来)。

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

内核生成响应各种事件的信号,其中的例外,I / O完成,明确用户空间的请求,...

信号处理类似的行为ISR中 - 他们可以在任何时候被调用,所以他们不能做任何假设有关程序的状态,就像中断服务程序 - 和阻塞信号表现的虚拟地址空间内的相同方式屏蔽中断呢在物理机上。



文章来源: Signals and interrupts a comparison