32 位与 64 位系统

Meh*_*lar 228 operating-systems 64-bit 32-bit computer-architecture cpu-architecture

32 位和 64 位系统有什么区别?

如果你都使用过它们,你经历过什么样的明显差异?

在某些情况下,在 64 位系统上使用 32 位程序会不会有问题?

Mr *_*ooz 266

注意:这些答案适用于基于 x86 的标准 PC CPU(Intel 和 AMD)和 Windows(通常为最终用户配置)。其他 32 位或 64 位芯片、其他操作系统和其他操作系统配置可以有不同的权衡。

从技术角度来看,64 位操作系统为您提供:

  • 允许单个进程处理每个超过 4 GB 的 RAM(实际上,大多数但并非所有 32 位操作系统还将总可用系统 RAM 限制为小于 4 GB,而不仅仅是每个应用程序的最大值)。

  • 所有指针占用 8 个字节而不是 4 个字节。对 RAM 使用的影响很小(因为您不太可能让应用程序充满数千兆字节的指针),但在最坏的理论情况下,这可以使 CPU 缓存能够容纳 1/2 的指针(使它实际上是大小的 1/2)。对于大多数应用程序来说,这并不是什么大问题。

  • 64 位模式下还有更多通用 CPU 寄存器。寄存器是整个系统中最快的内存。32位模式下只有8个,64位模式下只有16个通用寄存器。在我编写的科学计算应用程序中,通过在 64 位模式下重新编译(我的应用程序可以真正使用额外的寄存器),我发现性能提高了 30%。

  • 大多数 32 位操作系统实际上只允许单个应用程序使用 2 GB 的 RAM,即使您安装了 4 GB。这是因为另外 2 GB 的地址空间被保留用于在应用程序之间共享数据、与操作系统以及与驱动程序通信。Windows 和 Linux 允许您将此权衡调整为 3 GB 用于应用程序和 1 GB 共享,但这可能会导致某些不希望更改的应用程序出现问题。我还猜测它可能会削弱具有 1 GB RAM 的显卡(但我不确定)。64 位操作系统可以为单个 32 位应用程序提供更接近完整 4 GB 的可用空间。

从用户的角度:

  • 与 32 位操作系统上的应用程序的 32 位版本相比,64 位操作系统中的 64 位应用程序的应用程序速度通常更快,但大多数用户不会看到这种加速。普通用户的大多数应用程序并没有真正利用额外的寄存器,或者通过填充缓存的更大的指针来抵消好处。

  • 如果您有任何占用内存的应用程序(如照片编辑器、视频处理、科学计算等),如果您拥有(或可以购买)超过 3 GB 的 RAM,并且您可以获得该应用程序的 64 位版本,选择很简单:使用 64 位操作系统。

  • 某些硬件没有 64 位驱动程序。在进行切换之前,请检查您的主板、所有插件卡和所有 USB 设备。请注意,在 Windows Vista 的早期,驱动程序存在很多问题。这些天的情况普遍好转。

  • 如果您一次运行太多应用程序而导致 RAM 不足(通常您可以判断出这一点,因为您的计算机开始变得非常慢并且您听到硬盘驱动器嘎吱作响),那么您将需要 64 位操作系统(和足够的内存)。

  • 您可以在 64 位 Windows 中运行 32 位应用程序(但不能运行驱动程序)而不会出现问题。我为 64 位 Windows 中的 32 位应用程序测得的最严重的减速大约是 5%(这意味着如果在 32 位 Windows 中执行某事需要 60 秒,则最多需要 60*1.05 = 65 秒) 64 位 Windows 中的相同 32 位应用程序)。

什么32位与64位并没有暗示:

在 x86 系统上,32 位与 64 位直接指的是指针的大小。就这样。

  • 它不是指 Cint类型的大小。这是由特定的编译器实现决定的,大多数流行的编译器int在 64 位系统上选择 32位。

  • 它不直接指普通非指针寄存器的大小。但是,使用 64 位算术寄存器恰好要求应用程序和操作系统也以 64 位指针模式运行。

  • 它不直接指物理地址总线的大小。例如,具有 64 位宽缓存线和最大 512GiB 内存的系统在其地址总线(即log2(512*1024**3) - log2(64) = 33)中只需要 33 位。

  • 它不是指物理数据总线的大小:这与制造成本(CPU 插槽中的引脚数)和缓存线大小更相关。

  • 很好的答案。特别是因为您注意到实际上没有 4GB RAM 限制,而是进程内存使用限制。仅供参考,我认为你应该看看这个链接:http://www.unawave.de/windows-7-tipps/32-bit-ram-barrier.html?lang=EN (9认同)
  • 它们是不能在 64 位 Windows 上运行的应用程序:16 位应用程序/那些使用 32 位或未签名内核模式驱动程序的应用程序。对于像我这样的软件迷来说,这已经很多了...... (9认同)
  • 顺便说一句,除非在其清单中启用了特定标志,否则 32 位应用程序将不会使用超过 2 GiB 的 RAM。来源:http://blogs.technet.com/b/markrussinovich/archive/2008/11/17/3155406.aspx (7认同)

Bri*_*ndy 107

基本上你可以在更大的范围内做任何事情:

  1. 每个操作系统的RAM x86 上操作系统的RAM 限制为 4GB(大部分时间)
  2. 每个进程的RAM x86 上进程的 RAM 限制为 4GB(始终)。如果您认为这不重要,请尝试运行大型 MSSQL 数据库密集型应用程序。如果您有可用并且运行得更好,它将使用> 4GB 本身。
  3. 地址:地址是 64 位而不是 32 位,允许您拥有使用更多内存的“更大”程序。
  4. 程序可用的句柄:您可以创建更多的文件句柄、进程……例如在 Windows x64 上,您可以为每个进程创建 > 2000 个线程,但在 x86 上接近几百个。
  5. 更广泛的可用程序:您可以从 x64 运行 x86 和 x64 程序。(例如 windows:wow64、windows32 on windows64 仿真)
  6. 仿真选项:您可以从 x64 运行 x86 和 x64 虚拟机。
  7. 更快:某些计算在 64 位 CPU 上更快
  8. 划分多个系统资源:当您想要运行至少一个划分系统资源的 VM 时,大量 RAM 内存非常重要。
  9. 可用的独家程序:几个新程序仅支持 x64。示例 Exchange 2007。
  10. 未来过时的 x86?:随着时间的推移,越来越多的 64 位将被使用,而越来越多的 x86 将不会被使用。因此,供应商将越来越多地支持 64 位。

2 大类型的 64 位架构是 x64 和 IA64 架构。但到目前为止,x64 是最受欢迎的。

x64 可以运行 x86 命令以及 x64 命令。IA64 也运行 x86 命令,但它不进行 SSE 扩展。Itanium 有专门用于运行 x86 指令的硬件;它是一个模拟器,但在硬件中。

正如@Phil 提到的,您可以在这里更深入地了解它的工作原理

  • 几年前,Raymond Chen 发过一篇关于 2000 年的帖子“极限”,或多或少是一个都市传说:http://blogs.msdn.com/oldnewthing/archive/2005/07/29/444912.aspx (3认同)
  • 4GB 的 RAM 限制并不完全正确(它是对家庭用户 Windows 系统的人为限制),请查看 [PAE](http://en.wikipedia.org/wiki/Physical_Address_Extension)。使用最新的硬件,Linux PAE 内核(这是 32 位默认使用的内核)可以解决超过 4GB 的问题。这同样适用于 FreeBSD 和 NetBSD。 (3认同)

小智 47

目前人们会注意到的最大影响是32位PC最多只能寻址4GB内存。当您取消操作系统为其他用途分配的内存时,您的 PC 可能只会显示大约 3.25GB 的可用内存。移至 64 位,此限制将消失。

如果您正在认真开发,那么这可能非常重要。尝试运行多个虚拟机,很快就会耗尽内存。服务器更可能需要额外的内存,因此您会发现服务器上的 64 位使用率远高于台式机。摩尔定律确保我们将在机器上拥有更多内存,因此在某些时候台式机也将切换到 64 位作为标准。

有关处理器差异的更详细说明,请查看来自ArsTechnica 的这篇优秀文章。

  • 32 位平台和 4GB 限制有点用词不当,主要是(曾经)操作系统架构选择/设计限制。确实,32 位的 4GB 在进程 VA 空间中确实受到限制。物理地址在 Intel 32 位 CPU 上支持 36 位 (7认同)
  • 理解你的观点,但只是试图推动修复不在处理器中或进入 64 位的概念,这只是稍微改进操作系统设计的问题。例如,在 32 位版本的 Windows 企业版上解决了这个问题。它允许 64GB 的 RAM。 (2认同)

小智 32

没有什么是免费的:虽然 64 位应用程序可以访问比 32 位应用程序更多的内存,但缺点是它们需要更多的内存。所有那些过去需要 4 个字节的指针,现在需要 8 个。例如,当为 64 位架构构建时,Emacs 中的默认要求是多 60% 的内存。这种额外的占用空间会损害内存层次结构的每个级别的性能:更大的可执行文件需要更长的时间从磁盘加载,更大的工作集会导致更多的分页,更大的对象意味着更少的处理器缓存。如果您考虑具有 16K L1 缓存的 CPU,32 位应用程序可以在未命中并进入 L2 缓存之前处理 4096 个指针,但 64 位应用程序必须在仅 2048 个指针之后到达 L2 缓存。

在 x64 上,这可以通过其他架构改进(如更多寄存器)来缓解,但在 PowerPC 上,如果您的应用程序不能使用 >4G,则在“ppc”上的运行速度可能比在“ppc64”上更快。即使在 Intel 上,也有一些工作负载在 x86 上运行得更快,但很少有工作负载在 x64 上的运行速度比 x86 快 5% 以上。

  • Linux 现在具有 x32 ABI,具有 x86-64 的所有速度优势(更多寄存器,重新设计的 ABI),但具有 32 位指针。+1 指出 64 位模式的好处不是来自实际宽度的增加,而是来自有机会放下许多阻碍架构的包袱。64 位 regs 对某些应用程序有价值,但不太经常需要 64 位指针空间。 (3认同)
  • 这个答案表明 PowerPC64 不如 x86-64。事实是powerpc64 并没有改进powerpc,因为powerpc 没有损坏。 (2认同)

Pho*_*shi 19

64 位操作系统可以使用更多 RAM。在实践中,就是这样。64 位 Vista/7 使用更高级的安全功能来放置重要组件在 RAM 中的位置,但这并不是真正“值得注意的”。

来自 ChrisInEdmonton:

带有 PAE 的 ix86 系统上的 32 位操作系统最多可以寻址 64 GB 的 RAM。x86-64 上的 64 位操作系统最多可以访问 256 TB 的虚拟地址空间,尽管这可能会在后续处理器中增加,最高可达 16 EB。请注意,某些操作系统会进一步限制地址空间,并且大多数主板会有额外的限制。

  • 对于操作系统,32 位与 64 位仅指指针的大小(第一段正确讨论的内容)。-1:某些操作系统选择将默认整数大小锁定为指针大小,但 Windows 和 Linux 均不这样做。整数数学精度保持不变。没有广泛使用的操作系统会更改浮点精度(第二段声称的内容)。"float" 或 "single" 是 32 位,"double" 是 64 位,无论操作系统使用 32 位还是 64 位指针。 (4认同)

小智 14

不确定我可以在不写整篇文章的情况下回答你所有的问题(总是有谷歌......),但你不需要为 64 位设计不同的应用程序。我想所指的是您必须注意指针大小不再与整数大小相同的事情。而且你有一大堆潜在问题,即对某些类型的数据有四个字节长的内置假设,这些假设可能不再正确。

这很可能会导致应用程序中的各种事情发生 - 从文件保存/加载、遍历数据、数据对齐,一直到对数据进行按位操作。如果您有一个现有的代码库,您正在尝试移植,或者在两者上工作,那么您可能会有很多小问题需要解决。

我认为这是一个实现问题,而不是设计问题。即我认为说的“设计”,无论文字大小如何,照片编辑包都将是相同的。我们编写的代码可以编译为 32 位和 64 位版本,两者的设计当然没有区别 - 这是相同的代码库。

64 位的基本“大问题”是您可以访问比 32 位大得多的内存地址空间。这意味着您可以真正将超过 4Gb 的内存装入您的计算机,并真正发挥作用。

我相信其他答案会比我更详细和受益。

在检测差异方面,然后以编程方式检查指针的大小(例如 sizeof (void*))。答案 4 表示它的 32 位,而 8 表示您在 64 位环境中运行。

  • 如果您编写的程序随意假设某些指针类型与某些整数类型的大小相同,那么您就错了。长期以来一直如此。 (4认同)

Mec*_*cki 10

32 位进程具有 4 GB 的虚拟地址空间;对于某些应用程序来说,这可能太少了。64 位应用程序具有几乎无限的地址空间(当然它是有限的,但您很可能不会达到此限制)。

在 OSX 上还有其他优势。请参阅以下文章,为什么让内核在 64 位地址空间中运行(无论您的应用程序运行的是 64 位还是 32 位)或让您的应用程序在 64 位地址空间中运行(而内核仍为 32 位)会带来更好的性能。总结一下:如果其中一个是 64 位(内核或应用程序,或者两者都是),则无论何时从内核切换到使用空间并返回(这将加快速度)都不必刷新 TLB(“翻译后备缓冲区”) RAM 访问)。

在使用“long long int”变量(64 位变量,如 uint64_t)时,性能也会有所提升。32 位 CPU 可以加/除/减/乘两个 64 位值,但不能在单个硬件操作中进行。相反,它需要将此操作拆分为两个(或更多)32 位操作。因此,与 64 位数字一起工作的应用程序将具有能够直接在硬件中进行 64 位数学运算的速度增益。

最后但并非最不重要的一点是,x86-64 架构提供了比经典 x86 架构更多的寄存器。使用寄存器比使用 RAM 快得多,并且 CPU 拥有的寄存器越多,需要将寄存器值交换到 RAM 并返回到寄存器的频率就越低。

要了解您的 CPU 是否可以在 64 位模式下运行,您可以查看各种 sysctl 变量。例如打开一个终端并输入

sysctl machdep.cpu.extfeatures
Run Code Online (Sandbox Code Playgroud)

如果列出 EM64T,则您的 CPU 根据 x86-64 标准支持 64 位地址空间。你也可以找

sysctl hw.optional.x86_64
Run Code Online (Sandbox Code Playgroud)

如果显示 1(真/启用),则您的 CPU 支持 x86-64 位模式,如果显示 0(假/禁用),则不支持。如果根本没有找到该设置,则认为它是错误的。

注意:您还可以从本机 C 应用程序中获取 sysctl 变量,无需使用命令行工具。看

man 3 sysctl
Run Code Online (Sandbox Code Playgroud)


Mar*_*ort 9

请注意,地址空间可用于多个(真实)内存。还可以内存映射大文件,这可以在更奇怪的访问模式下提高性能,因为更强大和更高效的块级 VM 级缓存开始了。在 64 位上分配大内存块也更安全,因为堆管理器更少可能会遇到不允许它分配大块的地址空间碎片。

该线程中说的一些内容(例如#寄存器的加倍)仅适用于 x86-> x86_64,一般不适用于 64 位。就像在 x86_64 下保证有 SSE2、686 操作码和一种廉价的 PIC 方法一样。这些功能严格来说不是关于 64 位的,而是关于减少遗留和补救已知的 x86 限制

此外,人们经常指出寄存器加倍是加速的原因,而更有可能使用默认的 SSE2 来解决问题(加速 memcpy 和类似功能)。如果您为 x86 启用相同的设置,则差异会小得多。(*) (***)

还要记住,通常会涉及初始惩罚,因为平均数据结构只会因为指针的大小变大而增加。这也有缓存效果,但更值得注意的是平均 memcpy() (或任何等价的内存复制在您的语言中)将花费更长的时间。顺便说一句,这只是几个百分点的幅度,但上面提到的加速也有这个幅度。

通常,64 位架构上的对齐开销也更大(以前的 32 位记录通常只会变成 32 位和 64 位值的混合),甚至更多地破坏结构。

总的来说,我的简单测试表明,如果驱动程序和运行时库已经完全适应,它们将大致相互抵消,平均应用程序没有显着的速度差异。然而,某些应用程序可能会突然变得更快(例如,当依赖 AES 时)或变慢(关键数据结构不断移动/扫描/走动并包含大量指针)。不过,测试是在 Windows 上进行的,因此未对 PIC 优化进行基准测试。

请注意,大多数 JIT-VM 语言(Java、.NET)平均(内部)使用的指针比 C++ 多得多。可能它们的内存使用量比普通程序增加的更多,但我不敢直接将其等同于减慢效果(因为这些确实是复杂而时髦的野兽,而且通常很难在不进行测量的情况下进行预测)

Windows 64 位默认使用 SSE2 进行浮点运算,这似乎加快了简单的运算速度并减慢了复杂的(正弦、余弦等)运算速度。

(*) 一个鲜为人知的事实是,SSE 寄存器的数量在 64 位模式下也翻了一番

(**) 多布斯博士几年前有一篇关于它的好文章。


小智 8

除了大多数人在这里提到的明显的内存空间问题之外,我认为值得看看 Knuth(以及其他人)最近一直在谈论的“宽词计算”的概念。通过位操作可以获得很多效率,并且对 64 位字的按位运算比对 32 位字更进一步。简而言之,您可以在寄存器中执行更多操作而不必占用内存,从性能角度来看,这是一个巨大的胜利。

查看第 4 卷,前分册 1A,了解我正在谈论的一些很酷的技巧示例。


Kri*_*ost 7

除了能够寻址更多内存之外,x86_64 还具有更多寄存器,允许编译器生成更高效的代码。不过,性能提升通常很小。

x86_64 架构向后兼容 x86。可以运行未经修改的 32 位操作系统。还可以从 64 位操作系统运行未经修改的 32 位软件。不过,这将需要所有常用的 32 位库。它们可能需要单独安装。


小智 6

这个话题已经太长了,但是......

大多数回复都集中在您拥有更大的 64 位地址空间,因此您可以寻址更多内存这一事实。对于大约 99% 的应用程序,这完全无关紧要。大吼。

真正的原因64位是好是不是该寄存器是更大的,但也有两倍多的人!这意味着编译器可以将更多的值保存在寄存器中,而不是将它们溢出到内存中,然后在几条指令中将它们加载回来。如果优化编译器为您展开循环,它可以展开大约两倍的循环,这确实有助于提高性能。

此外,64 位的子例程调用方/被调用方约定已被定义为将大部分传递的参数保存在寄存器中,而不是调用方将它们压入堆栈而被调用方将它们弹出。

因此,“典型的”C/C++ 应用程序仅通过为 64 位重新编译即可获得大约 10% 或 15% 的性能改进。(假设应用程序的某些部分受计算限制。当然,这并不能保证;所有计算机都以相同的速度等待。您的里程可能会有所不同。)


knw*_*iss 6

除了已经提到的优点之外,这里还有一些关于安全性的优点:

  • x86_64 cpu 在它们的页表中确实有不执行位。即这可以防止由缓冲区溢出引起的安全漏洞。32 位 x86 cpu 仅在 PAE 模式下支持此功能。
  • 更大的地址空间允许更好的地址空间布局随机化 (ASLR),这使得缓冲区溢出的利用更加困难。
  • x86_64 CPU 具有位置无关代码,即相对于指令指针寄存器 (RIP) 的数据访问。

想到的另一个优点是,vmalloc()在 64 位模式下,Linux 内核中分配的虚拟连续内存量可能更大。


Meh*_*lar 5

来自 Microsoft.com 的报价:

在下表中,基于 64 位版本的 Windows 和 64 位 Intel 处理器的计算机增加的最大资源与现有的 32 位资源最大值进行了比较。

MS-表

  • 有趣,但值得注意的是,某些 32 位版本的 Windows 允许更多的物理内存。例如,参见 http://en.wikipedia.org/wiki/Physical_Address_Extension#Microsoft_Windows (2认同)

Mar*_*ade 5

对于 32 位机器,您只有 4,294,967,295 字节的内存需要寻址。对于 64 位机器,您有 1.84467441 × 10^19 字节的内存。

维基百科是这么说的

64 位处理器计算特定任务(例如大数字的阶乘)的速度是在 32 位环境中工作的两倍(给出的示例来自 32 位和 64 位 Windows 计算器之间的比较;对于 100 000 的阶乘很明显)。这给出了 64 位优化应用程序的理论可能性的一般感觉。

虽然 64 位架构无疑使在数字视频、科学计算和大型数据库等应用程序中处理大型数据集变得更容易,但关于它们或它们的 32 位兼容模式是否会比同等价格的更快用于其他任务的 32 位系统。在 x86-64 架构(AMD64)中,大多数 32 位操作系统和应用程序都能够在 64 位硬件上流畅运行。

Sun 的 64 位 Java 虚拟机启动速度比 32 位虚拟机慢,因为 Sun 只为 64 位平台实现了“服务器”JIT 编译器 (C2)。[9] “客户端”JIT 编译器 (C1) 生成的代码效率较低,但编译速度快得多,在 64 位平台上不可用。

应该注意的是,在比较 32 位和 64 位处理器时,速度并不是唯一需要考虑的因素。如果部署正确,多任务、压力测试和集群(用于高性能计算)、HPC 等应用程序可能更适合 64 位架构。出于这个原因,64 位集群已广泛部署在 IBM、HP 和 Microsoft 等大型组织中。

  • 物理地址总线长度与它是 32 位还是 64 位处理器无关。一些 32 位处理器的地址总线大于 32 位,没有 64 位处理器有 64 位地址总线。 (2认同)