linux 内核同步互斥技术之读写自旋锁

读写自旋锁

读写自旋锁(通常简称读写锁)是对自旋锁的改进,区分读者和写者,允许多个读者同时进入临界区,读者和写者互斥,写者和写者互斥。
如果读者占有读锁,写者申请写锁的时候自旋等待。如果写者占有写锁,读者申请读锁的时候自旋等待。

读写自旋锁的定义如下:
include/linux/rwlock_types.h    
typedef struct {
    arch_rwlock_t raw_lock;
#ifdef CONFIG_GENERIC_LOCKBREAK
    unsigned int break_lock;
#endif
#ifdef CONFIG_DEBUG_SPINLOCK
    unsigned int magic, owner_cpu;
    void *owner;
#endif
#ifdef CONFIG_DEBUG_LOCK_ALLOC
    struct lockdep_map dep_map;
#endif
} rwlock_t;
各种处理器架构需要自定义数据类型 arch_rwlock_t, ARM64 架构的定义如下:
arch/arm64/include/asm/spinlock_types.h
typedef struct {
volatile unsigned int lock;
} arch_rwlock_t;

定义并且初始化静态读写自旋锁的方法如下:DEFINE_RWLOCK(x);
在运行时动态初始化读写自旋锁的方法如下:rwlock_init(lock);
申请读锁的函数如下。
(1) read_lock(lock)
申请读锁,如果写者占有写锁,当前处理器自旋等待。
(2) read_lock_bh(lock)
申请读锁,并且禁止当前处理器的软中断。
(3) read_lock_irq(lock)
申请读锁,并且禁止当前处理器的硬中断。
(4) read_lock_irqsave(lock, flags)
申请读锁,保存当前处理器的硬中断状态,并且禁止当前处理器的硬中断。
(5) read_trylock(lock)
尝试申请读锁,如果没有占有写锁的写者,那么申请读锁成功,返回 1;如果写者占有写锁,那么当前处理器不等待,立即返回 0。

释放读锁的函数如下。
(1) read_unlock(lock)
(2) read_unlock_bh(lock)
释放读锁,并且开启当前处理器的软中断。
(3) read_unlock_irq(lock)
释放读锁,并且开启当前处理器的硬中断。
(4) read_unlock_irqrestore(lock, flags)
释放读锁,并且恢复当前处理器的硬中断状态。

申请写锁的函数如下。
(1) write_lock(lock)
申请写锁,如果写者占有写锁或者读者占有读锁,当前处理器自旋等待。
(2) write_lock_bh(lock)
申请写锁,并且禁止当前处理器的软中断。
(3) write_lock_irq(lock)
申请写锁,并且禁止当前处理器的硬中断。
(4) write_lock_irqsave(lock, flags)
申请写锁,保存当前处理器的硬中断状态,并且禁止当前处理器的硬中断。
(5) write_trylock(lock)
尝试申请写锁,如果没有占有锁的写者和读者,那么申请写锁成功,返回 1;如果写者占有写锁或者读者占有读锁,那么当前处理器不等待,立即返回 0。

释放写锁的函数如下。
(1) write_unlock(lock)
(2) write_unlock_bh(lock)
释放写锁,并且开启当前处理器的软中断。
(3) write_unlock_irq(lock)
释放写锁,并且开启当前处理器的硬中断。
(4) write_unlock_irqrestore(lock, flags)
释放写锁,并且恢复当前处理器的硬中断状态。

读写自旋锁使用一个无符号 32 位整数作为计数值,写锁使用最高位,读锁使用其余31 位,算法如下。
(1)申请写锁时,如果计数值是 0,那么设置计数的最高位,进入临界区;如果计数值不是 0,说明写者占有写锁或者读者占有读锁,那么自旋等待。
(2)申请读锁时,如果计数值的最高位是 0,那么把计数加 1,进入临界区;如果计数的最高位不是 0,说明写者占有写锁,那么自旋等待。
(3)释放写锁时,把计数值设置为 0。
(4)释放读锁时,把计数值减 1。
读写自旋锁的缺点是:如果读者很多,写者很难获取写锁,可能饿死。假设有一个读者占有读锁,然后写者申请写锁,写者需要自旋等待,接着另一个读者申请读锁,它可以获取读锁,如果两个读者轮流占有读锁,可能造成写者饿死。
针对这个缺点,内核实现了排队读写锁,主要改进是:如果写者正在等待写锁,那么读者申请读锁时自旋等待,写者在锁被释放以后先得到写锁。排队读写锁的配置宏是 CONFIG_QUEUED_RWLOCKS,源文件是“ kernel/locking/qrwlock.c”(MT 平台目前没有打开此配置)。
include/asm-generic/qrwlock_types.h
……
typedef struct qrwlock {
    atomic_t        cnts;
    arch_spinlock_t     wait_lock;
} arch_rwlock_t;
……
include/asm-generic/qrwlock.h
……
#define arch_read_can_lock(l)   queued_read_can_lock(l)
#define arch_write_can_lock(l)  queued_write_can_lock(l)
#define arch_read_lock(l)   queued_read_lock(l)
#define arch_write_lock(l)  queued_write_lock(l)
#define arch_read_trylock(l)    queued_read_trylock(l)
#define arch_write_trylock(l)   queued_write_trylock(l)
#define arch_read_unlock(l) queued_read_unlock(l)
#define arch_write_unlock(l)    queued_write_unlock(l)
……

 

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

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

相关文章

数据库通用语言DQL-MySQL及语法练习 建议码住,多看几遍!!!!!!!

DQL(数据查询语言) 语法: SELECT字段列表 FROM表名字段 WHERE条件列表 GROUP BY分组字段列表 HAVING分组后的条件列表 ORDER BY排序字段列表 LIMIT分页参数基础查询 查询多个字段: SELECT 字段1, 字段2, 字段3, ... FROM 表名;…

linux下查看进程资源ulimit

ulimit介绍与使用 ulimit命令用于查看和修改进程的资源限制。下面是ulimit命令的使用方法&#xff1a; 查看当前资源限制&#xff1a; ulimit -a 这将显示当前进程的所有资源限制&#xff0c;包括软限制和硬限制。查看或设置单个资源限制&#xff1a; ulimit -<option> …

喜报丨迪捷软件入选2023年浙江省信息技术应用创新典型案例

12月6日&#xff0c;浙江省经信厅公示了2023年浙江省信息技术应用创新典型案例入围名单。本次案例征集活动&#xff0c;由浙江省经信厅、省密码管理局、工业和信息化部网络安全产业发展中心联合组织开展&#xff0c;共遴选出24个优秀典型解决方案&#xff0c;迪捷软件“基于全数…

安装鸿蒙开发者工具DevEco Studio

1.进入官网下载工具 https://developer.harmonyos.com/cn/develop/deveco-studio/ 选择您电脑对应的系统下载即可 2.安装 很简单直接点击“next”,此处不做赘述 3.配置环境 安装完成后&#xff0c;打开DevEco Studio 会提示配置环境。安装node.js和ohpm 如果不小心关了&a…

DevEco Studio无法识别本地模拟器设备的解决方法

遇到了一个问题&#xff0c;之前测试无误的本地模拟器&#xff0c;运行后设备栏中无法识别了。 此时保持模拟器处于开启状态&#xff0c;关闭DevEco Studio窗口重新启动后&#xff0c;发现重新识别设备了。

Android手机使用Termux终端模拟器

Termux 是 Android 平台上的一个终端模拟器&#xff0c;可以在 Android 手机上模拟 Linux 环境。它提供命令行界面&#xff0c;并且提供了功能健全的包管理工具&#xff08;pkg&#xff09;。另外就是 Termux 不需要 root 权限&#xff0c;安装后默认产生一个用户&#xff0c;可…

【CASS精品教程】cass11提示“请不要在虚拟机中运行此程序”的解决办法

文章目录 一、问题提示二、解决办法一、问题提示 按照正常安装教程安装好南方测绘cass 11之后,打开的时候可能会有以下提示:请不要在虚拟机中运行此程序,如下图所示: 遇到问题,咱们就想办法解决问题,下面将自己尝试的方法及最终解决情况跟大家说一下,供参考。 二、解决…

Linux---压缩和解压缩命令

1. 压缩格式的介绍 Linux默认支持的压缩格式: .gz.bz2.zip 说明: .gz和.bz2的压缩包需要使用tar命令来压缩和解压缩.zip的压缩包需要使用zip命令来压缩&#xff0c;使用unzip命令来解压缩 压缩目的: 节省磁盘空间 2. tar命令及选项的使用 命令说明tar压缩和解压缩命令 …

Linux centos7安装redis 6.2.14 gz并且使用systemctl为开机自启动 / 彻底删除 redis

1.下载 && 减压 wget http://download.redis.io/releases/redis-6.2.14.tar.gz tar -zvxf redis-6.2.14.tar.gz 2.编译&#xff08;分开运行&#xff09; cd redis-6.2.14 make cd src make install 安装目录展示 3.redis.conf 配置更改 daemonize yes supervised s…

广告推广数据流畅,腾讯智能表API无代码集成

简化电商操作&#xff1a;实现无代码API集成 在数字化时代&#xff0c;电商平台需要高效、灵活的工具来简化其业务操作。腾讯文档智能表通过其无代码API连接功能&#xff0c;极大地简化了电商平台与内部系统的集成过程。商家通过几个简单步骤即可实现系统间的数据同步和流转&a…

智能优化算法应用:基于JAYA算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于JAYA算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于JAYA算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.JAYA算法4.实验参数设定5.算法结果6.参考文献7.MA…

IDEA配置一个新项目

git clone xxxxx 下载项目主分支 git checkout xxx 切换到需要开发的分支上 配置maven仓库 在File下的Settings中设置maven仓库 配置maven仓库的文件夹 配置好maven后&#xff0c;项目中会出现一个红色的pom.xml文件&#xff0c;右击文件&#xff0c;点击…&#xff0c;pom…

第二十章 : Spring Boot 集成RabbitMQ(四)

第二十章 : Spring Boot 集成RabbitMQ(四) 前言 本章知识点:死信队列的定义、场景、作用以及原理、TTL方法的使用以及演示代码示例。 Springboot 版本 2.3.2.RELEASE ,RabbitMQ 3.9.11,Erlang 24.2死信队列 定义:什么是死信队列? 在RabbitMQ中,并没有提供真正意义…

如何在项目中使用事件对象

了解事件对象 首先&#xff0c;理解事件对象&#xff08;通常在事件处理函数中表示为 e 或 event&#xff09;是理解任何 JavaScript 事件处理的关键。这个对象包含了关于发生事件的所有信息&#xff0c;例如&#xff1a; 哪个元素触发了事件 (e.target)事件的类型&#xff0…

配置Nginx解决跨域问题

Nginx 中将前端请求中的所有以 “/apiUrl” 开头的路径代理到 http://192.12.200.101:9813 例如&#xff1a; /apiUrl/login > http://192.12.200.101:9813/login 配置nginx环境 进入Nginx 的配置文件编辑界面: sudo nano /etc/nginx/conf.d/default.conf开始编辑 defaul…

1. cgal在ubuntu下的安装及Hello World的测试

文章目录 ubuntu下的安装教程 Hello World1 三点一线2 点序列的凸包2.1 内置数组中的点的凸包2.2 向量中点的凸包 3 关于内核和特征类4 概念和模型5 进一步阅读 ubuntu下的安装 CGAL安装 参考地址:https://doc.cgal.org/latest/Manual/usage.html 本在在ubuntu下安装: sudo ap…

gcc介绍

gcc编译有四个步骤&#xff1a;预处理、编译、汇编、链接 前提条件: hello.c 1 预处理 gcc -E hello.c -o hello.i -o 指定输出文件为hello.i 展开宏、头文件&#xff0c;替换条件编译&#xff0c;删除注释、空行、空白 2 gcc -S 编译 gcc -S hello.i -o hello.s 检查语法…

基于Springboot的旅游网站设计与实现(论文+调试+源码)

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

数据手册Datasheet解读-MOS管笔记

数据手册Datasheet解读-MOS管笔记 NMOS应用场景一般特征第一个参数Vdss第二、三个参数Rds&#xff08;on&#xff09;、IdMOS管的散热绝对最大额定值第一个参数-Vd第二个参数-Vdgr第三个参数-Vg(栅源电压)第四个参数-Id第五个参数-Idm第六个参数-Ptot第七个参数-Viso第七和八的…

模块四(一):搭建自己的SSR

前言&#xff1a;同构渲染是将服务器渲染和客户端渲染相结合的一种渲染方式&#xff0c;在服务端生成初始页面&#xff0c;提升首屏加载速度&#xff0c;并且有利于SEO&#xff1b;在客户端接管HTML&#xff0c;并且将静态HTML激活为数据绑定的动态HTML&#xff0c;为用户提供更…