互斥锁、读写锁 、 自旋锁和RCU锁

2023-05-16

基础知识思考整理
http://blog.csdn.net/aganlengzi/article/details/50996227

互斥锁 mutex:

在访问共享资源之前对进行加锁操作,在访问完成之后进行解锁操作。
加锁后,任何其他试图再次加锁的线程会被阻塞,直到当前进程解锁。
如果解锁时有一个以上的线程阻塞,那么所有该锁上的线程都被编程就绪状态,
第一个变为就绪状态的线程又执行加锁操作,那么其他的线程又会进入等待。
在这种方式下,只有一个线程能够访问被互斥锁保护的资源。

读写锁 rwlock(也叫作共享互斥锁:读模式共享,写模式互斥):

读写锁有三种状态:读加锁状态、写加锁状态和不加锁状态
一次只有一个线程可以占有写模式的读写锁,但是多个线程可以同时占有读模式的读写锁。(这也是它能够实现高并发的一种手段)
当读写锁在写加锁模式下,任何试图对这个锁进行加锁的线程都会被阻塞,直到写进程对其解锁。
当读写锁在读加锁模式先,任何线程都可以对其进行读加锁操作,但是所有试图进行写加锁操作的线程都会被阻塞,直到所有的读线程都解锁。
所以读写锁非常适合对数据结构读的次数远远大于写的情况。

如果严格按照上述读写锁的操作进行的话,那么当读者源源不断到来的时候,写者总是得不到读写锁,就会造成不公平的状态。
一种避免这种不公平状态的方法是:
当处于读模式的读写锁接收到一个试图对其进行写模式加锁操作时,便会阻塞后面对其进行读模式加锁操作的线程。
这样等到已经加读模式的锁解锁后,写进程能够访问此锁保护的资源。

自旋锁spinlock:

自旋锁的使用模式和互斥锁很类似。
只是在加锁后,有线程试图再次执行加锁操作的时候,该线程不会阻塞,而处于循环等待的忙等状态(CPU不能够做其他事情)。
所以自旋锁适用的情况是:锁被持有的时间较短,而且进程并不希望在重新调度上花费太多的成本。

RCU锁(Read-Copy Update):读-复制 更新

实际上是对读写锁的一种改进,同样是对读者线程和写者线程进行区别对待,只不过对待的方式是不同的。
读写锁中只允许多个读者同时访问被保护的数据,但是在RCU中允许多个读者和多个写者同时访问被保护的资源。写者的同步开销则取决于使用的写者间同步机制,RCU并不对此进行支持。
RCU中,读者不需要使用锁,要访问资源尽管访问就好了。
RCU中,写者的同步开销比较大,要等到所有的读者都访问完成了才能够对被保护的资源进行更新。
写者修改数据前首先拷贝一个被修改元素的副本,然后在副本上进行修改,修改完毕后它向垃圾回收器注册一个回调函数以便在适当的时机执行真正的修改操作。
读者必须提供一个信号给写者以便写者能够确定数据可以被安全地释放或修改的时机。有一个专门的垃圾收集器来探测读者的信号,一旦所有的读者都已经发送信号告知它们都不在使用被RCU保护的数据结构,垃圾收集器就调用回调函数完成最后的数据释放或修改操作。
写者要从链表中删除元素 B,它首先遍历该链表得到指向元素 B 的指针,然后修改元素 B 的前一个元素的 next 指针指向元素 B 的 next 指针指向的元素C,修改元素 B 的 next 指针指向的元素 C 的 prep 指针指向元素 B 的 prep指针指向的元素 A,在这期间可能有读者访问该链表,修改指针指向的操作是原子的,所以不需要同步,而元素 B 的指针并没有去修改,因为读者可能正在使用 B 元素来得到下一个或前一个元素。写者完成这些操作后注册一个回调函数以便在 grace period 之后删除元素 B,然后就认为已经完成删除操作。垃圾收集器在检测到所有的CPU不在引用该链表后,即所有的 CPU 已经经历了 quiescent state(上下文切换),grace period(所有的CPU都经历了一次上下文切换) 已经过去后,就调用刚才写者注册的回调函数删除了元素 B。

适用于网络路由表的查询更新、设备状态表的维护、数据结构的延迟释放以及多径I/O设备的维护

[0] UNIX环境高级编程
[1] https://www.ibm.com/developerworks/cn/linux/l-rcu/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

互斥锁、读写锁 、 自旋锁和RCU锁 的相关文章

  • MySQL进阶-监控、高可用

    MySQL监控 1 常见的监控方式 一般来说 xff0c 常见的监控方式主要有如下三种 xff1a 监控方式特点优点缺点工具 脚本自己编写工具或脚本 xff0c 适合初期机器很少的生产环境在企业初期可以快速满足监控需求后期部署和维护成本大商
  • Druid+Commons DBUtils基本使用

    Druid 1 jar包下载 xff1a https github com alibaba druid releases 2 导入jar包 2 1创建lib文件夹 xff0c 复制粘贴进去 2 2 2 3 3 创建配置文件 文件名称 xff
  • MAC安装maven及每次启动需要刷新bash_profile问题

    1 下载 网址 xff1a https maven apache org download cgi 2 解压安装 选择一个目录 示例 xff1a Users i18 apache maven 3 8 1 3 配置变量 vim span cl
  • win10解压安装mysql方法及遇见的问题(缺少MSVCR120.dll文件、服务无法启动)

    WIN10系统MYSQL的下载与安装详细教程 第一步 xff1a 下载 MySQL 下载地址 xff1a https dev mysql com downloads mysql 5 1 html downloads 具体过程如下 xff1a
  • 基于select函数实现的tcp简单服务器

    select 实现 tcp demo 回忆TCP的连接过程selectselect 的封装tcp类的封装程序流程 程序cli cpp 客户端建立连接SelectSvr hpp 服务器的头文件Tcpsvr hppmain cpp 主函数mak
  • 【odroid-xu3】 ODROID-XU3软件环境搭建记录

    原文链接 xff1a http blog csdn net aganlengzi article details 50036951 1 操作系统环境准备 我用的是Ubuntu12 04 xff0c 但是建议用更高的版本 按照android官
  • D435i相机首次开发与踩坑记录

    D435i相机首次开发与踩坑记录 介绍 配置完D435i相机的开发环境后开始尝试研究官方例程 xff0c 试着运行一些demo初入intel相机 开始的时候也是很头疼 xff0c 不知道如何下手 xff0c 看了众多博客后稍微有了一些眉目
  • 单片机串口收发字符数据的类型

    今天在用51单片机进行串口收发数据的时候遇到了这样一个问题 xff0c 上位机给单片机的字符数据是什么类型的 xff0c 单片机又是怎样存储的 xff1f 串口中断如下 UART中断服务函数 void InterruptUART inter
  • cmake之链接外部动态库

    cmake不再使你在构建项目时郁闷地想自杀了 xff0d xff0d 佚名KDE开发者 xff11 xff0e 写在开头 有两种方式 xff0c 一种是cmake自己内置的find package 另一种是使用pkg config 2 fi
  • 一帧CAN数据需要多长时间发送

    1 CAN通讯速率 默认 500kbit s xff1b 2 xff1a 从下图CAN数据包的完整结构可知 xff0c 一包完整的扩展帧CAN数据总共包含 128bit xff1b 3 xff1a 发送一帧扩展帧CAN数据耗时 128 50
  • 在单片机中什么是堆栈?它的作用是什么?

    在片内RAM中 xff0c 常常要指定一个专门的区域来存放某些特别的数据 它遵循顺序存取和后进先出 LIFO FILO 的原则 这个RAM区叫堆栈 子程序调用和中断服务时CPU自动将当前PC值压栈保存 xff0c 返回时自动将PC值弹栈 保
  • 初识Java内部类

    初识Java内部类原创 xff1a morgan83 提起Java内部类 xff08 Inner Class xff09 可能很多人不太熟悉 xff0c 实际上类似的概念在C 43 43 里也有 xff0c 那就是嵌套类 xff08 Nes
  • 微型四轴设计之通过arduino读取MPU6050原始数据

    概述 打算自己选型配件 画PCB以及焊元件 xff0c 制作一个微型四轴飞行器 主控板打算使用stm32 xff0c 此处使用arduino来读取mpu6050只是为了便于开发和调试 xff08 arduino的串口监视器用起来很方便 xf
  • PS304远距离串口服务器模块应用于电子设备开发芯片测试工业数字接口转换数字接口学习验证

    PS304 Ports Server channel 4 是多种数字接口物理层协议转发器 xff0c 可实现 UART 转换 I2C SPI 1Wire 远距离通讯 xff0c 内嵌磁隔离双电源及辅助增强电源电路 自适应线缆算法 强大灵活的
  • 使用 eBPF 技术跟踪 Netfilter 数据流

    1 网络层数据流向与 Netfilter 体系 图 1 1 为网络层内核收发核心流程图 xff0c 在函数流程图中我们可以看到 Netfliter 在其中的位置 xff08 图中深色底纹圆角矩形 xff09 图中对应的 hook 点有 5
  • 【Modern OpenGL】颜色 Colors

    说明 xff1a 跟着learnopengl的内容学习 xff0c 不是纯翻译 xff0c 只是自己整理记录 强烈推荐原文 xff0c 无论是内容还是排版 原文链接 本文地址 xff1a http blog csdn net aganlen
  • C++怎样打开网页?

    C 43 43 如何打开网页 xff1f 一 调用cmd函数打开C 43 43 网页 xff1a 二 使用const命令打开网页 xff1a 最近 xff0c 有朋友问我 xff0c 怎么用C 43 43 打开网页呢 xff1f 今天我给大
  • C++写一个http服务器/web服务器

    目录 开篇废话正文Http工作流程Http hHttp cpp个人网站链接源码地址新的解析协议简单介绍一下 开篇废话 其实这篇文章一直想写 xff0c 苦于没有时间 xff0c 想一气呵成写完 xff0c 在离回家前一天晚上 xff0c 在

随机推荐