日期:2014-05-16  浏览次数:20618 次

关于抢占的一个疑问
下面引用网上的一段话,
------------------------------------------
实时和抢占,是为了减少latency 

在非抢占的内核中(比如2.4),中断返回时(包括时钟中断?),如果发现CPU是在内核态,是不进行调

度的。 
因此,在内核态中的某些代码,如果运行时间太长的话,是会增加schedule latency的。 
此时,主要依靠内核本身主动进行调度。 

对于可以抢占的内核,中断返回时,即使CPU是内核态,也可以调度,因此可以减少latency。 
此时,即使是内核态,也可以被动的调度。 

但是,即使在可以抢占的内核,如果在某个锁中的运行时间太长,也会增加schedule latency,因为锁中

是不能抢占的。
因此,内核的很多代码,当觉得占用了较长时间,就会主动调用cond_resched()。

也就是说,在可抢占的内核中,没有占用锁的时候,可以抢占(中断返回的时候),这是被动的调度。 
占用锁的时候,主要靠内核本身主动调度。

-----------------------------
我有一个问题 不清楚 就是红色字体部分
不是说了锁中不能抢占的吗!那还主动调用cond_resched()有用吗?????schedule()应该会打印出错信息啊????
疑惑啊。。。。。。。。。。




------解决方案--------------------
在锁中不能调度,是为了另一个竞争者想获得锁时产生死锁。

楼主误会这句话“内核的很多代码,当觉得占用了较长时间,就会主动调用cond_resched”了,
它并不是告诉你这么做:
spin_lock
cond_resched
spin_unlock

你可以在内核里搜一下cond_resched的用处,你会发现它都是在锁外被调用的:
spin_unlock之后,才会调用cond_resched

也可那句话可以改为:内核的很多代码,当觉得占用了较长时间,“并且现在不是在锁中”,就会主动调用cond_resched