什么是并发与竞争
并发会造成多个程序同时访问一个共享资源,这时候由并发同时访问一个共享资源而产生的问题就是竞争。比如A和B要打电话,但是公共电话只有一部。A和B要打电话就是并行,谁先打电话就是竞争,所以电话就是共享资源。
Linux是一个多任务的操作系统,并发和竞争在Linux中常的常见。所以在编写Linux驱动的过程中就要考虑并发与竞争。否则在访问共享资源的时候容易出问题,而这些问题往往小容易排查,很难定位。
如果不处理并发后果
这里我们讨论的是内核空间中的并发,用户空间中的并发不讨论,现在有俩个相同的驱动程序A和B,这俩个驱动程序并发执行,并且他们都要修改变量c。
情况1:
程序A先运行,程序A运行完在运行程序B,这种情况是理想情况。程序A和程序B完美运行,没有错误。
情况2:
程序A运行了一半,内核调度让程序B执行,程序B执行完以后在回来来执行程序A。但是程序A执行完以后,程序B是不是就相当于什么也没有做呢,变量c的值是程序A的值。
情况1是理想情况,但是我们根本无法预料到程序A和程序B到底是怎么运行的。如果不对共享资源进行保护。轻则程序白白运行一次,重则系统崩溃。
Linux造成并发情况
主要有以下几种情况:
- (1)中断程序并发访问。中断是可以随时产生的,一旦产生中断,就会放下手头的工作,去执行中断中的任务,如果在执行中断中的任务的时候修改了共享资源,就会产生刚才我们讲的问题。
- (2)抢占式并发访问。在Linux内核2.6版本以后,Linux内核支持了抢占,在支持抢占的情况下,正在执行的进程随时都有可能被抢占。
- (3)多处理器(SMP)并发访问。多核处理器之间存在核间并发访问。
发生并发要保护什么
进程(运行起来的程序就是进程)并发访问共享资源是不安全的,如果俩个进程同时访问空间资源,就是发生竞争。所以我们要保护共享资源,什么是共享资源呢?放在现实生活中,共享资源可以是在第一张幻灯片中提到的公共电话,也可以是我们日常生活中的共享单车,共享充电宝等。这些都是共享资源。
放在代码中,共享资源就是某个整形的全局变量,或者驱动中的设番结构体。当然!其他的数据也可能是共享数据,这个就要根据实际的驱动程序来实际分析了。