Linux内核之读、写信号量:up_read、up_write用法实例(五十三)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!

优质专栏:Audio工程师进阶系列原创干货持续更新中……】🚀
优质专栏:多媒体系统工程师系列原创干货持续更新中……】🚀
优质视频课程:AAOS车载系统+AOSP14系统攻城狮入门实战课原创干货持续更新中……】🚀

人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

更多原创,欢迎关注:Android系统攻城狮

欢迎关注Android系统攻城狮

🍉🍉🍉文章目录🍉🍉🍉

    • 🌻1.前言
    • 🌻2.Linux内核之up_read与up_write介绍
      • 🐓2.1 读写信号量(RWSEM)
      • 🐓2.2 up_read
      • 🐓2.3 up_write
      • 🐓2.4 重要性
      • 🐓2.5 性能和扩展性
      • 🐓2.6 结论
    • 🌻3.代码实例
      • 🐓3.1 读取信号量:保护共享资源的并发读取操作
      • 🐓3.2 写入信号量:保护对共享资源的独占写入操作
      • 🐓3.3 同时使用读取锁和写入锁来保护共享资源的读写操作

🌻1.前言

本篇目的:Linux内核之读写信号量:up_read/up_write用法实例

🌻2.Linux内核之up_read与up_write介绍

  • 在 Linux 内核中,up_read 和 up_write 是用于管理读写信号量的函数,通常与 down_read 和 down_write 函数一起使用,用于实现读写锁。
  • up_read函数:
作用:释放读取锁定信号量。
用法:up_read(&sem);
说明:up_read 函数用于释放先前通过 down_read 函数获取的读取锁。它使得其他进程或线程能够获取读取锁,允许多个并发读取操作。
  • up_write:
作用:释放写入锁定信号量。
用法:up_write(&sem);
说明:up_write 函数用于释放先前通过 down_write 函数获取的写入锁。它使得其他进程或线程能够获取写入锁,允许其他写入或读取操作。
  • 这些函数通常与读写锁信号量(如 rw_semaphore)一起使用,以确保对共享资源的并发访问的正确性和同步。读取锁(共享锁)允许多个读取者同时访问资源,但写入锁(互斥锁)要求独占访问,因此在写入时需要阻止其他读取者和写入者。

  • 在Linux内核中,up_readup_write是用于操作读写信号量的两个重要函数。这些函数在内核的并发控制中扮演着关键角色,特别是在处理对共享资源的并发访问时。

🐓2.1 读写信号量(RWSEM)

  • 首先,我们需要了解读写信号量(RWSEM)的概念。读写信号量是一种允许多个读者同时访问资源,但在写者访问时需要独占资源的同步机制。这种机制非常适合于读操作远多于写操作的场景,因为它可以显著提高系统的并发性能。
  • 读写信号量包含两个计数器:
  1. 读计数器:记录当前有多少个读者持有信号量。
  2. 写计数器:当有写者等待或正在写入时,它会递增。

🐓2.2 up_read

  • up_read函数用于增加读计数器,通常在读者完成对共享资源的访问后调用。这个函数的主要作用是释放对共享资源的读锁。如果释放后没有任何读者或写者持有信号量,它还会唤醒等待的写者。
  • up_read的基本步骤如下:
  1. 增加读计数器:如果有其他读者正在访问资源,up_read会增加读计数器。
  2. 检查写者等待状态:如果写者正在等待,up_read会检查是否有必要唤醒它们。
  3. 唤醒写者:如果没有读者或写者持有信号量,up_read会唤醒等待的写者。

🐓2.3 up_write

  • up_write函数用于释放对共享资源的写锁。它通常在写者完成对共享资源的写入操作后调用。与up_read不同,up_write在释放写锁后,如果有读者或写者等待,它将负责唤醒这些等待的进程。
  • up_write的基本步骤如下:
  1. 减少写计数器:如果有写者持有信号量,up_write会减少写计数器。
  2. 检查读者和写者等待状态up_write会检查是否有读者或写者正在等待。
  3. 唤醒等待的读者或写者:如果有等待的读者或写者,up_write会唤醒它们。

🐓2.4 重要性

  • up_readup_write在Linux内核中非常重要,因为它们提供了一种有效的机制来控制对共享资源的并发访问。这种机制可以防止竞态条件,确保在多个进程或线程访问共享资源时的数据一致性。

🐓2.5 性能和扩展性

  • 读写信号量在多处理器系统上特别有用,因为它们允许并发读取,从而提高了系统的整体性能。此外,它们还支持在多核处理器上的扩展性,这对于现代操作系统来说是至关重要的。

🐓2.6 结论

  • up_readup_write是Linux内核中用于管理读写信号量的两个基本函数,它们在确保共享资源并发访问的正确性和性能方面发挥着关键作用。通过提供对共享资源的精细控制,这些函数为Linux内核的高效和稳定运行提供了支持。随着Linux内核的不断发展和优化,这些同步机制也在不断改进,以适应不断变化的硬件和软件需求。

🌻3.代码实例

🐓3.1 读取信号量:保护共享资源的并发读取操作

#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/semaphore.h>static DEFINE_RWLOCK(my_rwlock);
static int shared_data = 0;static int __init read_lock_example_init(void)
{pr_info("Read lock example driver initialized\n");return 0;
}static void __exit read_lock_example_exit(void)
{pr_info("Read lock example driver exited\n");
}static int my_open(struct inode *inode, struct file *file)
{pr_info("Device opened\n");return 0;
}static ssize_t my_read(struct file *file, char *buf, size_t count, loff_t *pos)
{ssize_t bytes_read = 0;// 获取读取锁down_read(&my_rwlock);// 读取共享资源bytes_read = snprintf(buf, count, "Shared data: %d\n", shared_data);// 释放读取锁up_read(&my_rwlock);return bytes_read;
}static const struct file_operations my_fops = {.owner = THIS_MODULE,.open = my_open,.read = my_read,
};module_init(read_lock_example_init);
module_exit(read_lock_example_exit);MODULE_LICENSE("GPL");

🐓3.2 写入信号量:保护对共享资源的独占写入操作

#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/semaphore.h>static DEFINE_RWLOCK(my_rwlock);
static int shared_data = 0;static int __init write_lock_example_init(void)
{pr_info("Write lock example driver initialized\n");return 0;
}static void __exit write_lock_example_exit(void)
{pr_info("Write lock example driver exited\n");
}static int my_open(struct inode *inode, struct file *file)
{pr_info("Device opened\n");return 0;
}static ssize_t my_write(struct file *file, const char *buf, size_t count, loff_t *pos)
{ssize_t bytes_written = 0;// 获取写入锁down_write(&my_rwlock);// 写入共享资源sscanf(buf, "%d", &shared_data);bytes_written = count;// 释放写入锁up_write(&my_rwlock);return bytes_written;
}static const struct file_operations my_fops = {.owner = THIS_MODULE,.open = my_open,.write = my_write,
};module_init(write_lock_example_init);
module_exit(write_lock_example_exit);MODULE_LICENSE("GPL");

🐓3.3 同时使用读取锁和写入锁来保护共享资源的读写操作

#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/semaphore.h>static DEFINE_RWLOCK(my_rwlock);
static int shared_data = 0;static int __init mixed_lock_example_init(void)
{pr_info("Mixed lock example driver initialized\n");return 0;
}static void __exit mixed_lock_example_exit(void)
{pr_info("Mixed lock example driver exited\n");
}static int my_open(struct inode *inode, struct file *file)
{pr_info("Device opened\n");return 0;
}static ssize_t my_read(struct file *file, char *buf, size_t count, loff_t *pos)
{ssize_t bytes_read = 0;// 获取读取锁down_read(&my_rwlock);// 读取共享资源bytes_read = snprintf(buf, count, "Shared data: %d\n", shared_data);// 释放读取锁up_read(&my_rwlock);return bytes_read;
}static ssize_t my_write(struct file *file, const char *buf, size_t count, loff_t *pos)
{ssize_t bytes_written = 0;// 获取写入锁down_write(&my_rwlock);// 写入共享资源sscanf(buf, "%d", &shared_data);bytes_written = count;// 释放写入锁up_write(&my_rwlock);return bytes_written;
}static const struct file_operations my_fops = {.owner = THIS_MODULE,.open = my_open,.read = my_read,.write = my_write,
};module_init(mixed_lock_example_init);
module_exit(mixed_lock_example_exit);MODULE_LICENSE("GPL");

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

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

相关文章

ASP.NET基于WEB的工作计划流程管理系统的设计与实现

摘 要 信息技术的飞速发展&#xff0c;尤其是网络通讯技术、数据库技术及自动化技术的日新月异&#xff0c;为单位、企业的办公带来了极大的便利。但是由于单位、企业的工作性质众多&#xff0c;工作流程各有差异&#xff0c;企业、单位、部门之间的管理机制各不相同&#xf…

用队列实现栈(力扣第225题)

#include "stdio.h" #include "stdbool.h" #include "string.h" #include "stdlib.h" #include "assert.h"//初始化队列 typedef int QueueDataType;typedef struct queue {QueueDataType val;struct queue* next; }Qnode;t…

微信小程序地图polyline坐标太多异常显示BUG

描述 微信小程序map地图上显示polyline线&#xff0c;点位超过1250个出现bug&#xff0c;&#xff08;仅真机上出现&#xff0c;模拟器上正常&#xff09; 这里以加载四川省边界为例, 以下是示例代码 // 读取geojson数据 uni.request({url: https://geo.datav.aliyun.com/a…

openplc Linux 使用modbus RTU 从机通讯

1.Linux 环境下&#xff0c;openplc 默认使用的是modbus tcp协议通信。 想要使用串口 modbus rtu 通讯可以通过在runtime中添加SlaveDevices从机设备 2.添加设备&#xff0c;分配地址。 左边添加串口配置&#xff0c;右边是需要通讯的地址&#xff0c;从机地址都是从100开始&am…

yolov8 区域计数

yolov8 区域计数 1. 基础2. 计数功能2.1 计数模块2.2 判断模块 3. 主代码4. 实验结果5. 源码 1. 基础 本项目是在 WindowsYOLOV8环境配置 的基础上实现的&#xff0c;测距原理可见上边文章 2. 计数功能 2.1 计数模块 在指定区域内计数模块 def count_objects_in_region(bo…

STM32 堆栈内存以及变量存储分布

STM32的程序存储器、数据存储器、寄存器和输入输出端口被组织在同一个4GB的线性地址空间内, 地址范围为0x0000 0000至0xFFFF FFFF。其中FLASH为ROM类型&#xff0c;储存的数据掉电不易失&#xff1b;RAM中存储的数据掉电易失。以STM32F103系列为例&#xff0c;最多有512KB的FLA…

Discuz! X3.4 升级至 Discuz! X3.5 详细教程

第一步&#xff1a;从其他以前的 Discuz! X 版本升级Discuz! X3.4 请先升级到Discuz! X3.4&#xff0c;升级教程网上比较普遍&#xff0c;在此不再论述。 第二步&#xff1a;Discuz! X3.4 升级至 Discuz! X3.5 &#xff08;Discuz 从 X3.5 以后&#xff0c;不在发布GBK版本&…

【软考】UML中的图之类图

目录 1. 说明2. 图示3. 类图使用方式3.1 对系统的词汇建模3.2 对简单的协作建模3.3 对逻辑数据库模式建模 1. 说明 1.类图&#xff08;Class Diagram&#xff09;展现了一组对象、接口、协作和它们之间的关系。2.在面向对象系统的建模中所建立的最常见的图是类图。3.类图给出系…

离线数仓数据导出-hive数据同步到mysql

离线数仓数据导出-hive数据同步到mysql MySQL建库建表数据导出 为方便报表应用使用数据&#xff0c;需将ads各指标的统计结果导出到MySQL数据库中。 datax支持hive同步MySQL&#xff1a;仅仅支持hive存储的hdfs文件导出。所以reader选hdfs-reader&#xff0c;writer选mysql-wri…

怎样在外网登录访问CRM管理系统?

一、什么是CRM管理系统&#xff1f; Customer Relationship Management&#xff0c;简称CRM&#xff0c;指客户关系管理&#xff0c;是企业利用信息互联网技术&#xff0c;协调企业、顾客和服务上的交互&#xff0c;提升管理服务。为了企业信息安全以及使用方便&#xff0c;企业…

SSM小程序作品集展示微信小程序

采用技术 SSM小程序作品集展示微信小程序的设计与实现~ 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringMVCMyBatis 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 页面展示效果 用户功能 用户注册 用户首页 作品集 优秀作者 我的分享 管…

powershell@命令行提示符样式配置自定义@pwsh重写prompt显示电量内存时间等信息

文章目录 abstract流行的powershell prompt模块示例 powershell原生修改Prompt函数配置文档Prompt命令来自哪里 简单修改带上电量和时间的Prompt 复杂修改预览FAQ:没有必要修改相关仓库地址样式选择平衡样式花哨样式响应性能 小结 abstract 在 PowerShell 中&#xff0c;可以通…

CSDN积分和等级和 能创建专栏数量的关系。还差1000多分!

积分查询&#xff1a;CSDN 博客积分规则 博客积分是CSDN对用户努力的认可和奖励&#xff0c;也是衡量博客水平的重要标准。博客等级也将由博客积分唯一决定。积分规则具体如下&#xff1a; 1、每发布一篇原创或者翻译文章&#xff1a;可获得10分&#xff1b; 2、每发布一篇转载…

做一个答题pk小程序多少钱

在探讨“做一个答题pk小程序多少钱”这一问题时&#xff0c;我们首先需要明确的是&#xff0c;小程序的价格并非固定不变&#xff0c;而是受到多种因素的影响。这些因素包括但不限于小程序的复杂度、功能需求、开发周期、技术难度以及开发团队的规模和经验等。因此&#xff0c;…

Web前端 JavaScript笔记7

js的执行机制 js是单线程 同步&#xff1a;前面一个任务执行结束之后&#xff0c;执行后一个 异步&#xff1a;异步任务&#xff0c;引擎放在一边&#xff0c;不进入主线程&#xff0c;而进入任务队列的任务 js通过浏览器解析&#xff0c;浏览器靠引擎解析 回调函数同步任务执行…

LabVIEW卡尔曼滤波技术

LabVIEW卡尔曼滤波技术 在现代航空导航中&#xff0c;高精度和快速响应的方位解算对于航空安全至关重要。通过LabVIEW平台实现一种卡尔曼滤波方位解算修正技术&#xff0c;以改善传统导航设备在方位解算中的噪声干扰问题&#xff0c;从而提高其解算精度和效率。通过LabVIEW的强…

Java基础之JVM基础调优与常见问题

常见命令 以下命令的介绍&#xff0c;全部在jdk8环境下运行的&#xff1b; jps ☆☆☆☆☆ 查看当前运行的进程号&#xff1b; jmap ☆☆☆ jmap命令可以查看jvm的内存信息&#xff0c;class对应的实例个数以及占用的内存大小 jmap -histo 查看当前java进程 [rdVM-8-12-c…

Ugee手写板Ex08 S设置流程

手写笔的结构 笔尖 鼠标左键 上面第一个键&#xff1a;鼠标右键&#xff08;效果有时候也不完全等同&#xff09; 上面第二个键&#xff1a;鼠标中键 WPS ①打开pdf ②批注->随意画->画曲线 效果如下&#xff1a;

小程序中使用HTTPS调用自带文本安全内容检测接口(msg_sec_check)的实现方法

在小程序中调用自带的文本安全内容检测接口&#xff0c;你需要使用小程序提供的wx.request方法。以下是一个示例代码&#xff1a; javascript代码: // 假设你已经获取了access_token,如果不知道如何获取&#xff0c;可以参考我上一篇文章 const access_token 你的access_tok…

Python 基于docker部署的Mysql备份查询脚本

前言 此环境是基于docker部署的mysql&#xff0c;docker部署mysql可以参考如下链接&#xff1a; docker 部署服务案例-CSDN博客 颜色块文件 rootbogon:~ 2024-04-18 16:34:23# cat DefaultColor.py ######################################################################…