相关疑难解决方法(0)

num ++是'int num'的原子吗?

一般地,对于int num,num++(或++num),作为读-修改-写操作中,是不是原子.但我经常看到编译器,例如GCC,为它生成以下代码(在这里尝试):

在此输入图像描述

由于第5行对应于num++一条指令,我们可以得出结论,在这种情况下num++ 是原子的吗?

如果是这样,是否意味着如此生成num++可以在并发(多线程)场景中使用而没有任何数据争用的危险(例如,我们不需要制作它,std::atomic<int>并强加相关成本,因为它是无论如何原子)?

UPDATE

请注意,这个问题不是增量是否原子的(它不是,而且是问题的开头行).它是否可以在特定场景中,即在某些情况下是否可以利用单指令性质来避免lock前缀的开销.而且,作为公认的答案约单处理器的机器,还有部分提到这个答案,在其评论和其他人谈话解释,它可以(尽管不是C或C++).

c c++ assembly multithreading atomic

148
推荐指数
8
解决办法
1万
查看次数

x86 指令是否需要它们自己的编码以及它们的所有参数同时存在于内存中?

我试图弄清楚是否有可能运行一个 Linux VM,其 RAM 仅由单个物理页面支持。

为了模拟这一点,我修改了 KVM 中的嵌套页错误处理程序,以从所有嵌套页表 (NPT) 条目中删除当前位,但与当前处理的页错误对应的条目除外。

在尝试启动 Linux 客户机时,我观察到使用内存操作数的汇编指令,例如

add [rbp+0x820DDA], ebp
Run Code Online (Sandbox Code Playgroud)

导致页面错误循环,直到我恢复包含指令的页面以及操作数中引用的页面的当前位(在本例中[rbp+0x820DDA])。

我想知道为什么会这样。CPU不应该按顺序访问内存页,即先读取指令,然后访问内存操作数吗?还是 x86 要求指令页和所有操作数页可以同时访问?

我正在 AMD Zen 1 上进行测试。

virtualization paging x86 assembly kvm

68
推荐指数
1
解决办法
1467
查看次数

当发生中断时,管道中的指令会发生什么?

假设一个5级流水线架构(IF =指令获取,ID =指令解码,EX =执行,MEM =存储器访问,WB =寄存器写回).有4条指令必须执行.

(这些样本说明不准确,但我相信这一点会被理解)

在第五个时钟周期,这些指令将在管道中,如下所示.

添加a,b,c [IF ID EX MEM WB]

添加a,b,d [IF ID EX MEM]

添加a,b,e [IF ID EX]

添加a,b,f [IF ID]

现在,如果发生硬件中断,这些指令会发生什么.只有在执行流水线中的所有指令后才能处理中断吗?是否会以不同的方式处理软件中断和异常?

computer-architecture

22
推荐指数
1
解决办法
1万
查看次数

是x86 CMPXCHG原子,如果是这样,为什么需要LOCK?

Intel的文档

该指令可以与LOCK前缀一起使用,以允许指令以原子方式执行.

我的问题是

  1. 可以CMPXCHG用内存地址操作吗?从文档看来似乎没有,但任何人都可以确认只能在寄存器中使用实际的VALUE,而不是内存地址吗?

  2. 如果CMPXCHG不是原子级和高级语言级CAS必须通过LOCK CMPXCHG(带LOCK前缀)来实现,那么引入这样一条指令的目的是什么?

concurrency x86 compare-and-swap

10
推荐指数
2
解决办法
8761
查看次数

估计x86 CPU上的中断延迟

我在寻找可以帮助估计x86 CPU上的中断等待时间的信息。在“ datasheets.chipdb.org/Intel/x86/386/technote/2153.pdf”中找到了非常有用的论文。但是本文为我提出了一个非常重要的问题:如何定义等待当前指令完成所提供的延迟?我的意思是在识别INTR信号与执行INTR微代码之间存在延迟。我记得,英特尔软件开发人员手册还讲述了有关等待当前执行指令完成的信息。但这也说明某些指令可能会被中断。主要问题是:如何为特定处理器定义最大完成指令等待时间。需要估算核心滴答和内存访问操作,不以秒或微秒为单位。缓存和TLD未命中,以及可能影响等待的其他此类内容应予以考虑。

需要进行此估算,以研究实现较小的关键部分的可能性,这些部分不会影响中断等待时间。为达到此目的,关键部分的长度必须小于或等于CPU最长的不间断指令的长度。

任何帮助都非常欢迎。如果您知道一些对您有所帮助的论文,请分享其链接。

benchmarking x86 latency real-time interrupt

7
推荐指数
1
解决办法
1156
查看次数

当线程调度在不同的 CPU 核心上时,预期的内存语义(例如写入后读取)会发生什么情况?

单线程内的代码具有一定的内存保证,例如先读后写(即将一些值写入内存位置,然后读回它应该给出您写入的值)。

如果线程被重新安排在不同的 CPU 核心上执行,这样的内存保证会发生什么?假设一个线程将 10 写入内存位置 X,然后重新调度到不同的核心。该核心的 L1 缓存可能具有不同的 X 值(与之前在该核心上执行的另一个线程不同),因此现在读取 X 不会像线程期望的那样返回 10。当线程被调度到不同的核心上时,是否会发生一些 L1 缓存同步?

multithreading operating-system cpu-architecture memory-barriers cpu-cache

5
推荐指数
1
解决办法
471
查看次数

在执行过程中中断指令

假设CPU正在运行汇编指令,例如,FOO将在几个时钟(例如10)中执行

中断请求刚好在执行过程中FOO,处理器需要中断.它是否等待命令正确执行,或FOO中止并将重新启动?考虑到不同类型的中断优先级,它的行为是否有所不同?

x86 assembly interrupt

4
推荐指数
1
解决办法
226
查看次数

程序计数器、栅栏和处理器重新排序

我知道除了编译器之外,处理器还可以重新排序指令。

我有几个问题想不通。

假设我们有三个指令:

节目单

S1 S2 S3

处理器重新排序后,顺序变为(无论出于何种原因):

S3 S2 S1

  • 那么当处理器执行 S1(按程序顺序)时,程序计数器的值是多少?
  • 如果 Windows(或其他操作系统),上下文将线程切换出并在另一个处理器中调度它,另一个处理器如何知道接下来要执行哪条指令?(是否保证进行相同的重新排序?)
  • 一个处理器上的内存栅栏(例如,由原子比较和交换指令创建的完整栅栏)在线程被调度到另一个线程上之后是否有效?

对此的任何想法都受到高度赞赏。

windows assembly x86-64 cpu-architecture memory-barriers

2
推荐指数
1
解决办法
60
查看次数