超标量处理器上的原子操作
Atomic operations on superscalar processor
原子函数在一条简单的指令中执行。他们不能在中途被打断。如果同时请求两个操作,则必须在第二个继续之前完成一个。它从不睡觉。
在十五级管道处理器上,我如何确定原子函数的原子执行?原子操作对性能有不良影响吗?
Linux 有许多原子功能已完成,因为一条指令具有类型:
typedef struct {
volatile int counter;
} atomic_t;
它定义为 SMP 安全。是否有可能在超标量上拥有 SMP 安全原子?
让我们从 atomic 在计算机科学中的含义开始。如果一个操作是 不可分割的 ,那么它就是原子的。这意味着它要么完全发生,要么根本不发生。此外,该操作在部分完成状态下永远不可见。
在超级定标器处理器上实现原子操作的一种方法是将原子指令视为障碍。在原子指令可以执行之前,所有先前的指令都必须完成执行。此外,在原子指令完成之前,原子指令之后的任何指令都不能开始执行。超级定标器处理器有效地变成了用于原子指令的非超定标器处理器。
这就是 2000 年代初期在 SPARC 处理器上实现原子指令的方式。它有效,但性能影响是可以衡量的。
原子指令通常在访问内存时锁定总线。这可以防止其他内核在执行原子指令时读取或写入内存。因此其他内核不会观察到处于部分完成状态的指令。
原子函数在一条简单的指令中执行。他们不能在中途被打断。如果同时请求两个操作,则必须在第二个继续之前完成一个。它从不睡觉。 在十五级管道处理器上,我如何确定原子函数的原子执行?原子操作对性能有不良影响吗?
Linux 有许多原子功能已完成,因为一条指令具有类型:
typedef struct {
volatile int counter;
} atomic_t;
它定义为 SMP 安全。是否有可能在超标量上拥有 SMP 安全原子?
让我们从 atomic 在计算机科学中的含义开始。如果一个操作是 不可分割的 ,那么它就是原子的。这意味着它要么完全发生,要么根本不发生。此外,该操作在部分完成状态下永远不可见。
在超级定标器处理器上实现原子操作的一种方法是将原子指令视为障碍。在原子指令可以执行之前,所有先前的指令都必须完成执行。此外,在原子指令完成之前,原子指令之后的任何指令都不能开始执行。超级定标器处理器有效地变成了用于原子指令的非超定标器处理器。
这就是 2000 年代初期在 SPARC 处理器上实现原子指令的方式。它有效,但性能影响是可以衡量的。
原子指令通常在访问内存时锁定总线。这可以防止其他内核在执行原子指令时读取或写入内存。因此其他内核不会观察到处于部分完成状态的指令。