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的同步访问技术的更多相关文章

  1. Linux内核硬件访问技术

    ① 驱动程序控制设备,主要是通过访问设备内的寄存器来达到控制目的.因此我们讨论如何访问硬件,就成了如何访问这些寄存器. ② 在Linux系统中,无论是内核程序还是应用程序,都只能使用虚拟地址,而芯片手 ...

  2. Linux 驱动分类 与访问技术

    驱动开发概述 1.驱动分类 1.1 常规分析法 1.1.1  字符设备  字符设备是一种按字节来访问的设备,字符驱动则负责驱动字符设备,  这样的驱动通常实现open, close, read和wri ...

  3. Linux内核同步机制--转发自蜗窝科技

    Linux内核同步机制之(一):原子操作 http://www.wowotech.net/linux_kenrel/atomic.html 一.源由 我们的程序逻辑经常遇到这样的操作序列: 1.读一个 ...

  4. 转:Linux网络IO并行化技术概览

    转:http://codinginet.com/articles/view/201605-linux_net_parallel?simple=1&from=timeline&isapp ...

  5. Linux内核同步

    Linux内核剖析 之 内核同步 主要内容 1.内核请求何时以交错(interleave)的方式执行以及交错程度如何. 2.内核所实现的基本同步机制. 3.通常情况下如何使用内核提供的同步机制. 内核 ...

  6. linux内核同步之每CPU变量、原子操作、内存屏障、自旋锁【转】

    转自:http://blog.csdn.net/goodluckwhh/article/details/9005585 版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[-] 一每 ...

  7. Linux多线程同步方式

    当多个线程共享相同的内存时,需要确保每个线程看到一致的数据视图,当多个线程同时去修改这片内存时,就可能出现偏差,得到与预期不符合的值.为啥需要同步,一件事情逻辑上一定是有序的,即使在并发环境下:而操作 ...

  8. [内核同步]浅析Linux内核同步机制

    转自:http://blog.csdn.net/fzubbsc/article/details/37736683?utm_source=tuicool&utm_medium=referral ...

  9. C#与数据库访问技术总结(十八)

    ADO.NET 代码综合示例 前面已经介绍过OLE DB.NET和SQL Server.NET数据提供者可以用来连接不同的数据源. 以下代码不仅综合演示了使用ADO.NET的这两种数据提供者访问数据库 ...

随机推荐

  1. php中for循环的应用1

    for 循环是 PHP 中最复杂的循环结构.它的行为和 C 语言的相似.在PHP中使用的是执行相同的代码集的次数. for 循环的语法是: for (expr1; expr2; expr3)state ...

  2. Java基础知识二次学习--第五章 数组

    第五章 数组 时间:2017年4月26日15:11:30~2017年4月26日15:15:54 章节:05章_01节  视频长度:09:30 内容:一维数组的内存分析 心得: Java中数组是引用类型 ...

  3. 关于微信小程序遇到的wx.request({})问题

    域名请求错误问题 当我们在编写小程序,要发送请求时,wx.request({})时或许会遇到如下的问题: 一:这是因为微信小程序的开发中,域名只能是https方式请求,所以我们必须在小程序微信公众平台 ...

  4. 放弃FreeMark?

    JAVA项目FreeMark 生产静态页面   a)    弊端                 i.          依赖后台工程师拼装页面,不利于前端.后台工作完全解耦. ii.         ...

  5. 一天搞定CSS: overflow--14

    overflow:针对超出父级的内容如何显示 代码演示 <!DOCTYPE html> <html> <head> <meta charset="U ...

  6. Javaweb---服务器Tomcat配置

    1.文件下载 Tomcat官方地址:http://tomcat.apache.org/ 2.文件解压 将下载好文件解压在你想放置的位置即可 解压后的文件: 3.进行配置 一般都要配置这两个参数: 1) ...

  7. Vulkan Tutorial 11 Shader modules

    操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Visual Studio 2017 与之前的图像API不同,Vulkan中的着色器代码必须以二进制字节码的格式使用,而不 ...

  8. python socketserver监听多端口多进程

    多进程监听多端口 # 多线程socket # 程序监听两个端口,端口逻辑相同其中一个端口放在子进程下 # 每次请求会在产生一个进程处理请求 import SocketServer from multi ...

  9. javascript基础(幼兔、小兔成兔数量等典型例题)

    一张纸的厚度是0.0001米,将纸对折,对折多少次厚度超过珠峰高度8848米var sum=0; var a=0.0001 for(var i=0;i<100;i++){ a=a*2; sum= ...

  10. Facebook开源Zstandard新型压缩算法代替Zlib 简单使用

    简介 Zstandard(缩写为Zstd)是由Facebook的Yann Collet开发的一个无损数据压缩算法.Zstandard在设计上与DEFLATE(.zip.gzip)算法有着差不多的压缩比 ...