热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

第7章Linux设备驱动中的并发控制之一(并发与竞态)

本章导读Linux设备驱动中必须解决的一个问题是多个进程对共享资源的并发访问,并发的访问会导致竞态(竞争状态)。Linux提供了多种解决竞态问题的方式,这些方式适合不同的应用场景。
本章导读

Linux设备驱动中必须解决的一个问题是多个进程对共享资源的并发访问,并发的访问会导致竞态(竞争状态)。

Linux提供了多种解决竞态问题的方式,这些方式适合不同的应用场景。

7.1讲解了并发和竞态的概念及发生场合。

7.2讲解了编译乱序、执行乱序的问题,以及内存屏障。

7.3~7.8分别讲解了中断屏蔽、原子操作、自旋锁、信号量和互斥体等并发控制机制。

7.1 并发与竞态

并发是多个执行单元同时、并行被执行,而并发的执行单元对共享资源(硬件资源和软件上的全局变量、静态变量等)的访问,则很容易导致竞态。例如,对于globalmem设备,假设一个执行单元A对其写入3000个字符“a”,而另一个执行单元B对其写入4000个“b”,第三个执行单元C读取globalmem的所有字符。如果执行单元A、B的写操作按图7.1顺序发生,执行单元C的读操作不会有什么问题。

第7章 Linux设备驱动中的并发控制之一(并发与竞态)

但是,如果执行单元A、B按图7.2被执行,而执行单元C又“不合时宜”(在不合适的时间作不合适的事情)地读,则会读出3000个字符“b”。

第7章 Linux设备驱动中的并发控制之一(并发与竞态)

比图7.2更复杂、更混乱的并发大量存在于设备驱动中,只要并发的多个执行单元存在对共享资源的访问,竞态就可能发生。在Linux内核中,主要的竞态发生在以下几种情况。

1.对称多处理器(SMP)的多个CPU

SMP是一种紧耦合、共享存储的系统模型,体系结构如图7.3所示,特点是多个CPU使用共同的系统总线,因此可访问共同的外设和存储器。

第7章 Linux设备驱动中的并发控制之一(并发与竞态)

在SMP的情况下,两个核(CPU0和CPU1)的竞态可能发生于CPU0的进程与CPU1的进程之间、CPU0的进程与CPU1的中断之间以及CPU0的中断与CPU1的中断之间,图7.4中任何一条线连接的两个实体都有核之间并发可能性

第7章 Linux设备驱动中的并发控制之一(并发与竞态)

2.单CPU内进程与抢占它的进程

Linux 2.6以后的内核支持内核抢占调度,一个进程在内核执行时可能耗完了自己的时间片,也可能被另一个高优先级进程打断,进程与抢占该进程的进程访问共享资源的情况类似于SMP的多个CPU。

3.中断(硬中断、软中断、Tasklet、底半部)与进程之间

中断可以打断正在执行的进程,如果中断服务程序(ISR)访问进程正在访问的资源,则也会产生竞态。

中断也有可能被新的更高优先级的中断打断,因此,多个中断之间本身也可能引起并发而导致竞态。Linux 2.6.35之后,就取消了中断的嵌套。老版本的内核可以在申请中断时,设置标记IRQF_DISABLED以避免中断嵌套,由于新内核直接就默认不嵌套中断,这个标记反而变得无用了。

上述并发的发生除了SMP是真正的并行以外,其他的都是单核上的“宏观并行,微观串行”,其引发的实质问题和SMP相似。图7.5再现了SMP情况下总的竞争状态可能性,既包含某一个核内的(CPU内部),也包括两个核之间(CPU之间)的竞态

第7章 Linux设备驱动中的并发控制之一(并发与竞态)

解决竞态问题的途径是保证对共享资源的互斥访问,互斥访问是指一个执行单元(进程)在访问共享资源时,其他的执行单元(进程)被禁止访问。

访问共享资源的代码区域称为临界区(Critical Sections),临界区需要被以某种互斥机制加以保护

中断屏蔽、原子操作、自旋锁、信号量、互斥锁、完成量是Linux设备驱动中可以采用的互斥途径



推荐阅读
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • Python 异步编程:深入理解 asyncio 库(上)
    本文介绍了 Python 3.4 版本引入的标准库 asyncio,该库为异步 IO 提供了强大的支持。我们将探讨为什么需要 asyncio,以及它如何简化并发编程的复杂性,并详细介绍其核心概念和使用方法。 ... [详细]
  • 本文总结了2018年的关键成就,包括职业变动、购车、考取驾照等重要事件,并分享了读书、工作、家庭和朋友方面的感悟。同时,展望2019年,制定了健康、软实力提升和技术学习的具体目标。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • CentOS7源码编译安装MySQL5.6
    2019独角兽企业重金招聘Python工程师标准一、先在cmake官网下个最新的cmake源码包cmake官网:https:www.cmake.org如此时最新 ... [详细]
  • 解决Linux系统中pygraphviz安装问题
    本文探讨了在Linux环境下安装pygraphviz时遇到的常见问题,并提供了详细的解决方案和最佳实践。 ... [详细]
  • 数据库内核开发入门 | 搭建研发环境的初步指南
    本课程将带你从零开始,逐步掌握数据库内核开发的基础知识和实践技能,重点介绍如何搭建OceanBase的开发环境。 ... [详细]
  • 解决PHP与MySQL连接时出现500错误的方法
    本文详细探讨了当使用PHP连接MySQL数据库时遇到500内部服务器错误的多种解决方案,提供了详尽的操作步骤和专业建议。无论是初学者还是有经验的开发者,都能从中受益。 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • 本文详细探讨了Netty中Future及其子类的设计与实现,包括其在并发编程中的作用和具体应用场景。我们将介绍Future的继承体系、关键方法的实现细节,并讨论如何通过监听器和回调机制来处理异步任务的结果。 ... [详细]
  • 本文详细介绍了如何使用PHP检测AJAX请求,通过分析预定义服务器变量来判断请求是否来自XMLHttpRequest。此方法简单实用,适用于各种Web开发场景。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 通过与阿里云的合作,牛客网成功解决了跨国视频面试中的网络卡顿问题,为求职者和面试官提供了更加流畅的沟通体验。 ... [详细]
author-avatar
ls
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有