Atomic operation

来自osdev
跳到导航 跳到搜索

原子操作 是指一种自身过程中不会被任何其他进程读取或更改状态的操作。 它可以作为单步骤有效地执行,并且是处理多个独立进程或更新共享数据的算法中的重要特性,无论是在同步还是在不需要同步的情况的算法中。

确保操作是原子的方法

单处理器-单核系统

在单个处理器系统上,如果一个操作是在单个CPU指令中实现的,则它始终是原子性的。 因此,可以安全地假设XCHG或INC之类的操作在此类系统上是原子性的。

如果一个操作需要多个CPU指令,那么它可能会在执行过程中中断。 如果这会导致上下文切换 (或者中断处理程序引用正在使用的数据),则可能会损害原子性。 可以使用任何标准的锁技术 (例如 自旋锁) 来防止这种情况,但可能效率低下。 如果可能的话,禁用中断可能是确保原子性的最有效方法 (尽管请注意,这可能会增加最坏情况下的中断延迟,如果它变得太久,这可能是有问题的)。

多处理器或多核系统

在多处理器系统上,确保原子性存在有点困难。 仍然可以使用与单个处理器系统相同的锁 (例如 自旋锁),但是仅使用单个指令或禁用中断将无法保证原子访问。 你还必须确保系统中没有其他处理器或内核试图访问你正在使用的数据。 实现这一点的最简单方法是确保你正在使用的指令在总线上断言 “锁定” 信号,这可以防止系统中的任何其他处理器同时访问内存。 在x86处理器上,一些指令会自动锁定总线 (例如 'XCHG'),而其它指令则要求你为指令指定 'LOCK' 前缀以实现此目的 (例如 'CMPXCHG',你应该将其写为 'LOCK CMPXCHG op1,op2 ')。

实现

同步原语 (子) 页面中的给出了一些具有原子操作的实现或示例。 除此之外,GCC还可以使你更简便的获得帮助,因为它具有内置功能。 你可以看看 GCC文档