zoukankan      html  css  js  c++  java
  • 多线程的那点儿事(之自旋锁)

      自旋锁是SMP中经常使用到的一个锁。所谓的smp,就是对称多处理器的意思。在工业用的pcb板上面,特别是服务器上面,一个pcb板有多个cpu是 很正常的事情。这些cpu相互之间是独立运行的,每一个cpu均有自己的调度队列。然而,这些cpu在内存空间上是共享的。举个例子说,假设有一个数据 value = 10,那么这个数据可以被所有的cpu访问。这就是共享内存的本质意义。

        我们可以看一段Linux 下的的自旋锁代码(kernel 2.6.23,asm-i386/spinlock.h),就可有清晰的认识了,

    1. static inline void __raw_spin_lock(raw_spinlock_t *lock)  
    2. {  
    3.     asm volatile(" 1: "  
    4.              LOCK_PREFIX " ; decb %0 "  
    5.              "jns 3f "  
    6.              "2: "  
    7.              "rep;nop "  
    8.              "cmpb $0,%0 "  
    9.              "jle 2b "  
    10.              "jmp 1b "  
    11.              "3: "  
    12.              : "+m" (lock->slock) : : "memory");  
    13. }  

    上面这段代码是怎么做到自旋锁的呢?我们可以一句一句看看,


    line  4: 对lock->slock自减,这个操作是互斥的,LOCK_PREFIX保证了此刻只能有一个CPU访问内存
    line  5: 判断lock->slock是否为非负数,如果是跳转到3,即获得自旋锁
    line  6: 位置符
    line  7: lock->slock此时为负数,说明已经被其他cpu抢占了,cpu休息一会,相当于pause指令
    line  8: 继续将lock->slock和0比较,
    line  9: 判断lock->slock是否小于等于0,如果判断为真,跳转到2,继续休息
    line 10: 此时lock->slock已经大于0,可以继续尝试抢占了,跳转到1
    line 11: 位置符 
      
        上面的操作,除了第4句是cpu互斥操作,其他都不是。所以,我们发现,在cpu之间寻求互斥访问的时候,在某一时刻只有一个内存访问权限。所以,如果 其他的cpu之间没有获得访问权限,就会不断地查看当前是否可以再次申请自旋锁了。这个过程中间不会停歇,除非获得访问的权限为止。


    总结:
       1)在smp上自旋锁是多cpu互斥访问的基础
       2)因为自旋锁是自旋等待的,所以处于临界区的代码应尽可能短
       3)上面的LOCK_PREFIX,在x86下面其实就是“lock”,gcc下可以编过,朋友们可以自己试试

  • 相关阅读:
    在OpenEuler中安装轻量化调试工具CGDB
    nginx服务器 server location映射路径配置
    hadoop HDFS文件系统角色及文件读写流程
    Linux系统Tomcat服务自启动脚本
    Linux系统软件安装的三种方式
    linux基础命令
    Java多线程解析
    多线程的典型应用场景---多个生产者多个消费者对共享资源的处理
    10.16变量的作用域和生存周期
    10.15sizeof用法
  • 原文地址:https://www.cnblogs.com/zhaoxinshanwei/p/3885534.html
Copyright © 2011-2022 走看看