序言
在前面,我们介绍了常用两种内核同步技术:自旋锁和信号量。这里我们接着介绍其他的内核同步技术。
内核同步技术
前面我们提到,信号量是基于原子操作的,它的信号初始值count是一个原子类型,下面我们就对它做详细的介绍,同时我们还会讲解其他的内核同步技术。
- 原子操作
原子操作是内核中比较低级的同步操作接口,它保证指令以“原子”的方式执行而不能被打断。内核中提供了两种原子操作接口,一种是原子整数操作,一种是原子位操作。
- 原子整数操作
原子整数操作只能操作atomic_t类型的整数数据。你也许会问为什么不是C语言里的int变量呢?在回答这个问题之前,我们先来看看它是如何定义的。atomic_t数据类型定义在<asm/atomic.h>头文件中:
// 大多数平台定义(ARM、MIPS,...) |
原子操作的实现都是平台相关的,直接使用系统提供的汇编语言来实现,因此使用 atomic_t数据类型可以屏蔽系统平台的差异性。另一点使用atomic_t的原因是可以阻止编译器对变量访问的优化处理(如使用别名或临时变量)。最后使用atomic_t可以确认我们不会把原子变量使用到非原子操作函数中,反之亦然。另一点需要说明原子操作只能保证操作是原子的,要么完成,要么不完成,不会有操作一半的可能,但原子操作并不能保证操作的顺序性,即它不能保证两个操作是按某个顺序完成的。如果要保证原子操作的顺序性,请使用内存屏障指令。在下一小节你就会看到内存屏障技术。
我们先来看一个使用原子操作的一个例子,我们有一个数据data,因为有多个进程在使用它,因此对它的访问必须是原子的,要么完成,要么不完成,而不会操作一半。我们使用原子操作来实现它:
我们先来看一个使用原子操作的一个例子,我们有一个数据data,因为有多个进程在使用它,因此对它的访问必须是原子的,要么完成,要么不完成,而不会操作一半。我们使用原子操作来实现它:
#include <asm/atomic.h> |
原子整数操作的完整函数列表如下: