c - 无锁算法的指针对齐

标签 c linux x86-64 lock-free

当使用 calloc 时,指向新分配内存的指针至少与最低有效位的一定数量对齐,这意味着最低有效位(如标记指针)可用于无锁算法,实际上通常是在这些算法的情况下使用。我在 linux ubuntu 服务器(x86_64 GNU/Linux,3.10.23-xxxx-std-ipv6-64-vps)上测试内存管理功能,从我的实验来看,4 个最低有效位似乎设置为 0。来 self 读到的内容指出,指针对齐的形成方式是将表示为 uintptr 的指针除以 4(对齐到 2 个最低有效位)

从 POSIX (linux) 中的内存管理系统获得的新分配的内存指针中,在初始内存分配过程中始终设置为 0 的最低有效位的最小数量是多少?

在 linux 系统(例如无锁算法)上可以用作标记指针的最低有效位的最大数量是多少?

如何强制编译器将新分配的指针对齐到最低有效位的数量?

指针对齐是否影响系统整体性能,如何影响?

最佳答案

出于许多相关原因,对齐在优化中很重要:

  • 高效使用缓存行
  • 避免禁用预取逻辑
  • vector 寄存器/指令(SSE、AVX)的最佳使用。
  • 尤其是在涉及 I/O 时,内存页面对齐也很重要。

您可以在此处找到有关英特尔架构的非常好的引用资料: http://www.intel.com/content/www/us/en/architecture-and-technology/64-ia-32-architectures-optimization-manual.html

快速回答您的问题:

What is the minimum number of the least significant bits in newly allocated memory pointers, obtained from memory menagment system in POSIX (linux), that are always set to 0 during initial memory allocation process?

这实际上取决于您所说的 CPU/架构。

What is the maximum number of the least significant bits that can be used as tagged pointers on linux systems (eg. lock-free algorithms)?

与前者相同:如果 C++ 是一个选项,您应该使用 std::atomicboost::atomic 以获得某种可移植性。

在 Intel 架构上,内存加载和存储对于 32 位、x86_32 和 x86_64 上的 64 位是原子的,如果数据正确对齐

如果你真的很喜欢这种底层,别忘了看看内存语义,内存栅栏等等(上面手册中的“栅栏说明”)

关于c - 无锁算法的指针对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30710514/

相关文章:

assembly - 了解intel汇编中的%rip注册

assembly - endbr64 指令实际上做了什么?

c - Keil 中的 Traffic Light for Tiva 系列 - c 编程

c - vim c 在插入模式下自动完成,无需按 C-X C-O

python - 测试麦克风 Linux 命令或 python

linux - 基于 GeoIP 的 Apache 重写规则

c - 背对背rdtsc进行负时钟周期测量?

c - 连续声明的变量的内存地址顺序是否总是降序?

c - SHGetFolderPath 无论如何都会返回 "C"?

linux - 通过 ssh 命令将函数作为参数传递给远程服务器