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. 关于jQuery插件imgAreaSelect基础讲解

    关于ImgAreaSelect,  是一jQuery插件,它支持用户通过鼠标拖曳选择图片的一部分,如图片拖曳.图片编辑等~~来具体看一下 1.先下载imgAreaSelect插件 下载地址: 英文:h ...

  2. http协议中:GET/POST/PUT/DELETE/TRACE/OPTIONS/HEAD方法

    ###1 HTTP/1.1协议中共定义了八种方法(有时也叫"动作")来表明Request-URI指定的资源的不同操作方式: OPTIONS 返回服务器针对特定资源所支持的HTTP请 ...

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

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

  4. 《JAVA与模式》之命令模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述命令(Command)模式的: 命令模式属于对象的行为模式.命令模式又称为行动(Action)模式或交易(Transaction)模式. ...

  5. Java类加载器详解

    title: Java类加载器详解date: 2015-10-20 18:16:52tags: JVM--- ## JVM三种类型的类加载器- 我们首先看一下JVM预定义的三种类型类加载器,当一个 J ...

  6. 论文笔记 Spatial contrasting for deep unsupervised learning

    在我们设计无监督学习模型时,应尽量做到 网络结构与有监督模型兼容 有效利用有监督模型的基本模块,如dropout.relu等 无监督学习的目标是为有监督模型提供初始化的参数,理想情况是"这些 ...

  7. Coursera 机器学习笔记(一)

    主要是第一二周内容 机器学习概要 机器学习是什么? 生活在信息时代的我们,其实时时刻刻都离不开机器学习算法.比如日常使用的搜索引擎就涉及到很多学习算法. Arthur Samuel 给出第一个定义.他 ...

  8. D语言需要大公司支持

    Facebook开源flint:一个用D语言编写的C++静态代码分析器 http://www.csdn.net/article/2014-02-27/2818565-Building-and-open ...

  9. redis 对象

    redis通过前面几篇的数据结构构键了一个对象系统,这个对象系统包含了字符串对象,列表对象,哈希对象,集合对象,有序集合对象 每一个对象都是一个redisobject typedef struct r ...

  10. mysql 修改表结构的字段名

    alter table domains  change STATUS  status  tinyint(1)  not null;