一、参考博客
Linux中的rwlock和seqlock - 知乎 (zhihu.com)
二、基本概念
1、临界资源
临界资源是一次仅允许一个进程使用的共享资源。
2、临界区
每个进程中访问临界资源的那段代码称为临界区(criticalsection)。
3、并发、竞态
并发(Concurrency)指的是多个执行单元同时、并行被执行,而并发的执行单元对共享资源(硬件资源和软件上的全局变量、静态变量等)的访问则很容易导致竞态(RaceConditions)。
竞态形成的三个条件:
-
必须有多个执行单元
-
必须有共享资源
-
必须同时访问
4、SMP
SMP是一种紧耦合、共享存储的系统模型,它的特点是多个CPU使用共同的系统总线,因此可访问共同的外设和储存器。
二、Linux内核产生竞态情况
1、多核(多个CPU,简称SMP) ,多核CPU是共享内存,闪存,GPIO等临界资源。
2、同一个CPU上的进程与进程之前的抢占。
3、中断和进程(中断的优先级高于进程):硬件中断和进程,软中断和进程。
4、中断和中断(硬件中断优先级高于软中断):硬件中断和软中断,软中断和软中断。
三、Linux内核竞态解决方案
-
原子操作(atomic)
-
自旋锁(spinlock)
-
读写锁(rwlock)
-
顺序锁(seqlock)
-
信号量(semaphore)
-
互斥体(mutex)
-
Read-Copy Update(RCU)