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的这两种数据提供者访问数据库 ...
随机推荐
- Bootstrap实现轮播图
第一步:设计轮播图容器:div.carousel,添加slide平滑切换,并定义id,方便后面采用data属性来触发 <div class='carousel slide' id="t ...
- Day4-内置函数--未完待续,慢慢写
内置函数:https://docs.python.org/3/library/functions.html?highlight=built#ascii 未完待续....
- 15、TCP/IP协议
15.TCP/IP协议 几台孤立计算机系统组在一起形成网络,几个孤立网络连在一起形成一个网络的网络,即互连网.一个互连网就是一组通过相同协议族互连在一起的网络. 互联网的目的之一是在应用程 ...
- Android onclick监听事件打开新界面
一.新建工程 二.新建XML代码 新建一个Button <Button android:layout_width="wrap_content" android:layout_ ...
- Linux下关闭JBoss实例
本文内容: 查看JBoss运行实例 #ps -ef|grep java 上图就是运行结果(部分结果),其中一个服务器上可能会运行多个JBOSS server实例,找到你需要看的那个. 其中 ps -e ...
- 【shell脚本实例】shell脚本统计单词频率、出现次数最多的n个单词
1. 统计的对象words.txt,每个单词占一行(从简考虑了~) zjd@ubuntu:~/test$ cat word.txt used this count mysql count this u ...
- LINQ基础(三)
一.并行LINQ System.Linq名称空间中包含的类ParallelEnumerable可以分解查询的工作,使其分布在多个线程上. 尽管Enumerable类给IEnumerable<T& ...
- Centos 执行shell命令返回127错误
shell脚本功能:连接mysql,自动创建数据库,脚本如下 mysql -h$MYSQL_IP -u$MYSQL_USER -p$MYSQL_PASSWORD --default-character ...
- css3转盘抽奖
做到一个活动,需要转盘抽奖,于是想到使用css3的动画效果,其中主要包含transition的动画过渡,transform的rotate的旋转效果,在这里只用到2d的旋转, 特别强调的是,因为需要和后 ...
- Vivado2015.4使用教程(一个完成工程的建立)
双击桌面的vivado图标,(可能有点慢) 弹出主菜单界面,点击create new project 这是介绍界面,next~ 添加好工程名,和工程位置,next~ 选择rtl Project,nex ...