Computer science 原子能行动:幕后操纵

Computer science 原子能行动:幕后操纵,computer-science,atomic,Computer Science,Atomic,原子能运作是如何运作的 原子操作是所谓的“无等待”吗 我在寻找原子操作的“最小公约数”的描述。所有原子操作共享什么?取决于您所谈论的原子操作。如果你说的是ISA级别的东西,我认为,“测试和设置”指令包含在一些流行的ISA中。原子性作为一个概念出现在很多地方,我怀疑你在考虑代码中的原子操作,但还有其他含义 数据库事务的一个基本属性是原子性,请参见事务属性的描述 在这种情况下,您有很多数据库技巧、锁等,这几乎肯定意味着当两个控制线程(或两个进程)想要获取相同的数据时,需要等待 当你谈到代码行时,我猜

原子能运作是如何运作的

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


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

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

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

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

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

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

一条心

 x = 25000;

 print x;
在另一个

 print x;
我们能说说第二个线程将打印什么吗?我们可能会接受7或25000,如果得到一个高阶字节25000和低阶字节7的数字,我们会不太高兴——从概念上讲,这是非原子整数赋值的结果


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

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

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

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


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

什么编程语言?什么站台?哪个原子操作?原子性的级别是什么(文件系统、网络、数据库等)?@mattball:这有关系吗?(更新问题)什么是“ISA”?(国际自动化学会、独立保护授权、国际冲浪机构等可能不是)指令集架构。。。就像汇编语言程序是用什么编写的(好吧,机器指令的助记符,但仍然是)。谢谢!我从不喜欢缩写词:它们相当晦涩。原子性意味着等待它的完整操作完成,然后其他相关方才能看到它的结果。这是一个正确的总结吗?是的,原子性意味着你不能得到部分结果,在某些情况下,没有中断的可能性,所以你只是在“等待”一个CPU操作,在其他情况下,你需要显式的等待,由一些额外的代码实现(例如Java同步),并支付一些开销。我想你想知道这样的开销何时发生,不幸的是,没有一个答案,完全依赖于语言和平台。一个原子操作要么全有,要么全无。在那些操作已经开始的情况下,如果它无法完成,它会优雅地退出,确保在失败时一切都保持它开始时的状态。我试图得到一个概念上的“最小公约数”描述,但感谢您的回答。中断何时被禁用?这在现实中真的发生过吗?似乎将这种机制留在用户空间是一件危险的事情。@Brian:只能在内核空间禁用中断。在关键操作期间,它们通常在内核中被禁用,然后重新启用。最常见的情况是每当中断处理程序运行时,自动屏蔽较低优先级的中断。
 print x;