一、什么是并发与竞争?
并发:多个“用户”同时访问一个共享的内存。
竞争:多个“用户”同时访问一段共享的内存并对其修改,就会造成数据混乱,甚至程序崩溃,这就是竞争。
二、造成Linux系统产生并发的原因是什么呢?
(1)多任务(线程)并发访问
(2)抢占式并发访问
(3)中断程序并发访问
(4)SMP(多核)核间并发访问
三、什么是同步?
显然,我们不希望这种情况发生,就有了对临界资源的保护,让每个时间只能有一个进程/线程访问,甚至有序访问,这就叫同步。
同步的手段有多种,比如:自旋锁、信号量、互斥量等等。
四、共享资源(临界资源)?
在多任务的工作模式下有多个执行单位,它们通常可以拥有一段共享空间(比如全局变量、共享内存等等)。
所以要对共享资源进行保护,某个线程局部变量不需要保护,要保护的是多个线程都会访问的共享数据。如:全局变量,设备结构体成员。
避免并发与竞争的操作:
1.原子操作
原子,在早接触到是在化学概念中。原子指化学反应不可再分的基本微粒。同样的,在内核中所说的原子操作表示这一个访问是一个步骤,必须一次性执行完,不能被打断,不能再进行拆分。例如,在多线程访问中,我们的线程一对a进行赋值操作,,线程二也对a进行赋值操作,我们理想的执行顺序是线程一先执行,线程二再执行。但是很有可能在线程一执行的时候被其他操作打断,使得线程一最后的执行结果变为。要解决这个问题,必须保证我们的线程一在对数据访问的过程中不能被其他的操作打断,一次性执行完成。
对于基本的赋值操作比如a=1;在内核里面的步骤为:
ldr r0, =0X30000000 // 变量 a 地址
ldr r1, = 3 // 要写入的值
str r1, [r0] // 将 3 写入到 a 变量中
因为一个简单的赋值