Linux内核读写锁与读写信号量的区别及选用

在Linux内核中,读写锁(rwlock_t)和读写信号量(struct rw_semaphore)是两种不同的同步机制,适用于不同的场景。以下是它们的区别和选用建议:


核心区别

特性读写锁 (rwlock_t)读写信号量 (struct rw_semaphore)
底层实现基于自旋锁(spinlock)基于信号量(允许睡眠)
是否可睡眠❌ 不可睡眠(临界区禁止阻塞)✅ 可睡眠(临界区允许阻塞)
适用上下文中断上下文、原子上下文进程上下文(不能用于中断)
读者/写者优先级读者优先(可能导致写者饥饿)可配置写者优先(避免饥饿)
性能特点短临界区高效(无上下文切换)长临界区更优(避免CPU空转)
锁持有时间极短时间(纳秒~微秒级)较长时间(毫秒级以上)
典型APIread_lock()/write_lock() + ..._unlock()down_read()/down_write() + up_...()

如何选用?

1. 读写锁 (rwlock_t)
  • 适用场景
    • 临界区代码极短(如修改一个指针、计数器)。
    • 需要在中断上下文原子上下文中使用(如中断处理函数)。
    • 高并发读操作,且写操作极少(例如统计数据的读取)。
  • 优点
    • 无上下文切换开销,适合高频短操作。
    • 允许在中断上下文中使用。
  • 缺点
    • 临界区不可阻塞(否则死锁)。
    • 写者可能因读者持续占用而饥饿。
2. 读写信号量 (struct rw_semaphore)
  • 适用场景
    • 临界区代码较长或可能阻塞(如访问文件、等待I/O)。
    • 需要公平性(写者优先,避免饥饿)。
    • 仅在进程上下文中使用(如系统调用、内核线程)。
  • 优点
    • 允许睡眠,适合长临界区。
    • 支持优先级继承(避免优先级反转)。
  • 缺点
    • 上下文切换开销较大,不适用于高频短操作。
    • 不能在中断上下文中使用。

实际案例

  1. 网络协议栈统计计数
    • 使用rwlock_t:频繁读取统计值(读者多),偶尔更新(写者少),且操作极快。
  2. 文件系统元数据修改
    • 使用struct rw_semaphore:修改文件元数据可能需要等待磁盘I/O(阻塞),且写操作需优先完成。
  3. 中断处理中更新共享数据
    • 使用rwlock_t:中断上下文必须用自旋锁,且操作时间短。

其他替代方案

  • RCU(Read-Copy-Update)
    • 适用于读多写极少且数据为指针的场景(无锁读,写者延迟释放旧数据)。
  • Seqlock
    • 允许读者和写者同时进行,但读者需检查是否发生写冲突(适合极少写、频繁读且数据简单的场景)。

总结

  • 短时间 + 非阻塞 + 中断上下文 → 读写锁
  • 长时间 + 允许阻塞 + 公平性 → 读写信号量
  • 根据具体场景权衡性能、阻塞需求和上下文类型。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/895949.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用openresty和lua实现壁纸投票功能

背景 之前做了一个随机壁纸接口,但是不知道大家喜欢对壁纸的喜好,所以干脆在实现一个投票功能,让用户给自己喜欢的壁纸进行投票。 原理说明 1.当访问http://demo.com/vote/时,会从/home/jobs/webs/imgs及子目录下获取图片列表&…

LLaMA 3.1 模型在DAMODEL平台的部署与实战:打造智能聊天机器人

文章目录 前言 一、LLaMA 3.1 的特点 二、LLaMA3.1的优势 三、LLaMA3.1部署流程 (一)创建实例 (二)通过JupyterLab登录实例 (3)部署LLaMA3.1 (4)使用教程 总结 前言 LLama3…

【Python爬虫(25)】解锁Python爬虫:数据存储的最优选择与高效策略

【Python爬虫】专栏简介:本专栏是 Python 爬虫领域的集大成之作,共 100 章节。从 Python 基础语法、爬虫入门知识讲起,深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑,覆盖网页、图片、音频等各类数据爬取&#xff…

【复现DeepSeek-R1之Open R1实战】系列8:混合精度训练、DeepSpeed、vLLM和LightEval介绍

这里写目录标题 1 混合精度训练1.1 FP16和FP321.2 优点1.3 存在的问题1.4 解决办法 2 DeepSpeed3 vLLM3.1 存在的问题3.2 解决方法3.2.1 PagedAttention3.2.2 KV Cache Manager3.2.3 其他解码场景 3.3 结论 4 LightEval4.1 主要功能4.2 使用方法4.3 应用场景 本文继续深入了解O…

使用 FFmpeg 剪辑视频指南

FFmpeg 是一个功能强大的多媒体处理工具,可以进行视频和音频的剪辑、合并、转码等操作。本文将详细介绍如何使用 FFmpeg 进行视频剪辑,并通过实例帮助你快速掌握剪辑技巧。我们会从最基础的剪切功能讲起,再延伸到一些高级操作,如指…

【分布式理论15】分布式调度1:分布式资源调度的由来与过程

文章目录 一、操作系统的资源调度:从单核到多核二、 分布式系统的资源调度:从单台服务器到集群三、 固定资源映射四、 动态资源分配:灵活的任务-资源匹配五、 资源调度过程:从申请到执行 本文主要讨论主题: 从操作系统…

【Linux C/C++开发】Linux系统轻量级的队列缓存mqueue

前言 开发设计时,通常会对业务流程进行模块化,有些流程之间,不要求同步,但又需要传递信息时,如果存储到数据库,效率降低很多,如果是存放在内存是最好的。此时可以选择系统的IPC(进程…

Vue 实现通过URL浏览器本地下载 PDF 和 图片

1、代码实现如下: 根据自己场景判断 PDF 和 图片,下载功能可按下面代码逻辑执行 const downloadFile async (item: any) > {try {let blobUrl: any;// PDF本地下载if (item.format pdf) {const response await fetch(item.url); // URL传递进入i…

计算机网络基础杂谈(局域网、ip、子网掩码、网关、DNS)

目录 1. 简单局域网的构成 2. IP 地址 3. 子网掩码 4. IP地址详解自定义IP 5. IP 地址详解 6. 网关 7. DNS 域名解析 8. ping 1. 简单局域网的构成 交换机是组建局域网最重要的设备,换句话说,没有交换机就没法搭建局域网 交换机不能让局域网连…

Thor: 统一AI模型网关的革新之选

项目价值 Thor(雷神托尔)作为一个强大的AI模型管理网关,解决了当前AI领域一个关键痛点:不同AI服务商的API格式各异,集成成本高。Thor通过将各种AI模型的独特格式统一转换为OpenAI格式,显著降低了开发者的使用门槛和维护成本。 核…

25年2月通信基础知识补充:多普勒频移与多普勒扩展、3GPP TDL信道模型

看文献过程中不断发现有太多不懂的基础知识,故长期更新这类blog不断补充在这过程中学到的知识。由于这些内容与我的研究方向并不一定强相关,故记录不会很深入请见谅。 【通信基础知识补充7】25年2月通信基础知识补充1 一、多普勒频移与多普勒扩展傻傻分不…

【Python】Python入门——笔记合集

哈哈 00、环境搭建 学习Python,首先需要搭建一个本地开发环境,或是使用线上开发环境(各类练习网站),这篇博客里主要记录了本地开发环境的配置方法。内容包括python解释器的安装以及pycharm的安装、汉化等。 博客地…

为什么mvcc中?m_ids 列表并不等同于 min_trx_id 和 max_trx_id 之间的所有事务 ID

首先我们要明确 m_ids 表示创建 ReadView 时,系统中所有活跃(未提交)事务的事务 ID 列表。 仅包含当前未提交的事务,与事务 ID 的数值范围无关。 min_trx_id 是 m_ids 中的最小值。若 m_ids 为空,则 min_trx_id 等于…

使用 Spark NLP 实现中文实体抽取与关系提取

在自然语言处理(NLP)领域,实体抽取和关系提取是两个重要的任务。实体抽取用于从文本中识别出具有特定意义的实体(如人名、地名、组织名等),而关系提取则用于识别实体之间的关系。本文将通过一个基于 Apache Spark 和 Spark NLP 的示例,展示如何实现中文文本的实体抽取和…

FPGA开发要学些什么?如何快速入门?

随着FPGA行业的不断发展,政策的加持和投入的研发,近两年FPGA行业的薪资也是水涨船高,一些人转行后拿到了薪资30W,甚至有一些能力强的人可以拿到60W,看到这里想必不少人表示很心动,但又不知道怎么转&#xf…

使用Python和正则表达式爬取网页中的URL数据

在数据抓取和网络爬虫开发中,提取网页中的URL是一个常见的需求。无论是用于构建网站地图、分析链接结构,还是进行内容聚合,能够高效地从HTML文档中提取URL都是一个重要的技能。Python作为一种强大的编程语言,结合其正则表达式模块…

人工智能之目标追踪DeepSort源码解读(yolov5目标检测,代价矩阵,余弦相似度,马氏距离,匹配与预测更新)

要想做好目标追踪,须做好目标检测,所以这里就是基于yolov5检测基础上进行DeepSort,叫它为Yolov5_DeepSort。整体思路是先检测再追踪,基于检测结果进行预测与匹配。 一.参数与演示 这里用到的是coco预训练人的数据集: 二.针对检测结果初始化track 对每一帧数据都输出…

C++蓝桥杯基础篇(四)

片头 嗨~小伙伴们,大家好!今天我们来学习C蓝桥杯基础篇(四),继续练习相关习题。准备好了吗?咱们开始咯~ 题目1 连续整数相加 思路分析: 这道题,我们可以把从键盘中读取n写在while循…

YOLOv12从入门到入土(含结构图)

论文链接:https://arxiv.org/abs/2502.12524 代码链接:https://github.com/sunsmarterjie/yolov12 文章摘要: 长期以来,增强YOLO框架的网络架构一直至关重要,但一直专注于基于cnn的改进,尽管注意力机制在建…

SpringSecurity基于配置方法控制访问权限:MVC匹配器、Ant匹配器

Spring Security 是一个功能强大且高度可定制的身份验证和访问控制框架。在 Spring Security 中,可以通过配置方法来控制访问权限。认证是实现授权的前提和基础,在执行授权操作前需要明确目标用户,只有明确目标用户才能明确它所具备的角色和权…