在Linux
下,一个task
运行在user-mode
时,是总可以被抢占的(preemptible
):kernel
通过正常的clock tick
中断来切换task
。
Linux kernel
在2.6
版本之前,是不支持kernel-mode
抢占的:比如task
执行了系统调用,则只能等调用执行完毕,才能让出CPU
;或者task
的kernel-mode
代码主动调用schedule
来调度其它task
运行。从2.6
版本开始,Linux
支持了kernel-mode
抢占,因此除非kernel-mode
代码关闭了local CPU
的中断,否则它任何时候都可能被抢占。
参考资料:
Preemption under Linux。