linux—原子操作

一、原子操作概念

原子操作是不可分割的操作,在执行完毕时它不会被任何事件中断。

在单处理器中,能够在单条指令中完成的操作都可以认为是原子操作,这是因为指令的中断只能发生在指令与指令之间。而多处理器系统中有多个处理器在独立的运行,即使在能单条指令中完成的操作,在指令执行期间就可能受其他的处理器的影响。这种在指令执行期间的影响的一种情况就是:有很多的汇编指令是“读—修改—写”类型,也就是内存单元作为目的操作数时,实际上这条指令访问了两次内存单元,一次读取,修改之后又有一次写入。这里就出现问题了:在一条指令读之后,另外的一个CPU执行的另一条指令就可能对其进行了一些意想不到的访问。也就是说该操作执行期间有事件中断,它影响了两条指令的执行,造成了结果与预想的可能不一样。


二、原子操作要解决的问题

1.CPU对共享的数据的访问都应该从所有CPU能访问到的地方—内存(寄存器是各自独有)得到。

2.在单指令对内存单元访问完成之前,不允许其他的指令来访问。


三、linux中原子操作的实现

针对上面的两个目标,软硬件分别提供了下面的支持:

1C语言的关键字volatile保证对每次从内存中读取该变量,不使用volatile时,编译器会将该变量优化成对寄存器操作。

2.LOCK前缀保证在执行该指令过程中对内存单元的锁定,其他CPU不能访问该内存单元。


下面是对于源码的分析,源码文件linux\include\asm-i386\atomic.h

原子操作的对象,一个名为atomic_t的结构类型,将atomic声明成结构体的原因:<

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值