LV10-04-并发与竞争-01-并发与竞争简介

本文主要是并发与竞争简介的相关笔记,若笔记中有错误或者不合适的地方,欢迎批评指正😃。

点击查看使用工具及版本
Windows windows11
Ubuntu Ubuntu16.04的64位版本
VMware® Workstation 16 Pro 16.2.3 build-19376536
SecureCRT Version 8.7.2 (x64 build 2214) - 正式版-2020年5月14日
Linux开发板 华清远见 底板: FS4412_DEV_V5 核心板: FS4412 V2
u-boot 2013.01
点击查看本文参考资料
参考方向 参考原文
------
点击查看相关文件下载
文件下载链接
------

Linux是一个多任务操作系统,肯定会存在多个任务共同操作同一段内存或者设备的情况,多个任务甚至中断都能访问的资源叫做共享资源。在驱动开发中要注意对共享资源的保护,也就是要处理对共享资源的并发访问

一、并发与竞争简介

并发就是多个“用户”同时访问同一个共享资源。 Linux 系统是个多任务操作系统,会存在多个任务同时访问同一片内存区域,这些任务可能会相互覆盖这段内存中的数据,造成内存数据混乱。针对这个问题必须要做处理,严重的话可能会导致系统崩溃。

现在的 Linux 系统并发产生的原因很复杂,大概几个主要原因:

  • 多线程并发访问, Linux 是多任务(线程)的系统,所以多线程访问是最基本的原因。
  • 抢占式并发访问,从 2.6 版本内核开始, Linux 内核支持抢占,也就是说调度程序可以在任意时刻抢占正在运行的线程,从而运行其他的线程。
  • 中断程序并发访问,硬件中断的权利是很大的。
  • SMP(多核)核间并发访问,现在 ARM 架构的多核 SOC 很常见,多核 CPU 存在核间并发访问。

并发访问带来的问题就是竞争,多任务并行执行时,如果在一个时刻同时操作同一个资源,会引起资源的错乱。之前使用UCOSIII的时候了解过临界区这个概念,所谓的临界区就是操作共享资源的代码段,对于临界区必须保证一次只有一个线程访问,也就是要保证临界区是原子访问的。

这里的原子访问就表示这一个访问是一个步骤,不能再进行拆分。如果多个线程同时操作临界区就表示存在竞争,我们在编写驱动的时候一定要注意避免并发和防止竞争访问。

二、解决竞争

1. 处理竞争的方式

既然竞争存在巨大的隐患,那就需要解决它啦,大概有以下几种并发控制机制用于处理竞争:

  • 中断屏蔽

中断屏蔽是一种同步机制的辅助手段,适用于中断上下文与某任务共享资源时,或多个不同优先级的中断上下文间共享资源时

  • 原子变量

原子变量就是存取不可被打断的特殊整型变量,适用于共享资源为单个整型变量的互斥场合。

  • 自旋锁

自旋锁是一种基于忙等待的并发控制机制,它适用于以下场合:

(1)异常上下文之间或异常上下文与任务上下文之间共享资源时;

(2)任务上下文之间且临界区执行时间很短时;

(3)互斥问题。

  • 互斥锁

是一种基于阻塞的互斥机制,适用于任务上下文之间且临界区执行时间较长时的互斥问题。

  • 信号量

是一种基于阻塞的并发控制机制,适用于任务上下文之间且临界区执行时间较长时的互斥或同步问题

2. 选取原则

  • 不允许睡眠的上下文需要采用忙等待类,可以睡眠的上下文可以采用阻塞类。在异常上下文中访问的竞争资源一定采用忙等待类。
  • 临界区操作较长的应用建议采用阻塞类,临界区很短的操作建议采用忙等待类。
  • 中断屏蔽仅在有与中断上下文共享资源时使用。
  • 共享资源仅是一个简单整型量时用原子变量、