2011-07-28 39 views
8

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

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

我在寻找原子操作的“最小公约数”的说明。所有的原子操作共享什么?

+0

什么编程语言?什么平台?哪个原子操作?什么级别的原子性(文件系统,网络,数据库......)? –

+2

@Matt Ball:这很重要吗? (更新了问题) – Pindatjuh

回答

4

原子性作为一个概念出现在好几个地方,我怀疑你想在代码中的原子操作,但也有其他的含义。数据库事务的

一个fundamantal属性是原子性,看到的交易ACID特性的描述。

在这种情况下,你有很多数据库聪明,锁具等,当两个控制线程(或两个过程)要在同样的数据,几乎可以肯定,意味着等待。

当你来到的代码,我猜你正在考虑一个报关行(在某些虚构的语言)在一个线程

x = 25000; 

print x; 

而在另一个

print x; 

global int x = 7; 

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

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

+0

原子性意味着等待其完成操作完成,然后才能让其他感兴趣的各方看到结果。这是一个正确的总结吗? – Pindatjuh

+0

是原子性意味着你不能得到部分结果,在某些情况下不可能有中断,所以你只是“等待”单个CPU操作,而在另一些情况下,你需要一个明确的等待,由一些额外的代码实现(例如,Java同步)并支付一些开销。我想你想知道什么时候会发生这样的开销,不幸的是,没有人会回答,所有的语言和平台都依赖于它。 – djna

+0

原子操作是全部或全无。在操作已经开始的情况下,如果无法完成,它会优雅地退出,以确保在失败时一切都保持原样。 – MRAB

0

取决于您正在讨论的原子操作。如果你在谈论ISA级别的东西,我想,“测试和设置”指令已经包含在一些热门的ISA中。

+2

什么是“ISA”? (国际自动化协会,独立保护授权,国际冲浪局等可能不是这样) – Pindatjuh

+3

指令集体系结构...就像编写汇编语言程序(以及机器指令的助记符,但仍然)。 – Patrick87

+0

谢谢!我从不喜欢首字母缩略词:它们比较隐晦。 – Pindatjuh

8

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

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

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

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

+0

我试图得到一个概念“最低公约数”的描述,但是谢谢你的回答。 – Pindatjuh

+0

什么时候中断*被禁用?这实际上是否真的做到了?看起来像这样的机制将离开躺在用户空间是一件危险的事情。 –

+0

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