原子能操作如何在引擎盖下工作?
原子操作是否所谓“等待”?
我正在寻找对原子操作的“最小公约除数”的描述。所有原子操作共享什么?
答案 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中。