Linux设备驱动程序 之 RCU机制
读取-复制-更新(read-copy-update,RCU)是一种高级的互斥机制,在正确的条件下,可以获得高的性能;
RCU对它保护的数据结构做了一些限定,它针对经常发生读而很少发生写的情况做了优化,被保护的资源应该通过指针访问,而对这些资源的引用必须仅由原子代码拥有,在RCU保护的代码范围内不能进入睡眠状态;在修改该数据结构时,写入线程首先复制,然后修改副本,之后用新的版本替换相关指针,当内核确信老的版本上没有其他引用时,就可以释放老的版本了;
使用RCU的代码应该包含<linux/rcupdate.h>头文件;
RCU读操作的使用方法如下,注意反引用的指针不能在RCU锁之外使用;
rcu_read_lock(); p = rcu_dereference(ptr);
if (p != NULL) {
/* 读取操作 */
} rcu_read_unlock();
RCU写操作的使用方法如下,首先需要分配一个新的结构,如果必要则从旧的结构中复制数据,然后将读取代码能看到的指针替换掉;
struct some_struct * new_ptr = kmalloc(...); new_prt->xxx = xx; rcu_assign_pointer(ptr, new_ptr);
在写端完成之后,剩下的工作就是释放旧的数据结构;当然,这时其他处理器上运行的代码可能扔在引用旧的数据,因此不能立即释放旧的结构;写入代码必须等待直到能够确信不存在这样的引用;
因为拥有对该数据结构的引用的代码都必须是原子的,因此我们可以知道,一旦系统中的每个处理器都至少调用一次后,所有的引用都会消失;因此,RCU所做的就是,设置一个回调函数并等待所有的处理器被调度,之后由回调函数完成清理工作;
RCU提供了两个函数分别为同步等待所有读取结束和异步等待读取结束后释放旧结构资源;
同步:synchronize_rcu(),修改之后调用该函数等待所有读引引用结束,在函数返回之后进行旧资源的释放;
void synchronize_rcu(void);
异步:call_rcu(),通过该函数注册一个释放旧资源的回调函数,在所有的读访问完成之后,回调注册函数,进行旧资源的释放;
void call_rcu(struct rcu_head *head, rcu_callback_t func);
Linux设备驱动程序 之 RCU机制的更多相关文章
- 【转】linux设备驱动程序中的阻塞机制
原文网址:http://www.cnblogs.com/geneil/archive/2011/12/04/2275272.html 阻塞与非阻塞是设备访问的两种方式.在写阻塞与非阻塞的驱动程序时,经 ...
- 再谈Linux内核中的RCU机制
转自:http://blog.chinaunix.net/uid-23769728-id-3080134.html RCU的设计思想比较明确,通过新老指针替换的方式来实现免锁方式的共享保护.但是具体到 ...
- Linux设备驱动程序学习之分配内存
内核为设备驱动提供了一个统一的内存管理接口,所以模块无需涉及分段和分页等问题. 我已经在第一个scull模块中使用了 kmalloc 和 kfree 来分配和释放内存空间. kmalloc 函数内幕 ...
- Linux设备驱动程序学习----1.设备驱动程序简介
设备驱动程序简介 更多内容请参考Linux设备驱动程序学习----目录 1. 简介 Linux系统的优点是,系统内部实现细节对所有人都是公开的.Linux内核由大量复杂的代码组成,设备驱动程序可以 ...
- linux设备驱动程序-设备树(3)-设备树多级子节点的转换
linux设备驱动程序--设备树多级子节点的转换 在上一章:设备树处理之--device_node转换成platform_device中,有提到在设备树的device_node到platform_de ...
- linux设备驱动程序-i2c(2)-adapter和设备树的解析
linux设备驱动程序-i2c(2)-adapter和设备树的解析 (注: 基于beagle bone green开发板,linux4.14内核版本) 在本系列linux内核i2c框架的前两篇,分别讲 ...
- linux设备驱动程序-i2c(1):i2c总线的添加与实现
linux设备驱动程序-i2c(1):i2c总线的添加与实现 (基于4.14内核版本) 在上一章节linux设备驱动程序-i2c(0)-i2c设备驱动源码实现中,我们演示了i2c设备驱动程序的源码实现 ...
- Linux设备驱动之semaphore机制【转】
转自:http://blog.csdn.net/xiao229404041/article/details/7031776 Linux设备驱动之semaphore机制在Linux系统中,信号号是一种重 ...
- linux设备驱动程序该添加哪些头文件以及驱动常用头文件介绍(转)
原文链接:http://blog.chinaunix.net/uid-22609852-id-3506475.html 驱动常用头文件介绍 #include <linux/***.h> 是 ...
随机推荐
- 【web安全】浅谈web安全之XSS
XSS定义 XSS, 即为(Cross Site Scripting), 中文名为跨站脚本, 是发生在目标用户的浏览器层面上的,当渲染DOM树的过程成发生了不在预期内执行的JS代码时,就发生了XSS攻 ...
- JS-完数
完数 完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数.它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身.如果一个数恰好等于它的因子之和,则称该数 ...
- asp.net mvc4 学习1
1 简介:微软在很早就看到了基于windows系统的web开发平台的需求,这时便开始提出自己的解决方案即微软的第一个基于web开发的平台ASP.再后来随着需求和性能的要求再2002年推出第二个解决方案 ...
- NETGEAR路由器登录不上 重新获取ip
当NETGEAR路由器更改了"局域网IP配置",或者重启之后,会出现登录不上的情况 释放IP地址 # ipconfig /release 重新获取 # ipconfig /rene ...
- 内核开机logo
安装 # sudo apt-getinstall netpbm 制图 # bmptoppm logo.bmp > logo.ppm # ppmquant 224 logo.ppm > lo ...
- vue.config.js基础配置
const path = require('path') const UglifyPlugin = require('uglifyjs-webpack-plugin') module.exports ...
- SAP云平台里Global Account和Sub Account的关系
在Cloud Foundry环境里,一个Global Account或者Trial Account能够创建多个SubAccount,如图: 创建好的新的subaccount: 一旦subaccount ...
- 解决WinForm屏幕缩放适配只需修改两个Form的两个属性
最近要做一个windows下截屏识别文字的程序,调试发现截取的图像显示不完整. 输出了Screen.PrimaryScreen.Bounds.Width获取的值,结果与实际分辨率不同,所以确定了与我的 ...
- Windows Ping | Tracert 's Bat 脚本并行测试
系统:windows 需求:测试多台PC输出三个网站并行ping.tracert结果,多台PC同时进行. 说明:以www.baidu.com.www.sina.com.cn.www.tencent.c ...
- 虚拟机不能桥接联网 vmnet0上的网桥当前未运行
win10家庭版更新到内测版后,原来可以正常桥接工作的虚拟机ubuntu不能在桥接模式下联网和ssh连接了,因为获取不到IP地址了. 上网搜索一下,发现直接粗暴的方法--修复VMware Workst ...