抢占,preemption
在2.5内核之前,或编译时CONFIG_PREEMPT未打开,内核中用户上下文的进程不会彼
此抢占(亦即:只要你占有CPU,你就一直占有,直到自己放弃或者发生硬件中断)。
在2.5.4以后且打开了CONFIG_PREEMPT,事情改变了:在用户上下文,更高优先级的
任务可以抢占当前任务:自旋锁为此改写,以添加禁止抢占的效果,即使在UP上也是
如此。
bh
下半部:由于历史原因,带有'_bh'后缀的函数现在通常指所有的软中断。例如
spin_lock_bh()将阻止任何软中断在本CPU上的运行。原来的BH是不该继续使用的,
它终将被tasklets取代。在任一给定时刻,一个下半部只可能有一个实例在运行。
(译者注:Linux内核的各种下半部的命名混乱不堪,例如上面这句其实就不太严谨。
tasklet/timer诚然是“任何时刻只可能有一个实例在运行”,但是一个softirq就有
可能同时在多个CPU上运行。推荐阅读Robert Love的Linux Kernel Development 一
书来理清个中关系)
硬件中断/硬中断,Hardware Interrupt/Hardware IRQ
硬件中断请求。在硬件中断处理函数中,in_irq()宏返回true。
中断上下文,Interrupt Context
非用户上下文:正在处理一个硬件中断或软中断。这种情况下,in_interrupt()宏返
回true。
对称多处理器,SMP
对称多处理器:为多CPU机器编译的内核。(CONFIG_SMP=y).
软中断/softirq,Software Interrupt/softirq
软中断处理程序。in_irq()返回false;in_softirq()返回true。Tasklets和
softirqs都属于软中断。
严格来讲,一个softirq是一个最多能有32个枚举类型的软中断,它可以同时运行在
多个CPU上。有时softirq一词也用来指谓tasklets(也就是说,指谓所有的软中断)。
tasklet
一种可动态注册的软中断,保证了同一时刻只能有一个CPU在运行它。
定时器,timer
一种可动态注册的软中断,它在给定时刻(或接近给定时刻)运行。当运行时,它就象
tasklet一样(事实上它们是作为TIMER_SOFTIRQ被调用的)。
单处理器,UP
单处理器:非SMP。(CONFIG_SMP=n)
用户上下文,User Context
内核代表某个进程(亦即,一次系统调用或陷阱)或内核线程在运行。你可以用current
宏得知究竟是哪个进程。注意不要与“用户空间”一词搞混。它可以被硬件或软中断
打断执行。
用户空间,Userspace
进程在内核之外执行自己的代码。