Linux内核原语(十二)——Spinlock与内核抢占

 

 

Linux内核原语(十二)——Spinlock与内核抢占

小狼@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且不可抢占的内核下,自旋锁的所有操作都是空操作。

 

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来保护
 


参考文献:

linux内核抢占及配置

linux内核自锁旋spinlock常用宏解释

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值