原子操作

什么是原子操作?

就是“不可中断的一个或一系列操作”。

原子性我的理解:比如单指令在单处理器是原子性的,他不会出现并发程序的不确定性。比如出现下面的i++问题。因为cpu执行单指令时,数据从内存到高速缓存,修改后,再保存到内存,期间不会受到干扰。

在多核心的cpu中,单指令就不具有原子性,因为对于共享的缓存L3而言,i++是多个步骤,多核心的多个步骤可能会互相干扰,比如两个核心同时执行i++,在共享高速缓存里的共享变量i,核心1先读取到自己的缓存里,核心2也读取到自己的缓存里,这里出现了问题,对于高速缓存L3而言i++并不具有原子性,读取到自己核心缓存里面后还要进行修改操作,在修改操作之前核心2读取了L3的内容,可以理解成核心1的i++这一组操作被打断,从而导致了多核心cpu中单指令不具有原子性。

可以简单理解成,多核心,单指令执行,对于内存操作不具有原子性。

原子操作解决什么问题?

多核心执行i++,i为共享变量。当i初始值为0时,假如两个核心执行i++,i的结果不一定是2。那么在开始每块缓存都存储了i的值0,当第一块内核做i++的时候,其缓存中的值变成了1,即使马上回写到主内存,那么在回写之后第二块内核缓存中的i值依然是0,其执行i++,回写到内存就会覆盖第一块内核的操作,使得最终的结果是1,而不是预期中的2.

原子操作实现原理

通过关中断来实现:在执行操作前关中断,操作后开中断,关中断后cpu调度程序将不会执行,因为cpu调度也是通过中断来实现的。处理器提供总线锁定缓存锁定的机制保证复杂内存操作的原子性。

1、总线锁保证原子性

使用处理器提供的一个LOCK#信号,当一个处理器在总线上输出此信号时,其它处理器的请求将被阻塞,那么该处理器就能独自共享内存。

2、缓存锁保证原子性

“缓存锁定”指内存区域如果被缓存在处理器的缓存行中,并且在Lock操作期间被锁定,那么当它执行锁操作回写到内存时,处理器不需要在总线上声言LOCK#信号,而是修改内部的内存地址,通过缓存一致性机制保证操作的原子性。
例外:当操作的数据不能被缓存在处理器内部,或操作的数据跨多个缓存行,处理器会调用总线锁定。

缓存一致性

缓存一致性会阻止同时修改由两个以上处理器的内存区域数据,当其他处理器回写被锁定的缓存行数据时,会使其它处理器的缓存行无效。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值