Linux的同步访问技术
1.中断屏蔽:
单CPU范围内避免竞态的一种简单方法:在进入临界区之前屏蔽系统的中断。中断屏蔽将使得中断与进程之间的并发不再发生,而且Linux内核的进程调度等操作都依赖中断来实现,内核抢占式进程之间的并发也就得以避免。
操作步骤:
local_irq_disable() //屏蔽中断
critical section() //临界区
local_irq_enable() //开启中断
中断对于内核的运行非常重要,在屏蔽中断期间的终端都无法得到处理,因此长时间的屏蔽中断是很危险的,有可能造成数据丢失甚至是系统崩溃,所以在中断屏蔽后,当前的内核执行路径应当尽快的执行完临界区的代码。
2.原子操作:
原子操作->是在执行的过程中不会被别的代码路径所中断的操作。
Linux内核提供了一系列函数来实现内核中的原子操作,这些函数分为两类:
1>针对位进行原子操作;2>针对整理变量进行原子操作。
共同点:在任何情况下操作都是原子的,内核代码可以安全地调用它们而不会被打断,都是依赖底层CPU的原子操作来实现的。
3.自旋锁:
由于中断屏蔽会使得中断得不到响应,从而导致系统性能变差;原子操作受限于CPU,只能实现有限几种基本数据类型的排他操作;Linux设计了自旋锁以实现共享资源的同步访问。
自旋锁(spin lock)是一种对临界资源进行互斥访问的典型手段。为了获得一个自旋锁,在某CPU上运行的代码需先执行一个原子操作,该操作测试并设置(test-and-set)某个内存变量,由于是原子操作,所以该操作完成之前其他操作执行单元不可能访问这个内存变量。若测试结果表明这个锁已经空闲,则程序获得这个自旋锁并继续执行,若测试结果表明这个锁仍被占用,程序将在一个小的循环内重复这个“测试并设置”操作,即进行所谓的“自旋”。当自旋锁的持有者通过重置该变量释放这个自旋锁后,某个等待的变量“测试并设置”操作向其调用者报告锁已释放。
Linux与自旋锁有关的操作主要有以下4种:
(1)spinlock_t spin; //定义自旋锁
(2)spin_lock_init(lock); //动态初始化自旋锁lock
(3)spin_lock(lock); //获得自旋锁 直到获得 “可能会一直原地打转”
spin_trylock(lock) ; //获得自旋锁 只尝试一次 “不会一直原地打转”
(4)spin_unlock(lock); //释放自旋锁
中断处理程序不能使用自旋锁,因为中断处理程序中申请的自旋锁被其他执行程序路径所占有,会导致系统其他中断得不到响应。
自旋锁其实是忙等锁,当锁不可用时,CPU一直循环执行“测试并设置”该锁直到可用而取得该锁,CPU在等待自旋锁时不做任何有用的工作,仅仅是等待,因此只有在占用锁的时间极短的情况下使用自旋锁才是合理的。当临界区很大或有共享设备的时候,需要较长时间占有锁,使用锁会降低系统的性能。
自旋锁还可能会导致系统死锁。递归使用一个锁即如果一个已经拥有自旋锁的CPU想要第二次获得这个锁,则该CPU将产生死锁。此外还有进程获得锁后再阻塞,也可能导致死锁。copy_from_user()、copy_to_user()、kmalloc()等函数都可能因为内存缺页而阻塞,因此在自旋锁占用期间不能调用这些函数。
Linux的同步访问技术的更多相关文章
- Linux内核硬件访问技术
① 驱动程序控制设备,主要是通过访问设备内的寄存器来达到控制目的.因此我们讨论如何访问硬件,就成了如何访问这些寄存器. ② 在Linux系统中,无论是内核程序还是应用程序,都只能使用虚拟地址,而芯片手 ...
- Linux 驱动分类 与访问技术
驱动开发概述 1.驱动分类 1.1 常规分析法 1.1.1 字符设备 字符设备是一种按字节来访问的设备,字符驱动则负责驱动字符设备, 这样的驱动通常实现open, close, read和wri ...
- Linux内核同步机制--转发自蜗窝科技
Linux内核同步机制之(一):原子操作 http://www.wowotech.net/linux_kenrel/atomic.html 一.源由 我们的程序逻辑经常遇到这样的操作序列: 1.读一个 ...
- 转:Linux网络IO并行化技术概览
转:http://codinginet.com/articles/view/201605-linux_net_parallel?simple=1&from=timeline&isapp ...
- Linux内核同步
Linux内核剖析 之 内核同步 主要内容 1.内核请求何时以交错(interleave)的方式执行以及交错程度如何. 2.内核所实现的基本同步机制. 3.通常情况下如何使用内核提供的同步机制. 内核 ...
- linux内核同步之每CPU变量、原子操作、内存屏障、自旋锁【转】
转自:http://blog.csdn.net/goodluckwhh/article/details/9005585 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 一每 ...
- Linux多线程同步方式
当多个线程共享相同的内存时,需要确保每个线程看到一致的数据视图,当多个线程同时去修改这片内存时,就可能出现偏差,得到与预期不符合的值.为啥需要同步,一件事情逻辑上一定是有序的,即使在并发环境下:而操作 ...
- [内核同步]浅析Linux内核同步机制
转自:http://blog.csdn.net/fzubbsc/article/details/37736683?utm_source=tuicool&utm_medium=referral ...
- C#与数据库访问技术总结(十八)
ADO.NET 代码综合示例 前面已经介绍过OLE DB.NET和SQL Server.NET数据提供者可以用来连接不同的数据源. 以下代码不仅综合演示了使用ADO.NET的这两种数据提供者访问数据库 ...
随机推荐
- 【2017-05-19】WebForm复合控件
自动提交的属性: AutoPostBack="True" 1.RadioButtonList 单选集合 -属性:RepeatDirection:Vertical (垂直排布 ...
- ASP.NET Gridview数据库绑定支持增删改,记得要完整实现
1.错误情况 /WebSite3"应用程序中的服务器错误. 指定的参数已超出有效值的范围. 参数名: index 说明: 执行当前 Web 请求期间,出现未经处理的异常.请检查堆栈跟踪信息, ...
- One day one cf,Keep Wa away from me.
Codeforces Round #379 (Div. 2) A水,算字符个数 B水,贪心优先组成后者 C贪心尺取,以消耗排序change那个,然后贪心另一个 D对角线就是x0+y0 == x1+y1 ...
- MySQL数据库使用mysqldump导出数据详解
mysqldump是mysql用于转存储数据库的实用程序.它主要产生一个SQL脚本,其中包含从头重新创建数据库所必需的命令CREATE TABLE INSERT等.接下来通过本文给大家介绍MySQL数 ...
- Session Cookie的HttpOnly和secure属性
Session Cookie的HttpOnly和secure属性 一.属性说明: 1 secure属性 当设置为true时,表示创建的 Cookie 会被以安全的形式向服务器传输,也就是只能在 HTT ...
- Hibernate SQLQuery 原生SQL 查询及返回结果集处理-2
1. 返回List, .setResultTransformer( Transformers.ALIAS_TO_ENTITY_MAP);将结果转为Map,存放到list中,即list中为若干 ...
- [认证授权] 4.OIDC(OpenId Connect)身份认证授权(核心部分)
0 目录 认证授权系列:http://www.cnblogs.com/linianhui/category/929878.html 1 什么是OIDC? 看一下官方的介绍(http://openid. ...
- 中文分词中的战斗机-jieba库
英文分词的第三方库NLTK不错,中文分词工具也有很多(盘古分词.Yaha分词.Jieba分词等).但是从加载自定义字典.多线程.自动匹配新词等方面来看. 大jieba确实是中文分词中的战斗机. 请随意 ...
- css样式,边界和边框,格式和布局
1.大小:width:宽:heigh:高 2.背景:1)background-color:背景颜色 2)background-image:背景图片url路径 3)background-repeat:图 ...
- JS语句
JS语句包括: 1.顺序语句 2.分支语句: if...else switch...case 3.循环语句 一.先看顺序语句: </body> < ...