内核同步机制——原子操作
内核为原子操作提供了两组接口。一组操作整数,一个组操作比特位。
1.整数原子操作
数据类型为:
typedefstruct {
volatileint counter;
}atomic_t;
为了保持内核在各个平台兼容,以前规定atomic_t的值不能超过24位(都是SPARC惹的祸),不过现在该规定已经不需要了。
相关操作如下:
voidatomic_set(atomic_t *v, int i);
atomic_tv = ATOMIC_INIT(0);//设置原子变量v的值为整数i。
intatomic_read(atomic_t *v);//返回原子变量当前的值
voidatomic_add(int i, atomic_t *v);//将i加到原子变量上
voidatomic_sub(int i, atomic_t *v)//从原子变量的值中减去i
voidatomic_inc(atomic_t *v);//增加原子变量的值
voidatomic_dec(atomic_t *v);//减少原子变量的值
执行相关的操作后测试原子变量的值是否为0
Performthe specified operation and test the result; if, after the operation,the atomic value is 0, then the return value is true; otherwise, itis false. Note that there is no atomic_add_and_test.
intatomic_inc_and_test(atomic_t *v);
intatomic_dec_and_test(atomic_t *v);
intatomic_sub_and_test(int i, atomic_t *v);
Addthe integer variable i to v. The return value is true if the resultis negative,false otherwise.
intatomic_add_negative(int i, atomic_t *v);
Behavejust like atomic_add and friends, with the exception that they returnthe new value of the atomic variable to the caller.
intatomic_add_return(int i, atomic_t *v);
intatomic_sub_return(int i, atomic_t *v);
intatomic_inc_return(atomic_t *v);
intatomic_dec_return(atomic_t *v);
最近的内核也提供了64位的版本,即atomic64_t,方法和用法与32位类似,方法名相应的地方换为atomic64。
2.位操作
Setsbit number nr in the data item pointed to by addr.
voidset_bit(nr, void *addr);
Clearsthe specified bit in the unsigned long datum that lives at addr. Itssemantics are otherwise the same as set_bit.
voidclear_bit(nr, void *addr);
voidchange_bit(nr, void *addr); // Toggles the bit.
Thisfunction is the only bit operation that doesn’t need to be atomic;it simply returns the current value of the bit.
test_bit(nr,void *addr);
Behaveatomically like those listed previously, except that they also returnthe previous value of the bit.
inttest_and_set_bit(nr, void *addr);
inttest_and_clear_bit(nr, void *addr);
inttest_and_change_bit(nr, void *addr);
使用场景:
/*try to set lock */
while(test_and_set_bit(nr, addr) != 0)
wait_for_a_while();
/*do your work */
/*release lock, and check... */
if(test_and_clear_bit(nr, addr) = = 0)
something_went_wrong(); /* already released: error */
内核也提供了一套非原子位操作函数,函数名就是原子版函数前面加两下划线。
转载于:https://my.oschina.net/fuyajun1983cn/blog/263801
内核同步机制——原子操作相关推荐
- Linux内核同步机制之(四):spin lock【转】
转自:http://www.wowotech.net/kernel_synchronization/spinlock.html 一.前言 在linux kernel的实现中,经常会遇到这样的场景:共享 ...
- linux 内核同步--理解原子操作、自旋锁、信号量(可睡眠)、读写锁、RCU锁、PER_CPU变量、内存屏障
内核同步 内核中可能造成并发的原因: 中断–中断几乎可以在任何时刻异步发生,也就可以随时打断当前正在执行的代码. 软中断和tasklet–内核能在任何时刻唤醒或调度软中断和tasklet,打断当前正在 ...
- 内核同步机制-RCU同步机制
转自http://www.360doc.com/content/09/0805/00/36491_4675691.shtml 目录 [隐藏] 1 RCU同步机制 1.1 RCU介绍 1.2 RCU A ...
- 内核同步机制之Mutex Exclusion
为什么80%的码农都做不了架构师?>>> S3C2440在内核版本2.6.34下开发ADC驱动时,会发现驱动程序里用了互斥通信来实现同步: <!-- lang: cpp ...
- Linux内核同步机制之信号量与锁
Linux内核同步控制方法有很多,信号量.锁.原子量.RCU等等,不同的实现方法应用于不同的环境来提高操作系统效率.首先,看看我们最熟悉的两种机制--信号量.锁. 一.信号量 首先还是看看内核中是怎么 ...
- 内核同步机制-优化屏障和内存屏障
优化屏障 编译器编译源代码时,会将源代码进行优化,将源代码的指令进行重排序,以适合于CPU的并行执行.然而,内核同步必须避免指令重新排序,优化屏障(Optimization barrier)避免编译器 ...
- Linux内核同步机制之(一):原子操作
作者: 郭健 来源: wowotech 一.源由 我们的程序逻辑经常遇到这样的操作序列: 1.读一个位于memory中的变量的值到寄存器中 2.修改该变量的值(也就是修改寄存器中的值) 3.将寄存器中 ...
- Linux内核同步机制之completion
内核编程中常见的一种模式是,在当前线程之外初始化某个活动,然后等待该活动的结束.这个活动可能是,创建一个新的内核线程或者新的用户空间进程.对一个已有进程的某个请求,或者某种类型的硬件动作,等等.在这种 ...
- 内核同步机制-信号量(semaphore)
三.内核信号量(semaphore) Linux的信号量是一种睡眠锁,这个不同于自旋锁.如果有一个任务试图获得一个已经被占用的信号量时,信号量会将其推进一个等待队列(具体可以参考进程的活动状态),然后 ...
最新文章
- 几十年的领域专家告诉你,机器翻译进化到哪一步了?
- SUMO 设置车辆的换道模型
- C 库函数 - vprintf()
- Bigtable数据模型和架构
- android webview设置加载进度条
- android 下载多个文件怎么打开,从android的下拉框中下载多个文件或文件夹?
- 软件构架师之路[转帖]
- csv文件的使用,csv空白行问题
- 拓端tecdat|Excel 实例:数据进行排序和筛选
- STM32F030 电压监测实现
- 单循环赛制php,年度总决赛个人PK循环赛赛制解读
- git入门-----初始化命令(init、clone),Basic Snapshotting(add、status、commit、diff、reset、stash)
- 学习CALCULATE函数(六)丨帕累托之累计求和
- Aandroid最简单最全面的热修复
- 搞笑小品剧本-- 搞笑《英雄》——气晕张艺谋
- JavaScript ES5-ES6详解
- 如何开发一个个人微信小程序,微信小程序开发入门教程
- python读取xlsx文件中的日期
- 小破练习-嵌套循环及列表
- 如何使用Docker发布SpringBoot项目