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 插槽中的引脚数)和缓存线大小更相关。
Bri*_*ndy 107
基本上你可以在更大的范围内做任何事情:
2 大类型的 64 位架构是 x64 和 IA64 架构。但到目前为止,x64 是最受欢迎的。
x64 可以运行 x86 命令以及 x64 命令。IA64 也运行 x86 命令,但它不进行 SSE 扩展。Itanium 有专门用于运行 x86 指令的硬件;它是一个模拟器,但在硬件中。
正如@Phil 提到的,您可以在这里更深入地了解它的工作原理。
小智 47
目前人们会注意到的最大影响是32位PC最多只能寻址4GB内存。当您取消操作系统为其他用途分配的内存时,您的 PC 可能只会显示大约 3.25GB 的可用内存。移至 64 位,此限制将消失。
如果您正在认真开发,那么这可能非常重要。尝试运行多个虚拟机,很快就会耗尽内存。服务器更可能需要额外的内存,因此您会发现服务器上的 64 位使用率远高于台式机。摩尔定律确保我们将在机器上拥有更多内存,因此在某些时候台式机也将切换到 64 位作为标准。
有关处理器差异的更详细说明,请查看来自ArsTechnica 的这篇优秀文章。
小智 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% 以上。
Pho*_*shi 19
64 位操作系统可以使用更多 RAM。在实践中,就是这样。64 位 Vista/7 使用更高级的安全功能来放置重要组件在 RAM 中的位置,但这并不是真正“值得注意的”。
来自 ChrisInEdmonton:
带有 PAE 的 ix86 系统上的 32 位操作系统最多可以寻址 64 GB 的 RAM。x86-64 上的 64 位操作系统最多可以访问 256 TB 的虚拟地址空间,尽管这可能会在后续处理器中增加,最高可达 16 EB。请注意,某些操作系统会进一步限制地址空间,并且大多数主板会有额外的限制。
小智 14
不确定我可以在不写整篇文章的情况下回答你所有的问题(总是有谷歌......),但你不需要为 64 位设计不同的应用程序。我想所指的是您必须注意指针大小不再与整数大小相同的事情。而且你有一大堆潜在问题,即对某些类型的数据有四个字节长的内置假设,这些假设可能不再正确。
这很可能会导致应用程序中的各种事情发生 - 从文件保存/加载、遍历数据、数据对齐,一直到对数据进行按位操作。如果您有一个现有的代码库,您正在尝试移植,或者在两者上工作,那么您可能会有很多小问题需要解决。
我认为这是一个实现问题,而不是设计问题。即我认为说的“设计”,无论文字大小如何,照片编辑包都将是相同的。我们编写的代码可以编译为 32 位和 64 位版本,两者的设计当然没有区别 - 这是相同的代码库。
64 位的基本“大问题”是您可以访问比 32 位大得多的内存地址空间。这意味着您可以真正将超过 4Gb 的内存装入您的计算机,并真正发挥作用。
我相信其他答案会比我更详细和受益。
在检测差异方面,然后以编程方式检查指针的大小(例如 sizeof (void*))。答案 4 表示它的 32 位,而 8 表示您在 64 位环境中运行。
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)
请注意,地址空间可用于多个(真实)内存。还可以内存映射大文件,这可以在更奇怪的访问模式下提高性能,因为更强大和更高效的块级 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,了解我正在谈论的一些很酷的技巧示例。
除了能够寻址更多内存之外,x86_64 还具有更多寄存器,允许编译器生成更高效的代码。不过,性能提升通常很小。
x86_64 架构向后兼容 x86。可以运行未经修改的 32 位操作系统。还可以从 64 位操作系统运行未经修改的 32 位软件。不过,这将需要所有常用的 32 位库。它们可能需要单独安装。
小智 6
这个话题已经太长了,但是......
大多数回复都集中在您拥有更大的 64 位地址空间,因此您可以寻址更多内存这一事实。对于大约 99% 的应用程序,这完全无关紧要。大吼。
在真正的原因64位是好是不是该寄存器是更大的,但也有两倍多的人!这意味着编译器可以将更多的值保存在寄存器中,而不是将它们溢出到内存中,然后在几条指令中将它们加载回来。如果优化编译器为您展开循环,它可以展开大约两倍的循环,这确实有助于提高性能。
此外,64 位的子例程调用方/被调用方约定已被定义为将大部分传递的参数保存在寄存器中,而不是调用方将它们压入堆栈而被调用方将它们弹出。
因此,“典型的”C/C++ 应用程序仅通过为 64 位重新编译即可获得大约 10% 或 15% 的性能改进。(假设应用程序的某些部分受计算限制。当然,这并不能保证;所有计算机都以相同的速度等待。您的里程可能会有所不同。)
除了已经提到的优点之外,这里还有一些关于安全性的优点:
想到的另一个优点是,vmalloc()
在 64 位模式下,Linux 内核中分配的虚拟连续内存量可能更大。
来自 Microsoft.com 的报价:
在下表中,基于 64 位版本的 Windows 和 64 位 Intel 处理器的计算机增加的最大资源与现有的 32 位资源最大值进行了比较。
对于 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 等大型组织中。
归档时间: |
|
查看次数: |
57085 次 |
最近记录: |