《驱动学习 - 同步互斥阻塞》

1.同步互斥阻塞的概念

并发与竞态:

  并发(concurrency)指的是多个执行单元同时、并行被执行,而并发的执行单元对共享资源(硬件资源和软件上的全局变量、静态变量等)的访问则很容易导致竞态(race conditions)。

在linux中,主要的竞态发生在如下几种情况:

  1、对称多处理器(SMP)多个CPU                特点是多个CPU使用共同的系统总线,因此可访问共同的外设和存储器。

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

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

  只要并发的多个执行单元存在对共享资源的访问,竞态就有可能发生。

  如果中断处理程序访问进程正在访问的资源,则竞态也会会发生。

  多个中断之间本身也可能引起并发而导致竞态(中断被更高优先级的中断打断)。 

  

解决竞态问题的途径:

  是保证对共享资源的互斥访问,所谓互斥访问就是指一个执行单元在访问共享资源的时候,其他的执行单元都被禁止访问。 

  访问共享资源的代码区域被称为临界区,临界区需要以某种互斥机制加以保护,如:中断屏蔽,原子操作,自旋锁,和信号量都是linux设备驱动中可采用的互斥途径。 

临界区和竞争条件:

  所谓临界区(critical regions)就是访问和操作共享数据的代码段,为了避免在临界区中并发访问,编程者必须保证这些代码原子地执行——也就是说,代码在执行结束前不可被打断,就如同整个临界区是一个不可分割的指令一样,如果两个执行线程有可能处于同一个临界区中,那么就是程序包含一个bug,如果这种情况发生了,我们就称之为竞争条件(race conditions),避免并发和防止竞争条件被称为同步。 

猜你喜欢

转载自www.cnblogs.com/zhuangquan/p/11645862.html