linux无锁编程[通俗易懂]

linux无锁编程[通俗易懂]简单的笔记,未完待续一道题:无锁化编程有哪些常见方法?针对计数器,可以使用原子加只有一个生产者和一个消费者,那么就可以做到免锁访问环形缓冲区(RingBuffer)RCU(Read-Copy-Update),新旧副本切换机制,对于旧副本可以采用延迟释放的做法 CAS(Compare-and-Swap),如无锁栈,无锁队列等待解析:一、RCU   

大家好,又见面了,我是你们的朋友全栈君。

简单的笔记,未完待续

一道题:

无锁化编程有哪些常见方法?

  • 针对计数器,可以使用原子加
  • 只有一个生产者和一个消费者,那么就可以做到免锁访问环形缓冲区(Ring Buffer)
  • RCU(Read-Copy-Update),新旧副本切换机制,对于旧副本可以采用延迟释放的做法 
  • CAS(Compare-and-Swap),如无锁栈,无锁队列等待

解析:

一、RCU

        RCU是Linux 2.6内核系统新的锁机制 RCU(Read-Copy Update)。参考:http://www.ibm.com/developerworks/cn/linux/l-rcu/

        众所周知,为了保护共享数据,需要一些同步机制,如自旋锁(spinlock),读写锁(rwlock),它们使用起来非常简单,而且是一种很有效的同步机制,在UNIX系统和Linux系统中得到了广泛的使用。但是随着计算机硬件的快速发展,获得这种锁的开销相对于CPU的速度在成倍地增加,原因很简单,CPU的速度与访问内存的速度差距越来越大,而这种锁使用了原子操作指令,它需要原子地访问内存,也就说获得锁的开销与访存速度相关。会导致处理器流水线停滞或刷新,因此它的开销相对于CPU速度而言就越来越大。

        RCU并不是新的锁机制,它只是对Linux内核而言是新的。早在二十世纪八十年代就有了这种机制,而且在生产系统中使用了这种机制,但这种早期的实现并不太好,在二十世纪九十年代出现了一个比较高效的实现,而在linux中是在开发内核2.5.43中引入该技术的并正式包含在2.6内核中。

        RCU(Read-Copy Update),顾名思义就是
读-拷贝修改,它是基于其原理命名的。
对于被RCU保护的共享数据结构,读者不需要获得任何锁就可以访问它,但写者在访问它时首先拷贝一个副本,然后对副本进行修改,最后使用一个回调(callback)机制在适当的时机把指向原来数据的指针重新指向新的被修改的数据。这个时机就是所有引用该数据的CPU都退出对共享数据的操作。写者在访问被RCU保护的共享数据时不需要和读者竞争任何锁,只有在有多于一个写者的情况下需要获得某种锁以与其他写者同步。允许多个读者和写者并发执行。
RCU 技术的核心是写操作分为写和更新两步,允许读操作在任何时候无阻碍的运行,换句话说,就是通过
延迟写来提高同步性能。

         因此RCU实际上是一种改进的rwlock,读者几乎没有什么同步开销,它不需要锁,不使用原子指令。

二、CAS

参考:透过 Linux 内核看无锁编程

非阻塞型同步的三种方案:

  1. Wait-free

    Wait-free 是指任意线程的任何操作都可以在有限步之内结束,而不用关心其它线程的执行速度。 Wait-free 是基于 per-thread 的,可以认为是 starvation-free 的。非常遗憾的是实际情况并非如此,采用 Wait-free 的程序并不能保证 starvation-free,同时内存消耗也随线程数量而线性增长。目前只有极少数的非阻塞算法实现了这一点。

  2. Lock-free

    Lock-Free 是指能够确保执行它的所有线程中至少有一个能够继续往下执行。由于每个线程不是 starvation-free 的,即有些线程可能会被任意地延迟,然而在每一步都至少有一个线程能够往下执行,因此系统作为一个整体是在持续执行的,可以认为是 system-wide 的。所有 Wait-free 的算法都是 Lock-Free 的。

  3. Obstruction-free

    Obstruction-free 是指在任何时间点,一个孤立运行线程的每一个操作可以在有限步之内结束。只要没有竞争,线程就可以持续运行。一旦共享数据被修改,Obstruction-free 要求中止已经完成的部分操作,并进行回滚。 所有 Lock-Free 的算法都是 Obstruction-free 的。

        CAS(Compare – And – Swap)操作业界在原子操作的基础上提出的,用来实现Lock-Free算法。CAS 原语负责将某处内存地址的值(1 个字节)与一个期望值进行比较,如果相等,则将该内存地址处的值替换为新值,CAS 操作伪码描述如下:

Bool CAS(T* addr, T expected, T newValue) 
 { 
      if( *addr == expected ) 
     { 
          *addr =  newValue; 
           return true; 
     } 
     else 
           return false; 
 }

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/133109.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • intellij idea2021激活码【在线注册码/序列号/破解码】

    intellij idea2021激活码【在线注册码/序列号/破解码】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月17日
    45
  • goland 激活码(注册激活)

    (goland 激活码)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~MLZPB5EL5Q-eyJsaWNlbnNlSWQiOi…

    2022年3月21日
    404
  • Anaconda与Pycharm的辨析[通俗易懂]

    Anaconda与Pycharm的辨析[通俗易懂]Anaconda与Pycharm的辨析Anaconda是python文件的一个包管理器,可以用它下载python文件的相关库和包,制作成python编程所需要的环境(模块、包、库)Pycharm是python文件的集成开发环境,在Pycharm上可以进行python文件的开发与调试,像VisualStudio之于C++,Eclipse之于Java。Pycharm里面也有下载python文件的相关库和包的功能,但很多库和包Pycharm可能因为网络及版本问题不能下载安装故Pycharm和Anacon

    2022年8月25日
    13
  • PyCharm激活码永久有效PyCharm2020.3.3激活码教程-持续更新,一步到位

    PyCharm激活码永久有效PyCharm2020.3.3激活码教程-持续更新,一步到位PyCharm激活码永久有效2020.3.3激活码教程-Windows版永久激活-持续更新,Idea激活码2020.3.3成功激活

    2022年6月19日
    94
  • 备份从android到ios系统文件,如何将音乐从安卓设备转移到iOS设备中「建议收藏」

    备份从android到ios系统文件,如何将音乐从安卓设备转移到iOS设备中「建议收藏」这几天,小编刚从Android手机切换到iPhone,可是Android手机上还有很多音乐文件没有保存下来,这时候该怎么处理呢?好在,小编发现了一款神器——iMazing,它可以帮助我们顺利的转移各种文件,音乐文件也是不在话下,下面就和小编一起来看看具体该怎么操作吧!图1iPhone将Android手机中的音乐文件转移到电脑中如果大家使用的是Mac电脑,需要到Android官方网站下载Andor…

    2022年9月18日
    2
  • ShFileOperation函数详解

    ShFileOperation函数详解[WinAPI]ShFileOperation函数详解2010-04-1110:24ShFileOperation只有一个参数是LPSHFILEOPSTRUCT型的相当于delphi中的TSHFileOpStruct;  c语言定义为:  typedef struct _SHFILEOPSTRUCT{   HWND         hwnd

    2022年7月18日
    17

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号