当前位置: 技术问答>linux和unix
关于抢占的一个疑问
来源: 互联网 发布时间:2017-01-31
本文导语: 下面引用网上的一段话, ------------------------------------------ 实时和抢占,是为了减少latency 在非抢占的内核中(比如2.4),中断返回时(包括时钟中断?),如果发现CPU是在内核态,是不进行调 度的。 因此,在内...
下面引用网上的一段话,
------------------------------------------
实时和抢占,是为了减少latency
在非抢占的内核中(比如2.4),中断返回时(包括时钟中断?),如果发现CPU是在内核态,是不进行调
度的。
因此,在内核态中的某些代码,如果运行时间太长的话,是会增加schedule latency的。
此时,主要依靠内核本身主动进行调度。
对于可以抢占的内核,中断返回时,即使CPU是内核态,也可以调度,因此可以减少latency。
此时,即使是内核态,也可以被动的调度。
但是,即使在可以抢占的内核,如果在某个锁中的运行时间太长,也会增加schedule latency,因为锁中
是不能抢占的。
因此,内核的很多代码,当觉得占用了较长时间,就会主动调用cond_resched()。
也就是说,在可抢占的内核中,没有占用锁的时候,可以抢占(中断返回的时候),这是被动的调度。
占用锁的时候,主要靠内核本身主动调度。
-----------------------------------------------------------------
我有一个问题 不清楚 就是红色字体部分
不是说了锁中不能抢占的吗!那还主动调用cond_resched()有用吗?????schedule()应该会打印出错信息啊????
疑惑啊。。。。。。。。。。
------------------------------------------
实时和抢占,是为了减少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
楼主误会这句话“内核的很多代码,当觉得占用了较长时间,就会主动调用cond_resched”了,
它并不是告诉你这么做:
spin_lock
cond_resched
spin_unlock
你可以在内核里搜一下cond_resched的用处,你会发现它都是在锁外被调用的:
spin_unlock之后,才会调用cond_resched
也可那句话可以改为:内核的很多代码,当觉得占用了较长时间,“并且现在不是在锁中”,就会主动调用cond_resched
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。