原子操作:引擎盖下

时间:2011-07-28 18:08:25

标签: computer-science atomic

原子能操作如何在引擎盖下工作?

原子操作是否所谓“等待”?

我正在寻找对原子操作的“最小公约除数”的描述。所有原子操作共享什么?

3 个答案:

答案 0 :(得分:8)

如果我们谈论同步机制(互斥体,信号量等)使用的原子操作,则必须由单CPU机器上的操作系统和多CPU上的硬件支持。

在单个CPU机器上,如果中断被关闭,则指令序列可以是“原子的”,因为它不能在中间被中断(例如,定时器中断,它会切换到另一个线程)。这意味着一旦CPU进入内核模式并且可以访问中断控制寄存器,就可以非常简单地写入同步原语。

在多核机器中它更复杂。然后,指令必须是所有CPU的真正原子。这需要所有 CPU,而不仅仅是执行原子指令的CPU,将其缓存的相关部分刷新到RAM。这种刷新使得这些架构上的同步变得如此昂贵。

指令本身采用“位测试和设置”的形式进行一次操作。这足以实现一个简单的互斥锁。即使不同CPU /内核上的两个线程在同一地址上同时执行测试和设置操作,也只有一个线程会得到该位未设置且现在已设置的结果。该主题是拥有互斥锁的主题。

答案 1 :(得分:4)

作为一个概念的原子性发生在几个地方,我怀疑你在思考代码中的原子操作,但还有其他含义。

数据库事务的一个基本属性是Atomicity,请参阅事务ACID属性的说明。

在这种情况下,你有很多数据库聪明,锁等等,这几乎肯定意味着等待两个控制线程(或两个进程)想要得到相同的数据。

当你来到代码行时我想你正在考虑一个声明(用一些虚构的语言)

global int x = 7;

在一个帖子中

 x = 25000;

 print x;

和另一个

 print x;

我们可以说第二个帖子会打印什么吗?我们可能接受7或25000,我们不太乐意得到一个数字,即25,000的高阶字节和7的低阶字节 - 这在概念上将是非原子整数赋值的结果。

不同的编程语言可以自由定义他们想要的任何语义,可以想象有些人会接受他们所处理的CPU的任何自然行为(例如32位int是原子的,64长是不是)或者他们可能会做些什么更聪明,如果CPU本身不提供原子操作,那么如果他们想要伪造原子性,我看不到太多替代等等 - 例如。 Java synchronized关键字。

答案 2 :(得分:0)

取决于你所谈论的原子操作。如果你在谈论ISA级别的东西,我认为“测试和设置”指令包含在一些流行的ISA中。