并发指多个执行单元同时并行的执行,并发的执行单元对共享资源,如硬件资源,软件上的全局变量,静态变量等的访问则很容易导致竞态。 例如,对于前面的globalmem驱动设备,如果执行单元A对其写入3000个A,执行单元B对其写入3000个B,执行单元C则读取globalmem所有的字符。这时,执行单元C所读取的值是3000个A?或是3000个B?又或是存在一些A,也存在一些B? 当然这里只是一个简单的例子,在linux内核中实际存在的并发现象比这个要复杂得多。以下几种情况是竞态产生的主要原因: 一:对称多处理器(SMP)的多个CPU exynos4412就是一个典型的对称多处理器,它具有4个独立的CPU。这些CPU共同使用系统总线,可以访问共同的外设和存储器。 二:单CPU的多个进程 当一个进程在执行的时候,很有可能被优先级更高的进程所打断,这时将涉及到多个进程间的抢占与调度问题。 三:中断 中断允许打断正在执行的进程,如果中断处理程序访问了正在执行的进程,则会引起竞态问题。中断本身也有可能被更高优先级的中断所打断,多个中断之间也可能引起竞态。 解决竞态问题的途径是保证对共享资源的互斥访问。即一个执行单元在访问共享资源的时候,其他执行单元被禁止访问。访问共享资源的代码区域叫做临界区,它需要使用某种互斥机制加以保护。中断屏蔽,原子操作,自旋锁,信号量等是linux设备驱动经常采用的互斥途径。
|