为了账号安全,请及时绑定邮箱和手机立即绑定

为什么在x86上自然对齐变量的整数赋值是原子的?

为什么在x86上自然对齐变量的整数赋值是原子的?

C C++
杨魅力 2019-06-15 18:10:42
我一直在读这个文章关于原子操作,它提到了在x86上32位整数赋值是原子的,只要变量是自然对齐的。为什么天然排列保证原子性?
查看完整描述

3 回答

?
繁花不似锦

TA贡献1851条经验 获得超4个赞

如果32位或更小的对象在内存的“正常”部分内自然对齐,则除80386 sx以外的任何80386或兼容处理器都可以在一次操作中读取或写入对象的所有32位。虽然平台以快速和有用的方式完成某件事情的能力并不一定意味着该平台出于某种原因有时不会以其他方式进行操作,而且我相信,在许多x86处理器上,即使不是所有的x86处理器,也有可能拥有一次只能访问8或16位的内存区域,但我认为英特尔从未定义过任何条件,要求对“正常”内存区域进行对齐的32位访问会导致系统在不读取或写入整个内存的情况下读取或写入部分值,我不认为英特尔有任何意图来定义任何这样的东西“正常”的记忆区域。


查看完整回答
反对 回复 2019-06-15
?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

自然对齐意味着类型的地址是类型大小的倍数。

例如,字节可以位于任意地址,短字节(假定16位)必须位于2的倍数上,int(假设32位)必须位于4的倍数上,长(假设64位)必须位于8的倍数上。

如果您访问了一段未自然对齐的数据,CPU要么会引发故障,要么会读写内存,而不是作为原子操作。CPU所采取的操作将取决于体系结构。

例如,图像中的内存布局如下:

01234567...XXXX.

int *data = (int*)3;

当我们试着阅读*data组成该值的字节分布在2个int大小块中,1个字节位于块0-3中,3个字节分布在块4-7中。现在,仅仅因为这些块在逻辑上是相邻的,这并不意味着它们是物理上的。例如,块0-3可能位于CPU缓存行的末尾,而块3-7位于页文件中。当CPU进入访问块3-7以获得它所需的3个字节时,它可能会看到该块不在内存中,并发出它需要内存分页的信号。这可能会阻塞调用进程,而操作系统会将内存重新分页。

在内存被分页之后,但是在您的进程被唤醒之前,另一个进程可能会出现并编写一个Y然后您的进程被重新安排,CPU完成读取,但是现在它已经读取了XYXX,而不是您期望的XXXX。


查看完整回答
反对 回复 2019-06-15
  • 3 回答
  • 0 关注
  • 917 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信