原子操作:引擎盖下

Pin*_*juh 9 computer-science atomic

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

原子操作是否所谓的"等待"?

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

And*_*bel 10

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

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

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

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

  • @Brian:只能在内核空间中禁用中断。它们通常在关键操作期间在内核内部禁用并再次重新启用。最常见的情况是每当运行中断处理程序时自动屏蔽较低优先级中断。 (2认同)

djn*_*jna 5

原子性作为一个概念出现在多个地方,我怀疑您正在考虑代码中的原子操作,但还有其他含义。

数据库事务的一个基本属性是原子性,请参阅事务的ACID属性的描述。

在这种情况下,您有很多数据库智能、锁等,这几乎肯定意味着当两个控制线程(或两个进程)想要获取相同数据时需要等待。

当你谈到代码行时,我猜你正在考虑声明(用某种虚构的语言)

global int x = 7;
Run Code Online (Sandbox Code Playgroud)

在一个线程中

x = 25000;

print x;
Run Code Online (Sandbox Code Playgroud)

并在另一个

print x;
Run Code Online (Sandbox Code Playgroud)

我们能谈谈第二个线程将打印什么吗?我们可能会接受 7 或 25000,但我们不太乐意得到一个高位字节 25,000 和低位字节 7 的数字——从概念上讲,这将是非原子整数赋值的结果。

不同的编程语言可以自由地定义他们想要的任何语义,可以想象,有些语言会接受他们所使用的 CPU 的任何自然行为(比如 32 位 int 是原子的,64 位 long 不是),或者他们可能会做一些更聪明的事情,如果CPU本身不提供原子操作,那么如果他们想伪造原子性,我看不到除了某种等待之外的其他选择 - 例如。Java 同步关键字。