概念太多了,信号,软中断,中断等等。试着作总结。html
下面这个里面主要讲了硬件中断:编程
http://www.cnblogs.com/charlesblc/p/6261741.html缓存
下面这个里面主要讲了软中断,硬中断:异步
http://www.cnblogs.com/charlesblc/p/6263208.html 函数
参考 http://blog.csdn.net/dodo_check/article/details/8806961spa
l 中 断(也称硬件中断).net
定义:中断是由其余硬件设备依照CPU时钟周期信号随机产生的。code
分类: 可屏蔽中断htm
非可屏蔽中断blog
来源:间隔定时器和I/O
l 异 常(也称软件中断)
定义:当指令执行时由CPU控制单元产生的。
分类: 处理器探测到的异常
² 故障
² 陷阱
² 异常终止
编程异常(也称软中断)
² int指令
来源: 程序的错误产生的
内核必须处理的异常(例如:缺页和内核服务的请求-int)
l 当发生异常时,CPU控制单元产生一个硬件出错码。
l CPU根据该中断吗找到中断向量表内的对应向量,根据该向量转到中断处理程序。
l 中断处理程序处理完以后向当前进程发送一个SIG***信号。
l 若进程定义了相应的信号处理程序则转移到相应的程序执行,若没有,则执行内核定义的操做。
l 设备产生中断
l PIC(可编程中断控制器)会产生一个对应的中断向量
l 和中断向量表中的每个中断向量进行比较,转到对应的中断处理程序
l 中断处理程序进行保存现场,作相关处理,恢复现场
l 内核调度,返回用户进程
l 硬件中断的分类
² 紧急的 —— 这类中断必须当即执行
² 非紧急的 —— 也必须当即执行
² 非紧急可延迟的 —— 上半部当即执行,下半部延迟执行
硬件中断任务(处理程序)是一个快速、异步、简单地对硬件作出迅速响应并在最短期内完成必要操做的中断处理程序。硬中断处理程序能够抢占内核任务而且执 行时还会屏蔽同级中断或其它中断,所以中断处理必须要快、不能阻塞。这样一来对于一些要求处理过程比较复杂的任务就不合适在中断任务中一次处理。好比,网卡接收数据的过程当中,首先网卡发送中断信号告诉CPU来取数据,而后系统从网卡中读取数据存入系统缓冲区中,再下来解析数据而后送入应用层。这些若是都让中断处理程序来处理显然过程太长,形成新来的中断丢失。所以Linux开发人员将这种任务分割为两个部分,一个叫上底,即中断处理程序,短平快地处理与硬 件相关的操做(如从网卡读数据到系统缓存);而把对时间要求相对宽松的任务(如解析数据的工做)放在另外一个部分执行,这个部分就是咱们这里要讲的下半底。
下半底是一种推后执行任务,它将某些不那么紧迫的任务推迟到系统更方便的时刻运行。由于并非很是紧急,一般仍是比较耗时的,所以由系统自行安排运行时机,不在中断服务上下文中执行。内核中实现 下半底的手段通过不断演化,目前已经从最原始的BH(bottom half)演生出BH、任务队列(Task queues)、软中断(Softirq)、Tasklet、工做队列(Work queues)(2.6内核中新出现的)。
其中的软中断和异常中提到的软中断不同的(后者特指对硬中断的模拟):
前者主要是用来处理非紧急可延迟的硬件中断,是Linux系统定定义的,不是用户定义,而且个数有限
关于软中断和硬中断的其它解析(上面提到的int指令模拟中断):
软中断通常是指由指令int引发的“伪”中断动做——给CPU制造一个中断的假象;而硬中断则是实实在在由8259的连线触发的中断。所以,严格的 讲,int与IRQ毫无关系,但两者均与中断向量有关系。int引发的中断,CPU是从指令中取得中断向量号;而IRQ引发的中断,CPU必须从数据线上取回中断号,接下来CPU的工做就同样了:保护现场、根据中断号获得中断处理程序地址、执行中断处理、恢复现场继续执行被中断的指令。
在软中断(模拟中断)和硬中断之间的区别是什么?
①硬中断是由外部事件引发的所以具备随机性和突发性;软中断是执行中断指令产生的,无面外部施加中断请求信 号,所以中断的发生不是随机的而是由程序安排好的。
②硬中断的中断响应周期,CPU须要发中断回合信号(NMI不须要),软中断的中断响应周 期,CPU不需发中断回合信号。
③硬中断的中断号是由中断控制器提供的(NMI硬中断中断号系统指定为02H);软中断的中断号由指令直接给出, 无需使用中断控制器。
④硬中断是可屏蔽的(NMI硬中断不可屏蔽),软中断不可屏蔽。
先接上面这篇参考文章的内容:
信号是异步的进程间通信机制,是在软件层次上对中断机制的一种模拟
l 产生信号的条件主要有:
1. 用户在终端 按下某些键时,终端驱动程序会发送信号给前台进程,例如Ctrl-C产生SIGINT信 号,Ctrl-/产生SIGQUIT信号,Ctrl-Z产生SIGTSTP信号。 2. 硬件异常产生信号,这些条件由硬件检测到并通知内核,而后内核向当前进程发送适当的信号。例如当前进程执行了 除以0的指令,CPU的运算单元会产生异常,内核将这个异常解释为SIGFPE信号发送给进 程。再好比当前进程访问了非法内存地址,,MMU会产生异常,内核将这个异常解释为SIGSEGV信 号发送给进程。 3. 一个进程调用kill(2)函数能够发送信 号给另外一个进程。 4. 能够用kill(1)命令发送信号给某个 进程,kill(1)命令也是调用kill(2)函 数实现的,若是不明确指定信号则发送SIGTERM信号,该信号的默认处理动做是终止进程。 5. 当 内核检测到某种软件条件发生时也能够经过信号通知进程,例如闹钟超时产生SIGALRM信 号,向读端已关闭的管道写数据时产生SIGPIPE信号。
另,参考 http://www.cnblogs.com/lcw/p/3235994.html
(1)采用了相同的异步通讯方式;
(2)当检测出有信号或中断请求时,都暂停正在执行的程序而转去执行相应的处理程序;
(3)都在处理完毕后返回到原来的断点;
(4)对信号或中断均可进行屏蔽。
(1)中断有优先级,而信号没有优先级,全部的信号都是平等的;
(2)信号处理程序是在用户态下运行的,而中断处理程序是在核心态下运行;
(3)中断响应是及时的,而信号响应一般都有较大的时间延迟。
(1)发送信号。发送信号的程序用系统调用kill( )实现;
(2)预置对信号的处理方式。接收信号的程序用signal( )来实现对处理方式的预置;
(3)收受信号的进程按事先的规定完成对相应事件的处理。
当一个进程要进入或退出一个低优先级睡眠状态时,或一个进程即将从核心态返回用户态时,核心都要检查该进程是否已收到软中断。当进程处于核心态时,即便收到软中断也不予理睬;只有当它返回到用户态后,才处理软中断信号。对软中断信号的处理分三种状况进行:
(1)若是进程收到的软中断是一个已决定要忽略的信号(function=1),进程不作任何处理便当即返回;
(2)进程收到软中断后便退出(function=0);
(3)执行用户设置的软中断处理程序。
http://blog.csdn.net/c453787298/article/details/18004261
中断:
中断更倾向于硬件,外部设备状态变化时发送给cup的一个信号,可是cpu如何捕捉这样的一个信号呢,原来cpu的控制单元会检查在执行前一条指令的过程当中是否有中断或异常发生。当捕捉到这样一个信号后,便开始当即执行do_irq()函数,执行相应的中断处理程序(上半部),从cpu开始处理中断至此,cpu对于其余的中断都是不处理的,上半部主要负责一些要紧可是不耗时的操做,后来的操做便由下半部来处理。对于上半部如何与下半部联系起来,即是用接下来要说的软中断了。
软中断:
软中断是内核的一种机制,模拟硬中断(即上面所说的中断)的实现,既然是对中断的模拟,对于某个软中断向量便会有对应的软中断处理函数,对于多核cpu(SMP),存在这样的规则,哪一个cpu触发的软中断,便由哪一个cpu来执行相应的中断程序,中断处理程序(包括上半部和下半部)没有本身的堆栈,执行的时候都是使用的当前用户进程的内核栈,若当前没有用户进程,便使用idle进程的内核栈。软中断处理程序的执行在某一个cpu(多核中的一个)上应是线性的,只有上一个软中断处理完成以后才能执行下一个软中断处理程序。
信号:
信号应该就是进程对内核软中断的一种模拟了,主要用于进程之间的信息的传递,触发的相应的处理函数在进程的用户空间里执行。