并发:

多个执行单元同时被执行.

竞态:

并发的执行单元对资源 ( 硬件资源和软件上的全局变量等 ) 的访问导致的竞争状态.

并发的处理:

处理并发的常用技术是加锁或者互斥,即保证在任何时间只有一个执行单元可以操作共享资源.

在 Linux 内核中主要通过 semaphore 机制 (信号量)和spin_lock 机制 (自旋锁)实现.

原子操作:

定义:

原子操作指的是在执行过程中不会被别的代码所中断的操作.

分为 位 和 整型变量 两类原子操作。

atomic_t  :

  1. typedef struct {
  2. volatile int counter;
  3. } atomic_t;

原子操作函数:

整型原子操作:

  1. void atomic_set(atomic_t *v, int i);   //设置原子变量v的值为i
  2. atomic_t v = ATOMIC_INIT(0);            //定义原子变量v, 并初始化为0  **************************
  3. atomic_read(atomic_t *v);              //获得原子变量的值,返回原子变量的值
  4. void atomic_add(int i, atomic_t *v);    //原子变量+i
  5. void atomic_sub(int i, atomic_t *v);    //原子变量-i
  6. void atomic_inc(atomic_t *v);           //原子变量+1            *******************************
  7. void atomic_dec(atomic_t *v);           //原子变量-1

对原子变量执行自增,自减和减操作后 ,测试其是否为0,为 0 则返回 true,否则返回 false :

  1. int atomic_inc_and_test(atomic_t *v);
  2. int atomic_dec_and_test(atomic_t *v);              ***********************
  3. int atomic_sub_and_test(int i, atomic_t *v);

对原子变量进行加/减,自增/自减操作,并返回新的值:

  1. int atomic_add_return(int i, atomic_t *v);
  2. int atomic_sub_return(int i, atomic_t *v);
  3. int atomic_inc_return(atomic_t *v);
  4. int atomic_sub_return(atomic_t *v);

位原子操作:

  1. void set_bit(nr, void *addr);    //将addr地址的nr位 置为1
  2. void clear_bit(nr, void *addr);  //将addr地址的nr位 清0
  3. void change_bit(nr, void *addr);  //对addr地址的nr位 反置
  4. int test_bit(nr, void *addr);    //返回addr地址的nr位
  5. int test_and_set_bit(nr, void *addr);
  6. int test_and_clear_bit(nr, void *addr);
  7. int test_and_change_bit(nr, void *addr);
  8. 先设值,后返回。

实例 --- 原子操作:

1,定义一原子变量:

在程序开头定义原子变量,初始化为 1 :

  1. static atomic_t canopen = ATOMIC_INIT(1);     //定义原子变量并初始化为1

2,在 open 函数里检测原子变量值:

如果减 一 为 0 , !true 为 假 ,if 里面的原子变量加一恢复到  0

  • {
  • atomic_inc(&canopen);
  • return -EBUSY;
  • }

3,在退出时 close 函数 恢复原子变量值:

最后, 在应用程序退出时 close 函数, 自增 恢复原子变量值为 1:

  1. atomic_inc(&canopen);

4,应用程序测试:

在应用程序里面打开驱动程序:

  1. fd = open("/dev/buttons", O_RDWR);
  2. if (fd < 0)
  3. {
  4. printf("can't open!\n");
  5. return -1;
  6. }

当有两个应用程序打开同一这个驱动的时候,打印 can't open! .

Linux 设备驱动--- 并发 与 竞态 --- atomic_t --- atomic_dec_and_test --- 原子操作的更多相关文章

  1. Linux内核中的并发与竞态概述

    1.前言 众所周知,Linux系统是一个多任务的操作系统,当多个任务同时访问同一片内存区域的时候,这些任务可能会相互覆盖内存中数据,从而造成内存中的数据混乱,问题严重的话,还可能会导致系统崩溃. 2. ...

  2. linux设备驱动归纳总结(四):5.多处理器下的竞态和并发【转】

    本文转载自:http://blog.chinaunix.net/uid-25014876-id-67673.html linux设备驱动归纳总结(四):5.多处理器下的竞态和并发 xxxxxxxxxx ...

  3. 【Linux开发】linux设备驱动归纳总结(四):5.多处理器下的竞态和并发

    linux设备驱动归纳总结(四):5.多处理器下的竞态和并发 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...

  4. linux设备驱动归纳总结(四):4.单处理器下的竞态和并发【转】

    本文转载自:http://blog.chinaunix.net/uid-25014876-id-67005.html linux设备驱动归纳总结(四):4.单处理器下的竞态和并发 xxxxxxxxxx ...

  5. 【Linux开发】linux设备驱动归纳总结(四):4.单处理器下的竞态和并发

    linux设备驱动归纳总结(四):4.单处理器下的竞态和并发 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...

  6. linux设备驱动第五篇:驱动中的并发与竟态

    综述 在上一篇介绍了linux驱动的调试方法,这一篇介绍一下在驱动编程中会遇到的并发和竟态以及如何处理并发和竞争. 首先什么是并发与竟态呢?并发(concurrency)指的是多个执行单元同时.并行被 ...

  7. 《Linux 设备驱动程序》读后感。 并发,竞态,死锁。

    1. 概念 并发:在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行. 来源: 1. Linux ...

  8. Linux内核分析(七)----并发与竞态

    原文:Linux内核分析(七)----并发与竞态 Linux内核分析(七) 这两天家里的事好多,我们今天继续接着上一次的内容学习,上次我们完善了字符设备控制方法,并深入分析了系统调用的实质,今天我们主 ...

  9. 漫画|Linux 并发、竞态、互斥锁、自旋锁、信号量都是什么鬼?(转)

    知乎链接:https://zhuanlan.zhihu.com/p/57354304 1. 锁的由来? 学习linux的时候,肯定会遇到各种和锁相关的知识,有时候自己学好了一点,感觉半桶水的自己已经可 ...

随机推荐

  1. Commons CLI 学习(1)

    The Apache Commons CLI library provides an API for parsing command line options passed to programs. ...

  2. scp命令详解—跨服务器复制文件

    scp在跨机器复制的时候为了提高数据的安全性,使用了ssh连接和加密方式,如果机器之间配置了ssh免密码登录,那在使用scp的时候密码都不用输入. 在服务器104.238.161.75上操作,将服务器 ...

  3. R语言平均值和加权平均值

    > a=c(,,) > mean(a) #平均值 [] > wt=c(,,) > weighted.mean(a,wt) #加权平均值 []

  4. (error) DENIED Redis is running in protected mode because protected mode is enabled

    在通过Java程序链接配置好的redis服务时出现 DENIED Redis is running in protected mode because protected mode is enable ...

  5. 一:Ionic Framework初体验

    因项目关系,需要开发一个平板使用的应用程序,刚开始以为需要使用Andriod,后来经理提供了一个解决方案,Ionic Framework https://ionicframework.com/ 第一步 ...

  6. KMS使用CLion作为IDE来调试

    KMS使用CLion作为IDE来调试,打开kms相应模块的目录,CLion自动识别相应的CMakeLists.txt. 然而会make失败,经搜索,看到Clion使用的自带的cmake,因此系统中安装 ...

  7. PTA L2-006 树的遍历-二叉树的后序遍历+中序遍历,输出层序遍历 团体程序设计天梯赛-练习集

    L2-006 树的遍历(25 分)   给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列.这里假设键值都是互不相等的正整数. 输入格式: 输入第一行给出一个正整数N(≤),是二叉树中结点的 ...

  8. POJ1845 Sumdiv [数论,逆元]

    题目传送门 Sumdiv Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 26041   Accepted: 6430 Des ...

  9. 中国石油大学(华东)暑期集训--二进制(BZOJ5294)【线段树】

    问题 C: 二进制 时间限制: 1 Sec  内存限制: 128 MB提交: 8  解决: 2[提交] [状态] [讨论版] [命题人:] 题目描述 pupil发现对于一个十进制数,无论怎么将其的数字 ...

  10. 【Tempest】openstack自动化测试组件tempest及自动化测试工具nose

    宝宝心里苦,但是宝宝只能在这穷乡僻壤说,下周又要开组会必须得干点事了.这次是做论文中的实验部分,主要利用到了openstack中的自动化测试组件Tempest,具体原因不细说了. 安装 分两种安装方法 ...