您的位置:首页 > 运维架构 > Linux

Linux内核与驱动开发学习总结:中断和中断处理(八)

2015-06-07 12:04 609 查看
硬中断:
1. 硬中断是由硬件产生的,比如,像磁盘,网卡,键盘,时钟等。每个设备或设备集都有它自己的IRQ(中断请求)。基于IRQ,CPU可以将相应的请求分发到对应的硬件驱动上(注:硬件驱动通常是内核中的一个子程序,而不是一个独立的进程)。
2. 处理中断的驱动是需要运行在CPU上的,因此,当中断产生的时候,CPU会中断当前正在运行的任务,来处理中断。在有多核心的系统上,一个中断通常只能中断一颗CPU(也有一种特殊的情况,就是在大型主机上是有硬件通道的,它可以在没有主CPU的支持下,可以同时处理多个中断。)。
3. 硬中断可以直接中断CPU。它会引起内核中相关的代码被触发。对于那些需要花费一些时间去处理的进程,中断代码本身也可以被其他的硬中断中断。
4. 对于时钟中断,内核调度代码会将当前正在运行的进程挂起,从而让其他的进程来运行。它的存在是为了让调度代码(或称为调度器)可以调度多任务。
软中断:
1. 软中断的处理非常像硬中断。然而,它们仅仅是由当前正在运行的进程所产生的。
2. 通常,软中断是一些对I/O的请求。这些请求会调用内核中可以调度I/O发生的程序。对于某些设备,I/O请求需要被立即处理,而磁盘I/O请求通常可以排队并且可以稍后处理。根据I/O模型的不同,进程或许会被挂起直到I/O完成,此时内核调度器就会选择另一个进程去运行。I/O可以在进程之间产生并且调度过程通常和磁盘I/O的方式是相同。
3. 软中断仅与内核相联系。而内核主要负责对需要运行的任何其他的进程进行调度。一些内核允许设备驱动的一些部分存在于用户空间,并且当需要的时候内核也会调度这个进程去运行。
4. 软中断并不会直接中断CPU。也只有当前正在运行的代码(或进程)才会产生软中断。这种中断是一种需要内核为正在运行的进程去做一些事情(通常为I/O)的请求。有一个特殊的软中断是Yield调用,它的作用是请求内核调度器去查看是否有一些其他的进程可以运行。
因此:1、对于软中断,I/O操作是否是由内核中的I/O设备驱动程序完成?
答:对于I/O请求,内核会将这项工作分派给合适的内核驱动程序,这个程序会对I/O进行队列化,以可以稍后处理(通常是磁盘I/O),或如果可能可以立即执行它。通常,当对硬中断进行回应的时候,这个队列会被驱动所处理。当一个I/O请求完成的时候,下一个在队列中的I/O请求就会发送到这个设备上。
2. 软中断所经过的操作流程是比硬中断的少吗?换句话说,对于软中断就是:进程 ->内核中的设备驱动程序;对于硬中断:硬件->CPU->内核中的设备驱动程序?
答:是的,软中断比硬中断少了一个硬件发送信号的步骤。产生软中断的进程一定是当前正在运行的进程,因此它们不会中断CPU。但是它们会中断调用代码的流程。
如果硬件需要CPU去做一些事情,那么这个硬件会使CPU中断当前正在运行的代码。而后CPU会将当前正在运行进程的当前状态放到堆栈(stack)中,以至于之后可以返回继续运行。这种中断可以停止一个正在运行的进程;可以停止正处理另一个中断的内核代码;或者可以停止空闲进程
中断上下文
必须立即进行紧急处理的极少量任务放在顶半部中。此时屏蔽了与自己同类型的中断,由于任务量极少,所以可以迅速不受打扰地处理完紧急任务;

需要较少时间处理的中等数量的急迫任务放在tasklet中。此时不会屏蔽任何中断(包括与自己的顶半部同类型的中断),所以不影响顶半部对紧急任务的处理;同时又不会进行用户进程调度,从而保证了自己的急迫任务得以迅速完成;

需要较多时间处理且并不急迫(允许被操作系统剥夺运行权)的大量任务放在workqueue中。此时操作系统会尽量快速处理完这个任务,但如果任务量太大,期间操作系统也有机会调度别的用户进程运行,从而保证了不会因为这个任务需要运行的时间太长而将其它用户进程饿死。

可能引起睡眠的任务放在workqueue中。因为在workqueue中睡眠是安全的。

Softirq:支持SMP,必须是可重入的,编译期间静态分配,不能动态注册和去注册,最多32个。

Tasklet可以理解为softirq的扩展,本身挂在TASKLET_SOFTIRQ上,同一tasklet不能同时在smp上并行,但不同的tasklet可以在smp上并行。

表4.1 softirq、tasklet和工作队列对比

Softirq

Tasklet

Work Queue

执行上下文

延后的工作,运行于中断上下文

延后的工作,运行于中断上下文

延后的工作,运行于进程上下文

可重用

可以在不同的CPU上同时运行

不能在不同的CPU上同时运行,但是不同的CPU可以运行不同的tasklet

可以在不同的CPU上同时运行

睡眠

处于atomic context,不能sleep

处于atomic context,不能sleep

可以睡眠

抢占

不能抢占/调度

不能抢占/调度

可以抢占/调度

易用性

不容易使用

容易使用

容易使用

何时使用

如果延后的工作不会睡眠,而且有严格的可扩展性或速度要求

如果延后的工作不会睡眠

如果延后的工作会睡眠

Tasklet

Workqueue

处于atomic context,不能sleep

不处于atomic context,可以sleep

运行在调度它们的同一个 CPU 上

默认运行在调度它们的同一个 CPU 上

不能指定确定时间进行调度

不能指定确定时间进行调度或指定至少延迟一个确定的时间后调度

只能提交给ksoftirqd/0

可以提交给events/0,也可以提交给自定义的workqueue

tasklet函数带参数

work函数不带参数

Refrence:

http://blog.chinaunix.net/uid-20737871-id-4082902.html

/article/2720671.html

/article/1499038.html

/article/1499037.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: