1、前言
众所周知,Linux系统是一个多任务的操作系统,当多个任务同时访问同一片内存区域的时候,这些任务可能会相互覆盖内存中数据,从而造成内存中的数据混乱,问题严重的话,还可能会导致系统崩溃。
2、相关概念
了解一下Linux内核中并发与竞态的相关概念,如下:
并发与竞争:并发指的是多个执行单元同时、并行地执行,当并发的执行单元对共享资源(硬件资源和软件上的全局变量、静态变量等)的访问则很容易导致竞态现象。
临界区:访问共享资源的代码区叫做临界区。
SMP:对称多处理器。
3、竞态产生原因及处理
在Linux系统中,并发与竞态产生的原因非常复杂,主要有下面几个原因:
(1)对称多处理器(SMP)的多个CPU
SMP是一种紧耦合、共享存储的系统模型,特点是多个CPU使用共同的系统总线,结构如下:
在SMP的情况下,两个核(CPU0和CPU1)可能会发生如下的并发竞态现象:
(2)单CPU内进程与抢占它的进程
在2.6版本以后的Linux内核开始支持内核抢占调度,当一个进程在内核执行的时候可能耗完了时间片,也可能被另外一个更高优先级的进程打断,进程与抢占它的进程访问共享资源也可能引发竞态现象。
(3)中断(硬中断、软中断、Tasklet、底半部)与进程之间
中断可以打断正在执行的进程,当中断服务程序访问进程正在访问的资源,则竞态现象也有可能会发生,另外,中断也有可能会被更高的优先级中断打断,多个中之间并发访问共享资源也可能引起竞态现象。
SMP中核内与核间产生竞态现象:
在Linux内核中,解决竞态问题的途径是保证对共享资源的互斥访问,当一个执行单元在访问共享资源的时候,其它的执行单元被禁止访问,临界区需要被以某种互斥机制加以保护,在Linux设备驱动中可以采用的互斥途径有中断屏蔽、原子操作、自旋锁、信号量和互斥锁等。
4、小结
本文主要对Linux内核中的并发与竞态现象进行概述,并给出了与其相关的一些概念和竞态现象产生的原因和解决途径。