内核同步技术二

序言
在前面,我们介绍了常用两种内核同步技术:自旋锁和信号量。这里我们接着介绍其他的内核同步技术。

内核同步技术
前面我们提到,信号量是基于原子操作的,它的信号初始值count是一个原子类型,下面我们就对它做详细的介绍,同时我们还会讲解其他的内核同步技术。

  • 原子操作
原子操作是内核中比较低级的同步操作接口,它保证指令以“原子”的方式执行而不能被打断。内核中提供了两种原子操作接口,一种是原子整数操作,一种是原子位操作。
  • 原子整数操作
原子整数操作只能操作atomic_t类型的整数数据。你也许会问为什么不是C语言里的int变量呢?在回答这个问题之前,我们先来看看它是如何定义的。atomic_t数据类型定义在<asm/atomic.h>头文件中:

// 大多数平台定义(ARM、MIPS,...)
typedef struct { volatile int counter; } atomic_t;
// x86平台定义
typedef struct { int counter; } atomic_t;

 

原子操作的实现都是平台相关的,直接使用系统提供的汇编语言来实现,因此使用 atomic_t数据类型可以屏蔽系统平台的差异性。另一点使用atomic_t的原因是可以阻止编译器对变量访问的优化处理(如使用别名或临时变量)。最后使用atomic_t可以确认我们不会把原子变量使用到非原子操作函数中,反之亦然。另一点需要说明原子操作只能保证操作是原子的,要么完成,要么不完成,不会有操作一半的可能,但原子操作并不能保证操作的顺序性,即它不能保证两个操作是按某个顺序完成的。如果要保证原子操作的顺序性,请使用内存屏障指令。在下一小节你就会看到内存屏障技术。

我们先来看一个使用原子操作的一个例子,我们有一个数据data,因为有多个进程在使用它,因此对它的访问必须是原子的,要么完成,要么不完成,而不会操作一半。我们使用原子操作来实现它:

#include <asm/atomic.h>

// A 进程初始化数据位0
atomic_t data;
data = ATOMIC_INIT(0);

// B进程需要设置它的数据为 6
atomic_set(&data);

// C进程每次操作会把数据增加10
atomic_add(10, &data);

// D进程每次操作会自动把数据递增1
atomic_inc(&data);

 

原子整数操作的完整函数列表如下:
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值