linux kernel同步方法的总结
文章目录
- 1、原子操作
- 2、自旋锁、读写自旋锁
- 3、信号量、读写信号量、互斥体
- 4、完成量
- 5、大内核锁
- 6、顺序锁
- 7、禁止抢占
- 8、顺序和屏障
1、原子操作
2、自旋锁、读写自旋锁
(自旋锁)
spin_lock() 获取指定的自旋锁
spin_lock_irq() 禁止本地中断并获取指定的锁
spin_lock_irqsave() 保存本地中断的当前状态,禁止本地中断,并获取指定的锁
spin_unlock() 释放指定的锁
spin_unlock_irq() 释放指定的锁,并激活本地中断
spin_unlock_irqstore() 释放指定的锁,并让本地中断恢复到以前状态
(读自旋锁)
read_lock() 获取指定的读锁
read_lock_irq() 禁止本地中断并获得指定读锁
read_lock_irqsave() 存储本地中断的当前状态,禁止本地中断并获得指定读锁
read_unlock() 释放指定的读锁
read_unlock_irq() 释放指定的读锁并激活本地中断
read_unlock_irqrestore() 释放指定的读锁并将本地中断恢复到指定前的状态
(写自旋锁)
write_lock() 获得指定的写锁
write_lock_irq() 禁止本地中断并获得指定写锁
write_lock_irqsave() 存储本地中断的当前状态,禁止本地中断并获得指定写锁
write_unlock() 释放指定的写锁
write_unlock_irq() 释放指定的写锁并激活本地中断
write_unlock_irqrestore() 释放指定的写锁并将本地中断恢复到指定前的状态
3、信号量、读写信号量、互斥体
(信号量)
down_interruptible(struct semaphore *) 以试图获得指定的信号量,如果信号量已被争用,则进入可中断睡眠状态
down(struct semaphore *) 以试图获得指定的信号量,如果信号量已被争用,则进入不可中断睡眠状态
up(struct semaphore *) 以释放指定的信号量,如果睡眠队列不空,则唤醒其中一个任务
(读写信号量)
读写信号量和信号量之间的关系 与 读写自旋锁和普通自旋锁之间的关系 差不多。
读写信号量都是二值信号量,即计数值最大为1,增加读者时,计数器不变,增加写者,计数器才减一。
也就是说读写信号量保护的临界区,最多只有一个写者,但可以有多个读者。
读写信号量的相关内容参见:<asm/rwsem.h> 具体实现与硬件体系结构有关
(互斥体)
mutex_lock(struct mutex *)
mutex_unlock(struct mutex *)
4、完成量
wait_for_completion(struct completion *)
complete(struct completion *)
5、大内核锁
大内核锁已经不再使用,只存在与一些遗留的代码中.
???
6、顺序锁
7、禁止抢占
preempt_disable() 增加抢占计数值,从而禁止内核抢占
preempt_enable() 减少抢占计算,并当该值降为0时检查和执行被挂起的需调度的任务
8、顺序和屏障
rmb() 阻止跨越屏障的载入动作发生重排序
read_barrier_depends() 阻止跨越屏障的具有数据依赖关系的载入动作重排序
wmb() 阻止跨越屏障的存储动作发生重排序
mb() 阻止跨越屏障的载入和存储动作重新排序
smp_rmb() 在SMP上提供rmb()功能,在UP上提供barrier()功能
smp_read_barrier_depends() 在SMP上提供read_barrier_depends()功能,在UP上提供barrier()功能
smp_wmb() 在SMP上提供wmb()功能,在UP上提供barrier()功能
smp_mb() 在SMP上提供mb()功能,在UP上提供barrier()功能
barrier() 阻止编译器跨越屏障对载入或存储操作进行优化
linux kernel同步方法的总结相关推荐
- linux 内核调试信息在哪里,Linux kernel debug技巧----开启DEBUG选项
Linux kernel debug技巧----开启DEBUG选项 作者:wowo 发布于:2016-11-1 19:39 分类:Linux应用技巧 kernel的source code中有很多使用p ...
- linux kernel内存回收机制
http://www.wowotech.net/linux_kenrel/233.html 无论计算机上有多少内存都是不够的,因而linux kernel需要回收一些很少使用的内存页面来保证系统持续有 ...
- Linux kernel futex.c的bug导致JVM不可用
JVM死锁导致线程不可用,然后会瞬间起N个线程,当然也是不可用的,因为需要的对象死锁,然后耗尽文件句柄导致外部TCP无法建议拒绝服务,jstack之后就会恢复. 解决办法:替换中间件类库 ,比如htt ...
- linux命令注入,Linux kernel本地命令注入漏洞
Linux kernel本地命令注入漏洞 2005-10-19 eNet&Ciweek Linux kernel 2.2.6 Linux kernel 2.2.5 Linux kernel 2 ...
- 编译Linux Kernel(linux-4.19.178)并制作成rpm文件
目录 一.安装依赖项 二.下载.解压缩.制作.config文件 三.编译内核及打包 四.升级内核 首次尝试编译Linux内核,记录过程,提供Linux Kernel(linux-4.19.178)下载 ...
- linux读取nand的文件,Linux Kernel 之AP读写Nand Flash上的Yaffs2文件的全过程浅析
1.1 用top-down的方法分析AP读一个Nand Flash上的file的全过程 我先简单看一个例子,看User Application如何打开一个Yaffs2 file并读写之: int ma ...
- linux 内核 call,在Linux Kernel內新增一个System Call(转)
在Linux Kernel內新增一个System Call(转)[@more@]本文作者: gpmoney 使用 system call 去呼叫系統的函式是非常好玩的,但是要如何寫出一個自己的syst ...
- g++ linux 编译开栈_使用 linux kernel +busybox 定制linux系统
写在开头: 本来是想使用linux kernel +busybox 制作一个教程的,后来快要结束的时候,死活找不到硬盘,我了解很多文章都有类似的,但是没有谈到硬盘找不到问题,最后历经艰辛,终于把问题解 ...
- linux kernel内存映射实例分析
作者:JHJ(jianghuijun211@gmail.com) 日期:2012/08/24 欢迎转载,请注明出处 引子 现在android智能手机市场异常火热,硬件升级非常迅猛,arm cortex ...
最新文章
- 机器学习入门(19)— 卷积网络 CNN 的简单实现
- OkHttp源码分析
- 这是我见过最蛋疼的注册中心与API网关实践!
- 【错误记录】Visual Studio 编译 C++ 代码报错 ( To disable deprecation, use _CRT_SECURE_NO_WARNINGS. )
- 哪一个不是html5新增的语义化标记元素,东师19春《HTML5开发基础与应用》作业考核【标准答案】...
- 吴恩达深度学习课程deeplearning.ai课程作业:Class 1 Week 3 assignment3
- 提交本地项目到github
- 数据结构之--冒泡排序的三种实现
- 性价比不高却出到8?华为存在感最低的一个系列再发新机
- 4.7_singleton_创建型模式:单例模式
- php study 后门,phpStudy后门简要分析
- 一文看尽Facebook 3D视觉技术研究进展
- python返回值函数_Python函数的返回值(一)
- 手机app界面及易用性测试点分析(通用)
- deeping linux安装安卓,给Deeping Linux系统官方的一封信,希望官方看到
- 美洽客服JavaScript 网页插件
- OSN1800V OSN1800II OSN1800I 华为全新原包装分组增强型多业务光传送平台
- 抓取网易云音乐歌曲热门评论生成词云
- MySQL 误删数据恢复
- OSChina 周六乱弹 —— 泡面就要泡着吃……
热门文章
- 浅谈电量传感器在数据中心的UPS电源中的应用
- 2025年全球结构化布线市场预计将达到165亿美元
- 如何做好配电室、临时用电安全管理?
- 精密空调主要部件是干啥用的?
- 数据中心实现高效运维的秘诀
- linux替换每个英文字开头为大写,shell脚本,文件里面的英文大小写替换方法。...
- python通过ip获取mac地址_通过IP或socket获取对方的MAC地址
- 百度地图 key_Android百度地图导航的接入(包含驾车、公交、步行)
- android 图片缩放算法,Android大图加载,缩放,滑动浏览--SubsamplingScaleImageView 源码分析大图加载...
- Postman:Postman(HTTP的测试工具)使用方法详细攻略