nin*_*alj 86
中断可以视为CPU和OS内核之间通信的一种方式.可以将信号视为OS内核和OS进程之间的通信方式.
中断可以由CPU启动(例外 - 例如:除以零,页面错误),设备(硬件中断 - 例如:输入可用),或通过CPU指令(陷阱 - 例如:系统调用,断点).它们最终由CPU管理,它"中断"当前任务,并调用OS内核提供的ISR /中断处理程序.
信号可以由OS内核(例如:SIGFPE,SIGSEGV,SIGIO)或进程(kill())发起.它们最终由操作系统内核管理,操作系统内核将它们传递给目标线程/进程,调用通用操作(忽略,终止,终止和转储核心)或进程提供的信号处理程序.
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.这已不再使用(虽然仍有效),但这个想法就是这个.程序可以触发特定的中断,要求内核执行特定的操作.作为系统调用的操作(打开文件,关闭套接字,你有什么).正如我所说,有趣,但不再真正使用.
信号来自进程本身(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很难做到正确.关于它们有很多理论,在linux上它们有上半部分和下半部分,具有各种优先级处理,特殊内存分配,......而且它是一个雷区.ISR中错误方向的一步会杀死机器.ISR中的错误会导致数据丢失,甚至可能导致硬件故障.事实上,根据经验,仅仅提出怀疑,你可能计划在ISR中做错事,立即导致完全不可预测的机器行为.
您不能在ISR中使用任何内核工具.打开文件,忘掉它.分配记忆,忘记它.调用内核的任何其他部分,忘记它(有一些,但只有少数例外).名单还在继续.
信号只是被调用的特定进程中的函数.信号可以阻塞(例如ctrl-z),这将阻止进程取得进展,但是例如你的shell会话仍然会响应.该过程需要考虑到程序的任何部分当然可能已被中断,但它仍然是正常的用户空间.你可以阻止,你可以循环,你可以打开文件,分配内存,......你想要什么.
他们非常相似.除了信号阻塞是基于每个进程完成的.在这两种情况下都存在不可阻塞的信号,并且存在NMI(不可屏蔽中断)(两者都表示严重错误).
最后,信号和中断正在向内核或特定进程发送一个数字.信号阻塞和中断屏蔽只是告诉系统忽略特定的数字.
一个区别是中断屏蔽是在硬件中实现的.