竞态产生

Linux系统找那个存在大量的并发联系,因此会导致可能的竞态;

1. 正在运行的用户空间进程可以以多种组合方式访问我们的代码;

2. SMP系统甚至可以再不同的处理器上同时执行我们的代码;

3. 内核代码是可抢占的,因此,我们的驱动程序代码可能在任何时候丢失对处理器的独占,而拥有处理器的进程可能正在调用我们的驱动程序代码;

4. 设备中断是异步事件,也会导致代码的并发执行;

5. 内核还提供了许多可延迟代码执行的机制,比如workqueue,tasklet以及timer等,这些机制使得代码可在任何时刻执行,而不管当前进程在做什么;

6. 在现代热插拔的世界中,设备可能会在我们正使用时消失;

应对竞态

竞态通常作为对资源的共享访问结果而产生;当两个执行线程需要访问相同的数据结构或者硬件资源时,混合的可能性永远存在;因此在设计自己的驱动程序时,第一个要记住的规则是:只要可能,就应该避免资源的共享;如果没有并发的访问,也就不会有静态的产生;因此,编写内核代码应该具有最少的共享;这种思想最明显的应用就是避免使用全局变量;如果将资源放在多个执行现成都会找到的地方,就需要有足够的理由;

资源共享的硬规则

在单个执行线程之外共享硬件或者软件资源的任何时候,因为另外一个线程可能产生对资源的不一致观察,因此必须显式的管理对该资源的访问;访问管理的常见技术为“锁定”或者“互斥”,以确保一次只有一个执行现成可操作共享资源;

当内核代码创建了一个可能和其他内核部分共享的对象时,该对象必须在还有其他组件引用自己时保存存在并正常工作;这一规则产生下面的两个需求:在对象尚不能正确工作时,不能将其对内核可用,也就是说,对这类对象的应用必须得到跟踪;大多数情况下,内核会为我们处理引用计数,然而总有例外;

Linux设备驱动程序 之 并发及其管理的更多相关文章

  1. linux设备驱动程序之并发和竞态(二)

    事实上这blog都是阅读ldd3时的一些总结,巩固自己的学习.也方便后期的使用.大家也能够直接阅读ldd3原文. 锁陷阱         所谓的锁陷阱就是防止死锁.         不明白的规则:   ...

  2. linux设备驱动程序该添加哪些头文件以及驱动常用头文件介绍(转)

    原文链接:http://blog.chinaunix.net/uid-22609852-id-3506475.html 驱动常用头文件介绍 #include <linux/***.h> 是 ...

  3. Linux设备驱动程序 第三版 读书笔记(一)

    Linux设备驱动程序 第三版 读书笔记(一) Bob Zhang 2017.08.25 编写基本的Hello World模块 #include <linux/init.h> #inclu ...

  4. Linux设备驱动程序学习之分配内存

    内核为设备驱动提供了一个统一的内存管理接口,所以模块无需涉及分段和分页等问题. 我已经在第一个scull模块中使用了 kmalloc 和 kfree 来分配和释放内存空间. kmalloc 函数内幕 ...

  5. Linux设备驱动程序学习----1.设备驱动程序简介

    设备驱动程序简介 更多内容请参考Linux设备驱动程序学习----目录 1. 简介   Linux系统的优点是,系统内部实现细节对所有人都是公开的.Linux内核由大量复杂的代码组成,设备驱动程序可以 ...

  6. Linux设备驱动程序学习----2.内核模块与应用程序的对比

    内核模块与应用程序的对比 更多内容请参考Linux设备驱动程序学习----目录 1. 内核模块与应用程序的对比 内核模块和应用程序之间的不同之处: 大多数中小规模的应用程序是从头到尾执行单个任务,而模 ...

  7. linux设备驱动程序--在用户空间注册文件接口

    linux字符设备驱动程序--创建设备节点 基于4.14内核,运行在beagleBone green 在上一讲中,我们写了第一个linux设备驱动程序--hello_world,在驱动程序中,我们什么 ...

  8. linux设备驱动程序--hello-world

    linux字符设备驱动程序--hello_world 基于4.14内核, beagleBone green平台 PC端的设备驱动程序 有过电脑使用经验的人都知道,当我们将外部硬件设备比如鼠标键盘插入到 ...

  9. linux设备驱动程序-i2c(1):i2c总线的添加与实现

    linux设备驱动程序-i2c(1):i2c总线的添加与实现 (基于4.14内核版本) 在上一章节linux设备驱动程序-i2c(0)-i2c设备驱动源码实现中,我们演示了i2c设备驱动程序的源码实现 ...

随机推荐

  1. Python中,标识符用法

    Python中,标识符 在Python中,所有标识符都可以包括英文.数字和下划线(),但不能包括数字.python中的标识符区分大小写.这是知识的背景.但通常,Python成为以下划线开头的标识符的习 ...

  2. vue打包后找不到资源路径问题

    问题描述: 使用webpack打包vue项目后,前后端联调无法找到资源 解决方案: 一. 改为相对路径,去除axios中地址的第一个“/” onProxyReq: function (proxyReq ...

  3. BigDecimal与Long、int之间的相互转换

    //bigDecimal 转换成 Long类型 public static Long bigDecimalToLong(BigDecimal b){ BigDecimal c = new BigDec ...

  4. SAP CRM和C4C的内容管理(Content Management)

    SAP CRM内容管理 SAP CRM使用Attachments这个UI给用户提供内容管理的功能.通过新建按钮可以上传本地文档到CRM系统: 该内容管理支持简单的版本管理功能,用户可点击Check O ...

  5. Redis汇总

    开源项目 https://www.cnblogs.com/yswenli/p/9460527.html

  6. 理解 chroot

    什么是 chroot chroot,即 change root directory (更改 root 目录).在 linux 系统中,系统默认的目录结构都是以 `/`,即是以根 (root) 开始的. ...

  7. Hadoop_25_MapReduce实现日志清洗程序

    1.需求: 对web访问日志中的各字段识别切分,去除日志中不合法的记录,根据KPI统计需求,生成各类访问请求过滤数据 2.实现代码: a) 定义一个bean,用来记录日志数据中的各数据字段 packa ...

  8. The fastest MySQL Sandbox setup ever!

    MySQL-Sandbox 3.1.10 introduces a new utility, different from anything I have put before in the MySQ ...

  9. 自动化测试环境搭建(appium+selenium+python)

    一.需要安装的软件(根据你所需要的版本安装即可,不一定必须按照小编的版本来) JDK:1.8.0_171 Python:3.7.1 node.js:10.13.0 android-sdk_r24.4. ...

  10. 用代理服务加快brew下载速度。方法:curl

    加快brew更新速度的方式:用代理 参考: https://www.zhihu.com/question/31360766常用的ss客户端都自带PAC模式的,比如ShadowsocksX-NG. 再次 ...