Linux驱动开发——并发和竞态(概念介绍①)

简介: Linux驱动开发——并发和竞态(概念介绍①)

文章目录

Linux内核并发和竞态

案例一:

案例二:

分析

相关概念

Linux内核解决竞态引起的异常(漏洞)的方法


Linux内核并发和竞态

案例一:

前面就发现了在Linux内核中使用全局变量或者多线程可能同时访问的区域会遇到竞态的问题,比如前面的定时器使用的实现部分就发生了并发问题。Linux驱动开发——定时器

造成这样的原因是因为当我们按下按键的时候会操作多次按键中断触发,而在按键中断处理函数中会对一个全局变量mytimer_value进行自增或者自减,由于我们使用的板子是多核CPU的,所以当几乎同时的两次中断触发发生时,可能会有两个CPU核同时对按键中断进行处理,而他们在取得这个全局变量的时候值如果相同,在经过判断后都进行了自增或者自减,那么就相当于一次进行了两次自增或者自减。对应多次触发中断处理这个现象不是什么问题,但是我们在处理中添加了数值增减的范围,那么在并发的时候我们的这个判读就没有任何作用了。最终导致我们设置1到10的范围却发现能够将mytimer_value这个变量的值在这样的判断下加到11、降到0。这还是很严重的问题。


案例二:

如果让CPU通过某个GPIO给LCD显示屏发送一个固定周期(10ms)的高低电平(高电平5ms,低电平5ms)

20191230220643986.png

实现过程,软件编程如下:


void lcd_config(void)
 {
  //拉高
  gpio_set_value(PAD_GPIO_B+8, 1);
  //让高电平持续5ms
  mdelay(5);
  //拉低
  gpio_set_value(PAG_GPIO_B+8, 0);
  //让低电平持续5ms
  mdelay(5);
 }


但是,此代码运行以后,通过示波器抓取波形,测量这周的时间要大于10ms。


分析问题产生的原因:


  • 假如是某个进程来调用此函数配置高低电平,如果当这个进程刚拉高电平(还没有执行mdelay),此时此刻来了一个高优先级的进程,或者来一个中断,会将这个进程的CPU资源抢走,CPU资源进行切换执行处理别的高优先级的进程或者中断而这个执行过程中,GPIOB8还是持续为高电平,当CPU处理完高优先级的进程或者中断返回以后在执行mdelay,最终造成高电平的持续时间势必大于5ms,整个周期势必超时10ms。

分析

通过以上两个案例,我们能够得出结论

在Linux内核中,产生以上类似漏洞的四种情形:


  1. 多核(多个CPU,简称SMP) ,多核CPU是共享内存,闪存,GPIO等硬件资源。
  2. 同一个CPU上的进程与进程之前的抢占。
  3. 中断和进程(中断的优先级高于进程):硬件中断和进程,软中断和进程。
  4. 中断和中断(硬件中断优先级高于软中断):硬件中断和软中断,软中断和软中断。
  5. 20191230220705186.png

相关概念

并发: 多个执行单元(进程或中断)同时发送。


竞态: 多个执行单元对共享资源的同时访问形成竞争的状态(必须具备以下三个条件):


  • 必须有多个执行单元。
  • 必须有共享资源。
  • 必须同时访问。

共享资源: 软件上的全局变量或者硬件资源。


临界区: 对共享资源访问的区域。


互斥访问: 当一个执行单元在访问临界区时,其他执行单元禁止访问临界区,直到访问临界区的当前任务访问完毕。


执行路径具有原子性: 当某个任务获取到CPU资源踏踏实实访问临界区时(共享资源),不允许发生CPU资源的切换,要保证这个任务能够顺利访问临界区,而其他任务等待。


Linux内核解决竞态引起的异常(漏洞)的方法

总共有四种方式:


  • 中断屏蔽。
  • 自旋锁。
  • 信号量。
  • 原子操作。

相关文章
|
12天前
|
缓存 Linux 开发者
Linux内核中的并发控制机制:深入理解与应用####
【10月更文挑战第21天】 本文旨在为读者提供一个全面的指南,探讨Linux操作系统中用于实现多线程和进程间同步的关键技术——并发控制机制。通过剖析互斥锁、自旋锁、读写锁等核心概念及其在实际场景中的应用,本文将帮助开发者更好地理解和运用这些工具来构建高效且稳定的应用程序。 ####
32 5
|
15天前
|
Linux 数据库
Linux内核中的锁机制:保障并发操作的数据一致性####
【10月更文挑战第29天】 在多线程编程中,确保数据一致性和防止竞争条件是至关重要的。本文将深入探讨Linux操作系统中实现的几种关键锁机制,包括自旋锁、互斥锁和读写锁等。通过分析这些锁的设计原理和使用场景,帮助读者理解如何在实际应用中选择合适的锁机制以优化系统性能和稳定性。 ####
33 6
|
1月前
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
90 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
1月前
|
Ubuntu Java Linux
Linux操作系统——概念扫盲I
Linux操作系统——概念扫盲I
44 4
|
2月前
|
存储 Linux 开发工具
如何进行Linux内核开发【ChatGPT】
如何进行Linux内核开发【ChatGPT】
|
3月前
|
Java Linux API
Linux设备驱动开发详解2
Linux设备驱动开发详解
44 6
|
3月前
|
消息中间件 算法 Unix
Linux设备驱动开发详解1
Linux设备驱动开发详解
50 5
|
3月前
|
网络协议 Linux
在Linux中,如何查看 http 的并发请求数与其 TCP 连接状态?
在Linux中,如何查看 http 的并发请求数与其 TCP 连接状态?
|
9天前
|
监控 Linux
如何检查 Linux 内存使用量是否耗尽?这 5 个命令堪称绝了!
本文介绍了在Linux系统中检查内存使用情况的5个常用命令:`free`、`top`、`vmstat`、`pidstat` 和 `/proc/meminfo` 文件,帮助用户准确监控内存状态,确保系统稳定运行。
79 6
下一篇
无影云桌面