spin_lock与内核抢占
小狼@http://blog.csdn.net/xiaolangyangyang
内核抢占特性
2.6内核版本加入了抢占的特性,但我们可以配置为抢占和非抢占模式。
在单处理器2.6版本的非抢占模式下,spin_lock被编译为一条空语句,什么都不干;
在单处理器2.6版本的抢占模式下,spin_lock可以理解为一个抢占disable的开关,并在spin_unlock中被enable;
在SMP的2.6的抢占模式下,spin_lock才真正发挥了他的全部功能:
防止SMP中并发访问临界区,防止内核抢占造成的竞争;并在spin_unlock中退出临界区。
linux抢占发生的时间
抢占分为用户抢占和内核抢占。
用户抢占在以下情况下产生:
● 从系统调用返回用户空间
● 从中断处理程序返回用户空间
内核抢占会发生在:
● 当从中断处理程序返回内核空间的时候,且当时内核具有可抢占性;
● 当内核代码再一次具有可抢占性的时候。(如:spin_unlock时)
● 如果内核中的任务显式的调用schedule()
● 如果内核中的任务阻塞。
内核抢占配置
Preemptible kernel(linux内核抢占模式)
No Forced Preemption(Server):非强迫式抢占。这是传统的Linux抢占式模型,针对于高吞吐量设计。它同样在很多时候会提供很好的响应,但是也可能会有较长的延迟。如果是要建立服务器或者用于科学运算,或者要最大化内核的运算能力而不理会调度上的延迟,则选这项。
Voluntary Kernel Preemption(Desktop):自动式内核抢占。这个选项通过向内核添加更多的“清晰抢占点”来减少内核延迟。这些新的抢占点以降低吞吐量为代价,来降低内核的最大延迟,提供更快的应用程序响应。这通过允许低优先级的进程自动抢占来响应事件,即使进程在内核中进行系统调用。这使得应用程序运行得更“流畅”,即使系统已经是高负荷运转。嵌入式系统里面通常选择N。
Preemptible Kernel(Low-Latency Desktop):可抢占式内核(低延迟桌面)。这个选项通过使所有内核代码(非致命部分)编译为“可抢占”来降低内核延迟。通过允许低优先级进程进行强制抢占来响应事件,即使这些进程正在进行系统调用或者未达到正常的“抢占点”。这使得应用程序运行得更加“流畅”,即使系统已经是高负荷运转。代价是吞吐量降低,内核运行开销增大。嵌入式系统编译内核通常选择Y,这样只有很少的延迟。
其中,Preemptible Kernel子选项提供了最快的响应,适合对实时性要求较高的嵌入式系统。
自旋锁与信号量的内核抢占中的区别
如果被保护的共享资源只在进程上下文访问,使用信号量保护该共享资源非常合适;如果对共巷资源的访问时间非常短,自旋锁也可以。但是如果被保护的共享资源需要在中断上下文访问(包括底半部即中断处理句柄和顶半部即软中断),就必须使用自旋锁。
自旋锁保持期间是抢占失效的,而信号量和读写信号量保持期间是可以被抢占的。自旋锁只有在内核可抢占或SMP的情况下才真正需要,在单CPU且不可抢占的内核下,自旋锁的所有操作都是空操作。
http://blog.csdn.net/hunanchenxingyu/article/details/24769001
spin_lock_irq/spin_unlock_irq
spin_lock_irq时关闭local中断,spin_unlock_irq时打开local中断
spin_lock_irqsave/spin_lock_irqrestore
spin_lock_irqsave时保存local中断状态,spin_lock_irqrestore时恢复local中断状态
spin_lock_bh/spin_unlock_bh
如果被保护的共享资源只在进程上下文访问和软中断上下文访问,那么当在进程上下文访问共享资源时,可能被软中断打断,从而可能进入软中断上下文来对被保护的共享资源访问,因此对于这种情况,对共享资源的访问必须使用spin_lock_bh和spin_unlock_bh来保护
http://blog.sina.com.cn/s/blog_6929134b0100tdn8.html