32位和64位系统之间有什么区别?
如果您都使用了它们,那么您经历了什么样的明显差异?
在某些情况下,在64位系统上使用32位程序会不会有问题?
32位和64位系统之间有什么区别?
如果您都使用了它们,那么您经历了什么样的明显差异?
在某些情况下,在64位系统上使用32位程序会不会有问题?
Answers:
注意:这些答案适用于基于x86的标准PC CPU(Intel和AMD)和Windows(通常为最终用户配置)。其他32位或64位芯片,其他OS和其他OS配置可以具有不同的权衡。
从技术角度来看,64位操作系统为您提供:
允许单个进程分别处理超过4 GB的RAM(实际上,大多数(但不是全部)32位OS还将可用的系统RAM总数限制为少于4 GB,而不仅仅是每个应用程序的最大值)。
所有指针占用8个字节,而不是4个字节。对RAM使用率的影响很小(因为您不太可能在应用程序中填充千兆字节的指针),但是在理论上最糟糕的情况下,这可能会使CPU高速缓存能够容纳1/2个指针(使得它实际上是尺寸的1/2)。对于大多数应用程序来说,这并不是什么大问题。
64位模式下还有更多通用CPU寄存器。寄存器是整个系统中最快的内存。在32位模式下只有8个,在64位模式下只有16个通用寄存器。在我编写的科学计算应用程序中,通过以64位模式重新编译,我的性能提高了30%(我的应用程序实际上可以使用额外的寄存器)。
即使您已安装4 GB,大多数32位OS确实仅允许单个应用程序使用2 GB RAM。这是因为另外2 GB的地址空间被保留,用于在应用程序之间,与OS共享数据以及与驱动程序进行通信。Windows和Linux将使您可以将此权衡调整为3 GB(对于应用程序)和1 GB(共享),但这对于某些不希望更改的应用程序会造成问题。我还猜测它可能会削弱具有1 GB RAM的图形卡(但我不确定)。64位OS可以为单独的32位应用程序提供更接近完整4 GB的播放空间。
从用户的角度来看:
与32位OS上的32位版本的应用程序相比,在64位OS中使用64位应用程序的应用程序速度通常更快。但是,大多数用户不会看到这种速度提高。对于普通用户而言,大多数应用程序实际上并没有真正利用额外的寄存器,否则,通过更大的指针填充高速缓存来平衡其好处。
如果您有任何内存占用应用程序(例如照片编辑器,视频处理,科学计算等),如果您拥有(或可以购买)超过3 GB的RAM,并且可以获得该应用程序的64位版本,选择很容易:使用64位操作系统。
某些硬件没有64位驱动程序。进行切换之前,请检查主板,所有插卡和所有USB设备。请注意,在Windows Vista的早期,驱动程序存在很多问题。如今,情况通常会更好。
如果您一次运行的应用程序太多,而RAM却用完(通常可以告诉您,因为您的计算机开始变得非常缓慢,并且听到硬盘驱动器崩溃的声音),那么您将需要一个64位操作系统(以及足够的RAM)。
您可以在64位Windows中运行32位应用程序(但不能运行驱动程序)而不会出现问题。对于64位Windows中的32位应用程序,我测得的最差减速速度约为5%(这意味着,如果在32位Windows中执行某项操作花费了60秒,则最多花费60 * 1.05 = 65秒在64位Windows中使用相同的32位应用程序)。
什么32位与64位并没有暗示:
在x86系统上,32位与64位直接指的是指针的大小。就这样。
它不涉及C int
类型的大小。这是由特定的编译器实现决定的,大多数流行的编译器int
在64位系统上选择32 位。
它不直接引用普通非指针寄存器的大小。但是,使用64位算术寄存器恰好要求应用程序和OS也以64位指针模式运行。
它不直接涉及物理地址总线的大小。例如,具有64位宽的高速缓存行和最大512GiB内存的系统在其地址总线(即log2(512*1024**3) - log2(64) = 33
)中仅需要33位。
它不涉及物理数据总线的大小:与制造成本(CPU插槽中的引脚数)和缓存线的大小有关。
基本上,您可以做更大的事情:
64位体系结构的两种主要类型是x64和IA64体系结构。但是x64是迄今为止最受欢迎的。
x64可以运行x86命令以及x64命令。IA64也运行x86命令,但不执行SSE扩展。在Itanium上有专用于运行x86指令的硬件。它是一个模拟器,但是在硬件中。
目前人们会注意到的最大影响是一台32位PC最多只能处理4GB的内存。当您取出操作系统分配给其他用途的内存时,您的PC可能只会显示大约3.25GB的可用内存。移至64位,此限制消失。
如果您正在认真发展,那么这可能非常重要。尝试运行多个虚拟机,很快就会耗尽内存。服务器更可能需要额外的内存,因此您会发现服务器上的64位使用率远远大于台式机。摩尔定律可确保我们在计算机上拥有更多的内存,因此在某些时候,台式机也将转换为标准的64位。
有关处理器差异的详细说明,请参阅ArsTechnica的这篇出色文章。
没有什么是免费的:尽管64位应用程序可以访问的内存比32位应用程序多,但缺点是它们需要更多的内存。所有以前需要4个字节的指针,现在都需要8个字节。例如,为64位体系结构构建时,Emacs中的默认要求是增加60%的内存。这种额外的占用空间会损害内存层次结构各个级别的性能:较大的可执行文件从磁盘加载所需的时间更长,较大的工作集导致更多的分页,而较大的对象意味着较少的处理器缓存。如果考虑使用具有16K L1高速缓存的CPU,则32位应用程序可以在丢失并进入L2高速缓存之前使用4096个指针,但是64位应用程序仅在2048个指针之后就必须到达L2高速缓存。
在x64上,这可以通过其他体系结构改进(例如增加寄存器)来缓解,但是在PowerPC上,如果您的应用程序不能使用> 4G,则在“ ppc”上运行的速度可能会比“ ppc64”快。即使在Intel上,也有一些工作负载在x86上运行得更快,并且很少有x64上的运行速度超过5%。
64位操作系统可以使用更多RAM。就是这样,实际上。64位Vista / 7在将重要组件放置在RAM中的位置时使用了更高级的安全功能,但实际上并不是那么“明显”。
从ChrisInEdmonton:
带有PAE的ix86系统上的32位操作系统可以寻址多达64 GB的RAM。x86-64上的64位操作系统最多可以访问256 TB的虚拟地址空间,尽管在后续的处理器中可能会提高到16 EB。请注意,某些操作系统会进一步限制地址空间,并且大多数主板都会有其他限制。
不知道我是否可以在不撰写整篇文章的情况下回答您的所有问题(总是有Google ...),但是您无需针对64位设计不同的应用程序。我想这是指您必须注意指针大小不再与整数大小相同的情况。对于某些类型的数据,如果假设四个字节长,可能就不再正确,因此您可能会承担很多潜在的问题。
这很可能会破坏应用程序中的所有内容-从文件保存/加载,遍历数据,数据对齐,一直到对数据进行按位操作等所有内容。如果您有一个现有的代码库正在尝试移植,或者两者都工作,那么很可能您会遇到很多麻烦。
我认为这是一个实现问题,而不是设计问题。也就是说,我认为无论照片大小如何,照片编辑包的“设计”都是相同的。我们编写的代码可以同时编译为32位和64位版本,并且两者之间的设计当然没有什么不同-它是相同的代码库。
64位的根本“大问题”是,您可以访问比32位更大的内存地址空间。这意味着您确实可以将超过4Gb的内存插入计算机,并真正发挥作用。
我敢肯定,其他答案将比我更多地进入细节和收益。
就检测差异而言,然后以编程方式仅检查指针的大小(例如,sizeof(void *))。答案为4表示其32位,而答案8则表示您正在64位环境中运行。
一个32位进程的虚拟地址空间为4 GB。对于某些应用程序来说可能太少了。64位应用程序实际上具有无限的地址空间(当然它是有限的,但您很可能不会达到此限制)。
在OSX上还有其他优点。请参阅以下文章,为什么让内核在64位地址空间中运行(无论您的应用程序运行64还是32位),或者让应用程序在64位地址空间中运行(而内核仍为32位)却会带来更好的性能。总结一下:如果一个是64位的(内核或应用程序,或者两者都为),则每次从内核切换为使用空间并返回时,都不必刷新TLB(“翻译后备缓冲区”) RAM访问)。
同样,使用“ long long int”变量(如uint64_t这样的64位变量)也可以提高性能。一个32位CPU可以将两个64位值相加/相除/相减/相乘,但不能在单个硬件操作中进行。相反,它需要将此操作拆分为两个(或更多)32位操作。因此,一个可以在64位数字上正常工作的应用程序将能够直接在硬件中进行64位数学运算,从而提高速度。
最后但并非最不重要的一点是,x86-64架构提供了比经典x86架构更多的寄存器。使用寄存器的速度比使用RAM的速度快得多,CPU拥有的寄存器越多,将寄存器值交换到RAM并变回寄存器的需求就越少。
要了解您的CPU是否可以在64位模式下运行,可以查看各种sysctl变量。例如打开终端并输入
sysctl machdep.cpu.extfeatures
如果列出了EM64T,则您的CPU根据x86-64标准支持64位地址空间。您也可以寻找
sysctl hw.optional.x86_64
如果显示为1(真/启用),则您的CPU支持x86-64位模式;如果显示为0(假/禁用),则不支持。如果根本找不到该设置,则认为它是错误的。
注意:您也可以从本机C应用程序中获取sysctl变量,而无需使用命令行工具。看到
man 3 sysctl
请注意,地址空间可以用于更多(实际)内存。一个人还可以对大型文件进行内存映射,这可以在更奇特的访问模式下提高性能,因为更强大,更高效的块级VM级别的缓存得以实现。在64位上分配大内存块也更安全,因为堆管理器更少可能会遇到地址空间碎片,这将使其无法分配大块。
该线程中所说的某些内容(例如#寄存器加倍)仅适用于x86-> x86_64,通常不适用于64位。就像在x86_64下保证有SSE2、686个操作码和一种廉价的PIC方式这样的事实。这些功能严格来说不是关于64位的,而是关于减少旧版和补救已知的x86限制的。
而且,很多时候人们指出将寄存器加倍是加速的原因,而更可能的是使用默认的SSE2来达到目的(加速memcpy和类似功能)。如果为x86启用了相同的集合,则差异会小得多。(*)(***)
还请记住,通常会涉及初始损失,因为平均数据结构将仅由于指针的大小增加而增加。这也具有缓存效果,但值得注意的是,平均memcpy()(或任何与您的语言等效的内存复制)将花费更长的时间。这只是btw的百分之几,但是上面提到的提速也是如此。
通常,对齐开销在64位体系结构上也更大(以前的32位记录通常仅会变成32位和64位值的混合),从而使结构崩溃的可能性更大。
总体而言,我的简单测试表明,如果驱动程序和运行时库已完全适应,它们将彼此大致抵消,而对于普通应用程序而言,速度没有明显差异。但是,某些应用程序可能突然变得更快(例如,取决于AES)或变得更慢(关键数据结构不断移动/扫描/遍历并且包含很多指针)。尽管这些测试是在Windows上进行的,所以PIC的优化未进行基准测试。
请注意,大多数JIT-VM语言(Java,.NET)平均(内部)使用的指针比C ++多得多。它们的内存使用量可能比普通程序增加的更多,但我不敢将其直接等同于减慢效果(因为它们确实是复杂而又时髦的野兽,并且经常难以测量而无法预测)
Windows 64位默认使用SSE2作为浮点,这似乎可以加快简单操作的速度,并降低复杂的(sin,cos等)操作的速度。
(*)一个鲜为人知的事实是SSE寄存器的数量在64位模式下也翻了一番
(**)多布斯博士几年前有一篇很好的文章。
除了大多数人在这里提到的明显的内存空间问题外,我认为值得一提的是Knuth(以及其他人)最近在谈论的“流行词计算”的概念。通过位操作可以获得很多效率,并且对64位字的按位操作比对32位字的操作要远得多。简而言之,您可以在寄存器中执行更多操作而无需占用内存,并且从性能的角度来看,这是一个巨大的胜利。
看一下Fascicle 1A之前的第4卷,其中有一些我正在谈论的绝妙技巧的示例。
除了具有寻址更多内存的能力以外,x86_64还具有更多寄存器,可让编译器生成更有效的代码。但是,性能提升通常会很小。
x86_64体系结构与x86向后兼容。可以运行未修改的32位操作系统。也可以从64位操作系统运行未修改的32位软件。不过,这将需要所有常用的32位库。它们可能需要单独安装。
该线程已经太长,但是...
大多数答复都集中在您拥有更大的64位地址空间这一事实上,因此您可以寻址更多的内存。对于大约所有应用程序的99%,这是完全不相关的。大声呐喊。
64位良好的真正原因不是寄存器更大,而是寄存器的两倍!这意味着编译器可以将更多的值保留在寄存器中,而不必将它们溢出到内存中,并在以后的一些指令中重新加载它们。如果并且当一个优化的编译器为您展开循环时,它可以展开大约两倍的循环,这确实可以提高性能。
同样,已经定义了用于64位的子例程调用者/被调用者约定,以将大多数传递的参数保留在寄存器中,而不是调用者将它们压入堆栈,而被调用者将其弹出。
因此,仅通过重新编译64位,“典型” C / C ++应用程序即可获得大约10%或15%的性能提升。(假设应用程序的某些部分受计算限制。当然,这是不保证的;所有计算机都以相同的速度等待。您的里程可能会有所不同。)
对于32位计算机,您只有4,294,967,295字节的内存可寻址。对于64位计算机,您具有1.84467441×10 ^ 19字节的内存。
64位处理器计算特定任务(例如大数字的阶乘)的速度是在32位环境中工作的两倍(给出的示例是从32位和64位Windows计算器之间的比较得出的;值得注意的是100000的阶乘) )。这使您对64位优化应用程序的理论可能性有了大致的了解。
尽管64位体系结构无疑使在数字视频,科学计算和大型数据库等应用程序中处理大数据集变得更加容易,但是对于它们还是它们的32位兼容模式是否会比同等价格更快的速度存在争议。用于其他任务的32位系统。在x86-64架构(AMD64)中,大多数32位操作系统和应用程序都可以在64位硬件上平稳运行。
与32位虚拟机相比,Sun的64位Java虚拟机的启动速度较慢,因为Sun仅为64位平台实现了“服务器” JIT编译器(C2)。[9] “客户端” JIT编译器(C1)产生的代码效率较低,但编译速度更快,在64位平台上不可用。
应当注意,在比较32位和64位处理器时,速度不是唯一要考虑的因素。如果部署正确,则多任务,压力测试和群集(用于高性能计算)HPC等应用程序可能更适合于64位体系结构。因此,64位群集已广泛部署在IBM,HP和Microsoft等大型组织中。
Microsoft.com的报价:
在下表中,将基于Windows 64位版本和64位Intel处理器的计算机增加的最大资源与现有的32位资源最大值进行了比较。
Kristof和Poshi指出了32位和64位操作系统之间的主要技术差异,用户体验通常与理论上存在很大差异。迄今为止,Windows的64位消费者版本(XP和Vista)在驱动程序支持方面存在很大的漏洞。我有很多打印机,扫描仪和其他外部设备无法与64位版本一起使用,而32位版本可以正常使用。这些设备具有64位驱动程序,但仍然无法正常工作。在这一点上,我建议您远离任何来自Microsoft的基于64位消费者的应用程序,直到您从真正的最终用户那里了解到Windows 7如何处理此问题为止,而不仅仅是当前可以使用它的超级极客。给它至少六个月的时间,看看人们正在经历什么。
关于Microsoft Windows的这一点的另一点是,多年以来一直存在Win32 API,该Win32 API用于32位操作系统,并且未针对64位编译进行优化。当我为应用程序编写一些DLL时,我通常会在Win32中进行编译,而Win32并不是64位版本。在Vista之前,我相信没有很多成功的64位Windows版本,因为我的工作场所是我的新机器具有4 GB的RAM,但是我仍在使用32位Windows XP Pro,因为它是已知的稳定O / S相对于XP64或Vista。
我认为您可能还想回顾一下从16位转换到32位的情况,以了解更多有关为何这种转换对某些人来说很重要的更多详细信息。公司可能在台式机上运行的任务关键型应用程序(例如小型会计程序包)可能无法在64位操作系统上运行,因此有必要使虚拟机或虚拟机始终处于旧状态。
更改地址的大小可能会产生很大的影响和影响。
对于大多数实际目的,您可能不会注意到差异。
您必须具有64位CPU(最近几年中的大多数CPU)才能安装64位操作系统。
64位操作系统有一些优点:
在大多数情况下,64位程序会使用更多的内存,但是对于个人计算机,通常不会注意到这一点。