并发与竞争(一)概念

什么是并发与并行

三个概念:

  • 并行
  • 并发
  • 并发加并行

并发

下面这张图描述的是单核CPU的“并发”这个概念:
在这里插入图片描述

  • 在这颗单核CPU上运行着任务一和任务二,我们人会感觉任务一和任务二是在同时进行的,单核CPU在一个时间片轮内只能执行一个任务。由于CPU的切换时间非常地快,所以会给人感觉似乎任务一和任务二在同时执行。

并行

在这里插入图片描述

  • 这颗芯片是双核CPU,一个CPU上跑一个任务,在同一时刻在这颗芯片上能同时跑两个任务,这就是并行。
  • 可以将并行看做事并发的理想状态。

并行加并发

在这里插入图片描述

  • 这个芯片上有两个CPU,每个CPU往往不会只执行一个任务,一般它会执行多个任务;

什么是并发与竞争

并发会造成多个程序同时访问一个共享资源,这时候由并发同时访问一个共享资源而产生的问题就是竞争。

Linux是一个多任务的操作系统,并发和竞争在Linux中非常的常见。所以在编写Linux驱动的过程中就要考虑并发与竞争。否则在访问共享资源的时候容易出问题,而这些问题往往不容易排查,很难定位。

如果不处理并发会发生什么事情?

这里讨论的是内核空间中的并发,用户空间中的并发不讨论,现在有两个相同的驱动程序A和B,这两个驱动程序并发执行,并且它们都要修改变量c。

  • 情况一:程序A先运行,程序A运行完再运行程序B,这种情况是理想情况。程序A和程序B完美运行,没有错误。
  • 情况二:程序A运行了一半,内核调度让程序B执行,程序B执行完毕以后再回来执行程序A。但是程序A执行完以后,程序B是不是就相当于什么也没有做呢?变量c的值还是程序A的值。

情况一是理想情况,但是我们根本无法预料到程序A和程序B到底是怎么运行的。如果不对共享资源进行保护,轻则程序白白运行一次,重则系统崩溃。

Linux在什么情况下会造成并发?

主要有以下几种情况:

  1. 中断程序并发访问。中断是可以随时产生的,一旦产生中断,就会放下手头的工作,去执行中断中的任务,如果在执行中断中的任务的时候修改了共享资源,就会产生刚才说的问题了。
  2. 抢占式并发访问。在Linux内核2.6以后,Linux内核支持了抢占,在支持抢占的情况下,正在执行的进程随时都有可能被抢占。
  3. 多处理器(SMP)并发访问。多核处理器之间存在核间并发访问。

在发生并发时要保护什么?

进程(运行起来的程序就是进程)并发访问共享资源是不安全的,如果两个进程同时访问空间资源,就是发生竞争。所以我们要保护共享资源。

从代码的角度看,共享资源就是某个整形的全局变量,或者驱动中的设备结构体。等等。

并发和竞争的处理办法

在编写驱动程序的时候,我们要尽量避免让驱动程序存在并发和竞争,Linux内核提供了几种并发和竞争的方法,分别是:原子操作,自旋锁,信号量,互斥体。

猜你喜欢

转载自blog.csdn.net/qq_28877125/article/details/128209995