内核抢占和中断

以前一直不理解什么是内核抢占,现在好像懂了。

本文尝试解释什么是内核可抢占以及可抢占和可中断的区别。

首先被中断不是被抢占,中断和抢占是两个概念。抢占必须涉及进程上下文的切换,而中断是在中断上下文。

所谓可抢占抢的是进程上下文,人人都争取上台。可中断指的是是否可以中断当前CPU而进入我的中断处理函数。

如果内核是不可抢占的(比如说2.4的内核),一旦切进内核态,只要代码不是主动释放CPU它就可以一直占着CPU。例外,虽不可抢占,但若此时发生中断,代码还是要交出CPU,但是中断返回之后,代码又能霸占CPU了,此为可中断但不可抢占。

如果内核是可抢占的(比如2.6或之后的内核),上述情况就不会发生了。内核抢占发生在以下3种情况:

1. 从中断返回内核态时,若此时可抢占,则会强制调用schedule(),尝试抢占,被中断的内核代码不一定能继续霸着CPU。

2.内核变成可抢占状态,此时也会尝试抢占。

3.内核代码主动调用schedule()。

虽然2.6的内核提供内核抢占,但是也提供关闭的手段。是否可抢占是由preemt_count变量控制(per-cpu),有锁这个计数就+1,释放锁就-1.为0才是可抢占。每当释放锁的时候都会检查是否为0,为0则尝试抢占。

 

+++++++++++++++++++分割线++++++++++++++++++++++++++++++++

关于中断

中断分为上下两个部分。是为中断上半部(top half)、下半部(bottom half)。

上半部处理紧要事情。比如:通知硬件“我知道你请求中断了,继续干活去”,然后从设备缓冲区拷贝数据到内存。

下半部处理不那么要紧的任务。比如:网卡上来的数据推进协议栈,然后推给上层应用程序。

当前的内核有三种下半部的实现方式:softirq、tasklet、working queue。

         名称

上下文

特点

概述
Softirq

中断上下文

可中断不可睡眠 速度最快。同一个Softirq可能会同时运行在多个核上,必须非常小心的处理数据同步
Tasklet

中断上下文

可中断不可睡眠 基于Softirq实现,同一类的Tasklet不会被同时运行,编程代价小
Work queue

进程上下文

可中断可睡眠

基于内核线程实现

 

 

每天记一点,进步看的见。

3 thoughts on “内核抢占和中断

Leave a Reply

Your email address will not be published. Required fields are marked *

*


*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>