zoukankan      html  css  js  c++  java
  • 抢占式内核与非抢占式内核中的自旋锁(spinlock)的差别

    一、概括

    (1)自旋锁适用于SMP系统,UP系统用spinlock是作死。

    (2)保护模式下禁止内核抢占的方法:1、运行终端服务例程时2、运行软中断和tasklet时3、设置本地CPU计数器preempt_count

    (3)自旋锁的忙等待的实际意义是:尝试获取自旋锁的还有一个进程不断尝试获取被占用的自旋锁,中间仅仅pause一下!

    (4)在抢占式内核的spin_lock宏中,第一次关抢占,目的是防止死锁(防止一个已经获取自旋锁而未释放的进程被抢占!

    )。

    而后又开抢占。目的是让已经释放自旋锁的进程能够被调度出去,让其它进程能够进入临界区。当然,开启内核抢占后,调度器调度的进程是不是在盲等的进程不可而知!    

    二、具有内核抢占的spin_lock宏

    让我们来具体讨论用于请求自旋锁的spin_lock宏。以下的描写叙述都是针对支持SMP系统的抢占式内核的。

    该宏获取自旋锁的地址sip作为它的參数,并运行以下的操作:
    调用preempt_disable()以禁用内核抢占
    调用函数__raw_spin_trylock()。它对自旋锁的slock字段运行原子性的測试和设置操作。

    该操作首先运行等价于下列汇编片段的一些指令:
    movb$0,%a1

    xchgb%al,slp->slock

    汇编语言指令xchg原子性地交换8位寄存器%al和slp->slock指示的内存单元的内容。

    随后,假设存放在自旋锁中的旧值是正数,函数就返回1,否则返回0。


    假设自旋锁中的旧值是正数,宏结束;内核控制路径已经获得自旋锁。
    否则,内核控制路径无法获得自旋锁。因此宏必须运行循环一直到在其他CPU上运行的内核控制路径释放自旋锁。调用preempt_enable()递减在第1步递增了的抢占计数器。假设在运行spin_lock宏之前内核抢占被启用,那么其他进程此时能够代替等待自旋锁的进程。


    假设break_lock字段等于0。则把它设置为1。通过检測该字段,拥有锁并在其他CPU上执行的进程能够知道是否有其他进程在等待这个锁。假设进程把持某个自旋锁的时间太长。它能够提前释放锁以便等待同样自旋锁的进程能够继续向前执行。
    运行等待循环:
    while(spin_is_locked(sip)&& slp->break_lock)
    cpu_relax();
    宏cpu_relax()简化为一条pause汇编语言指令。

    在Pentium4模型中引入了这条指令以优化自旋锁循环的运行。

    通过引入一个非常短的延迟。加快了紧跟在锁后面的代码的运行并降低了能源消耗。pause与早先的80x86微处理器模型是向后兼容的。由于它相应rep;nop指令,也就是相应空操作。


    跳转回第1步,再次试图获取自旋锁


    三、非抢占式内核中的spin_lock宏
    假设在内核编译时没有选择内核抢占选项,spin_lock宏就与前面描写叙述的spin_lock宏有非常大的差别。在这样的情况下,宏生成一个汇编语言程序片段,它本质上等价于以下紧凑的忙等待:
    1:lock;decbslp->lock
    jns3f
    2:pause
    cmpb$0,slp->slock
    jle2b
    jmp1b
    3;
    汇编语言指令decb递减自旋锁的值,该指令是原子的,由于它带有lock字节前缀。随后检測符号标志,假设它被清0,说明自旋锁被设置为1,因此从标记3处继续正常运行。否则。在标签2处运行紧凑循环直到自旋锁出现正值。然后从标签1处開始又一次运行。由于不检查其他的处理器是否抢占了锁就继续运行是不安全的。
    spin_unlock宏
    spin_unlock宏释放曾经获得的自旋锁,它本质上运行下列汇编语言指令;
    movb$1,slp->slock
    并在随后调用preempt_enable(),注意,由于如今的80x86微处理器总是原子地运行内存中的仅仅写訪问,所以不使用lock字节。
  • 相关阅读:
    解决VMwave下卡死的办法
    深度探索C++对象模型第四章:函数语义学
    cc
    tbb库的使用
    10内核同步方法
    哈希
    django 和restful framework 初始配置轻松搞定
    linux有趣动画--代码雨
    linux有趣开机图标--佛祖保佑
    Socket是什么,通俗易懂点说
  • 原文地址:https://www.cnblogs.com/claireyuancy/p/6847216.html
Copyright © 2011-2022 走看看