有人告诉我,具有 bigmem 内核的 32 位 Linux(当系统具有 >=4GB RAM 时)将表现优于64 位 Linux。
我想定义“表现优于“但不幸的是,告诉我这个的人没有详细说明/证明......因此有这篇文章!
这到底是真的吗?在什么情况下这是真的?
谢谢
答案1
在 x86 处理器中,64 位代码有两种帮助方式:
- 更大的地址可让您直接访问更多内存(仅与管理庞大数据集的进程相关)
- 更多的寄存器可能会让编译器减少对紧密变量的内存访问(稍微额外的优化,除了在高度优化的代码的紧密循环中之外是不会引人注意的)。
并有以下缺点:
- 更多更大的寄存器意味着每次上下文切换时要保存/恢复更多的状态。
- 更大的指针意味着使用更多的 RAM 和更大的结构,需要读取/写入更多的数据。
因此,在很多情况下,两全其美的方案是 64 位操作系统和 32 位进程:
- 64 位操作系统可以处理大量 RAM,既可以容纳许多进程,也可以容纳大缓存
- 32 位应用程序每个进程限制为 2 或 3 GB RAM,但对于绝大多数任务来说已经足够了。
- 无论 32 位任务的 RAM 位于 64 位空间的哪个位置,它只需要 32 位指针即可访问其内存,因此所有指针和数据结构仍然是较小的 32 位。
- 32 位任务(进程或线程)只需要保存/恢复 32 位 x86 中可用的少数小寄存器,64 位 Linux 调度程序可以很好地处理这种情况。
但总的来说,优势很少被注意到(只是猜测它会远低于 5%),所以只要到处使用 64 位,一切就都简单了。
我唯一会选择 32-on-64 的情况是进行 OpenVZ 类型的隔离时。这样,每个分区所有者都可以充分利用其可以访问的有限 RAM。
不过,我不知道任何PAE 相对于 64 位的优势(甚至不是小指针,因为每个 PAE 指针都有一个 32 位偏移量和一个额外的(最多 32 位)“起始”(还记得 8086 的分段内存吗?多么臃肿的负担!)
答案2
聚丙烯酰胺凝胶电泳损害了性能。唯一可能的好处是指针大小减半,但现在您必须处理内存页面的交换。
答案3
除了寄存器资源匮乏程度降低之外,x86_64 还为您提供了更合理的浮点操作。它还保证您的二进制文件得到更好的优化,因为编译器永远不需要发出向后兼容的操作码。如果您正在运行任何受 CPU 限制的东西,那么这是一个巨大的胜利。