我是编程新手,来自非CS背景(没有正式学位)。我主要使用C#编写winforms。
我对32位和64位感到困惑....我的意思是,已经听说过32位操作系统,32位处理器以及程序可以拥有的最大内存。它如何影响程序的速度。还有很多问题不断浮现在脑海中。
我试图浏览一些计算机组织和架构书籍。但是,要么我太笨了,不能理解写在那里的内容,要么作者认为读者有一些CS背景。
有人可以用简单的简单英语解释这些事情,或者指出我做的事情。
编辑:我读过像32位模式这样的东西,它们最多可以访问4GB内存;在64位模式下,他们可以访问更多....我想知道为什么这样的事情。
BOUNTY :下面的答案非常好......尤其是马丁。但是,我正在寻找一个彻底的解释,但用简单的英语。
答案 0 :(得分:39)
这真的归结为电线。
在数字电路中,只有0和1(通常是低电压和高电压)可以从一个元件(CPU)传输到另一个元件(存储器芯片)。如果我只有1根线,我每个时钟周期只能在线上发送1或0。这意味着我只能处理2个字节(假设字节寻址,并且整个地址仅在1个周期内传输以获得速度!)。
如果我有2根线,我可以寻址4个字节。因为我可以通过两条线发送:(0,0),(0,1),(1,0)或(1,1)。所以基本上它是电线数量的2。
因此,如果我有32根线,我可以寻址4 GB,如果我有64根线,我可以解决更多问题。
工程师可以采取其他技巧来解决比电线允许的更大的地址空间。例如。将地址分成两部分,在第一个周期发送一半,在下一个周期发送后半部分。但这意味着你的内存界面将快一半。
在这里编辑我的评论(未经编辑);)并且如果有人有任何有趣的东西也可以将它作为维基。
与其他提到的评论一样,2 ^ 32(2的功率为32)= 4294967296,即4 GB。而2 ^ 64是18,446,744,073,709,551,616。为了进一步挖掘(你可能在Hennesey& Patterson中读到这一点)处理器包含它用作“临时空间”的寄存器,用于存储其计算结果。 CPU只知道如何进行简单算术并知道如何移动数据。当然,这些寄存器的大小与其架构的“#-bits”的位宽相同,因此32位CPU的寄存器为32位宽,64位CPU的寄存器为64位宽。
当涉及浮点(处理双精度)或其他SIMD指令(单指令,多数据命令)时,会有例外。 CPU加载数据并将数据保存到主存储器(RAM)中。由于CPU还使用这些寄存器来计算内存地址(物理和虚拟),因此它可以寻址的内存量也与寄存器的宽度相同。有些CPU使用特殊的扩展寄存器来处理地址计算,但是在工程师意识到需要它之后,我会称之为“思考后”。
目前,64位对于解决实际物理内存非常重要。由于实用性,在将CPU连接到存储器时,大多数64位CPU将省略相当多的电线。使用宝贵的主板不动产来运行总是有0的电线是没有意义的。更不用说为了拥有当今DIMM密度的最大RAM量需要40亿个dimm插槽:)
除了增加的内存量之外,64位处理器为大于2 ^ 32的整数提供更快的计算。以前编程器(或编译器,也由程序员编程;)必须通过占用两个32位寄存器并处理任何溢出情况来模拟具有64位寄存器。但是在64位CPU上,它将由CPU本身处理。
缺点是64位CPU(一切都相同)比32位CPU消耗的功率更多,这是因为(大约)所需电路量的两倍。然而,实际上你永远不会得到相同的比较,因为较新的CPU将在较新的硅工艺中制造,具有较少的功率泄漏,允许您在相同的芯片尺寸中填充更多电路等。但是64位架构将消耗两倍的功率记忆。与使用固定指令大小的架构相比,曾经被认为是“丑陋”的x86可变指令长度实际上是一个优势。
答案 1 :(得分:39)
让我们试着通过查看人与计算机来回答这个问题;希望这能为你解释一些事情:
因此,我们在人与计算机之间存在根本区别:要从内存中调用信息,计算机需要提供地址,而人们则不需要。 (从某种意义上说,可以说“你的电话号码”是一个地址,因为它提供的信息不同于“你的生日”,但这是另一个对话。)
这也适用于计算机,但由于它们是二进制计算机而不是十进制计算机,因此添加了一个额外的二进制数字(位)仅将范围增加 2 。
解决范围:这一切意味着64位计算机可以存储和检索多多于32位计算机的信息。对于大多数用户而言,这并不意味着很多,因为浏览网页,查看电子邮件和播放Solitaire等内容都能在32位寻址范围内轻松完成。 64位的好处将真正发挥作用的地方是你拥有大量数据的领域,计算机将不得不通过这种方式。数字信号处理,千兆像素摄影和高级3D游戏都是其大量数据处理在64位环境中得到巨大提升的领域。
答案 2 :(得分:32)
许多现代处理器可以以两种模式运行:32位模式和64位模式。在32位模式下,它们可以访问高达4GB的内存;在64位模式下,他们可以访问更多。较旧的处理器仅支持32位模式。
操作系统选择在以下模式之一中使用处理器:在安装时,可以选择是以32位模式还是以64位模式操作处理器。即使处理器可以继续以64位模式运行,从32位切换到64位也需要重新安装系统。较旧的系统仅支持32位模式。
也可以在32位或64位模式下编写(或编译)应用程序。这里的兼容性更加棘手,因为处理器在64位模式下运行时仍然可以支持32位应用程序作为仿真功能。因此,在64位操作系统上,您可以运行32位应用程序或64位应用程序。在32位操作系统上,您只能运行32位应用程序。
同样,选择大小主要取决于您要访问的主内存量。在许多系统上,32位应用程序通常限制为2GB,因为系统本身需要一些地址空间。
从性能(速度)的角度来看,没有显着差异。 64位应用程序可能会慢一点,因为它们使用64位指针,因此对于给定的操作,它们需要更多的内存访问。同时,它们也可能更快一些,因为它们可以作为一条指令执行64位整数运算,而32位处理器需要使用多条指令来模拟它们。但是,这些64位整数运算相当罕见。
人们也可能想知道在64位处理器上运行32位应用程序的成本是多少:在AMD64和Intel64处理器上,这种仿真模式主要是硬件,因此运行32时没有真正的性能损失。本地应用程序。这在Itanium上有很大不同,其中32位(x86)应用程序的仿真效果非常差。
答案 3 :(得分:18)
让我告诉你宾维尔的故事,这是一个偏僻的小镇。宾维尔有一条通向它的道路。每个来到或离开宾维尔的人都必须在这条路上开车。但当你走近小镇时,有一个叉子。你可以左转或右转。
事实上,除了通往房屋的道路外,每条道路都有一个叉子。那些道路只是在房子里结束了。没有一条道路有名字;由于Binville计划委员会创建了一个巧妙的解决方案,他们不需要名字。这是Binville的地图,显示了道路和房屋:
------- [] 00
/
------
/ \
/ ------- [] 01
-----
\ ------- [] 10
\ /
------
\
------- [] 11
如您所见,每个房子都有一个两位数的地址。只有那个地址足以a)唯一地标识每个房子(没有重复)和b)告诉你如何到达那里。你知道,很容易到达城镇。每个前叉都标有零或一个,计划委员会称之为Binville交叉跟踪器,或简称位。当您接近第一个分支时,请查看地址的第一位。如果它是零,则向左走;如果它是一个,那就走吧。当你到达第二个叉子时,请查看第二个数字,然后根据需要向左或向右移动。
假设你想拜访住在宾维尔的朋友。她说她住在10号房子里。当你到达宾维尔的第一个叉子时,向右走(1)。然后在第二个叉子,向左(0)。你在那儿!
宾维尔已经存在了好几年,但是关于其田园诗般的环境,优秀的公园系统和慷慨的医疗保健,这个词开始流传。 (毕竟,如果你不需要在路牌上花钱,你可以用更好的东西。)但是有一个问题。只有两位,寻址方案仅限于四个房子!
所以规划委员会把他们的头放在一起并提出了一个计划:他们会为每个地址增加一点,从而使房屋数量增加一倍。为了实施该计划,他们将在城镇边缘建立一个新的分支,每个人都会得到新的地址。这是新地图,展示了通往城镇的新叉子和宾维尔的新部分:
------- [] 000
/
------
/ \
/ ------- [] 001
----- Old Binville
/ \ ------- [] 010
/ \ /
/ ------
/ \
/ ------- [] 011
--
\ ------- 100
\ /
\ ------
\ / \
\ / ------- [] 101
----- New Binville (some homes not built yet)
\ ------- 110
\ /
------
\
------- 111
您是否注意到Binville原始部分中的每个人只是在他们的地址前面添加了零?新位表示构建的新交叉点。当位数增加1时,地址数量增加一倍。市民们总是知道他们城镇的最大规模:他们所要做的就是计算两个上升到比特数的值。有了三位,它们可以有2个 3 = 8个房子。
几年过去了,宾维尔又一次满负荷运转。越来越多的人想搬进来,所以又增加了一点(连同必要的十字路口),将小镇的面积扩大到十六间。然后是另一个,另一个,另一个...... Binville的地址很快就达到了16位,最多可以容纳2个 16 (16,384)个房子,但这还不够。人们不断前来!
因此,计划委员会决定一劳永逸地解决问题:他们会一直跳到32位。有超过40亿个家庭(2 32 )的足够地址,当然这就足够了!
这是......大约二十五年,当时宾维尔不再是一个不知名的小镇。它现在是一个主要的大都市。事实上,它已经变得像拥有数十亿居民的整个国家一样大。但公园仍然很好,每个人都有很好的医疗保健,所以人口不断增长。
面对不断增加的人口,计划委员会再次集思广益,并提出另一次扩建城市。这次他们会使用64位。你知道现在Binville市区内有多少房子可以容纳吗?那是对的:18,446,744,073,709,551,616。这个数字是如此之大,我们可以填充大约20亿个地球,并给每个人自己的地址。
使用64位并不是解决所有寻址问题的灵丹妙药。地址占用的空间是旧32位地址的两倍。更糟糕的是,一些公民尚未更新他们的地址以使用新的64位格式,因此他们被迫进入城市的围墙部分专门为那些仍在使用32位地址的人保留。但这没关系:使用32位的人可以访问足够的城市以满足他们的需求。他们觉得还不需要改变。
64位是否足够?谁知道此时,但宾维尔市民正在等待宣布128位地址...
答案 4 :(得分:3)
马丁的回答大多是正确和详细的。
我想我只会提到所有内存限制都是每应用程序虚拟内存限制,而不是计算机中实际物理内存的限制。实际上,即使在32位系统中,也可以在单个应用程序中使用超过4Gb的内存,它只需要更多的工作,因为它不能一次使用指针访问。 link text
未提及的另一件事是传统x86处理器和x86-64之间的区别不仅在于指针大小,还在指令集中。虽然指针更大并且占用更多内存(8个字节而不是4个),但它可以通过更大的寄存器集(15个通用寄存器而不是8个,iirc)进行补偿,因此对于执行计算工作的代码来说,性能实际上更好。 / p>
答案 5 :(得分:2)
马丁的回答非常好。只是添加一些额外的点...因为你提到.NET,你应该注意到CLI / JIT在x86和x64之间有一些区别,有不同的优化(例如,尾调用),以及一些微妙的高级不同行为像volatile
这样的东西。这可能会对您的代码产生影响。
此外,并非所有代码都适用于x64。任何使用 DirectX或某些COM功能的东西都可能会遇到困难。不是性能功能,但重要的是要知道。
(我删除了“DirectX” - 我可能会在那里谈论垃圾......但只是:你需要检查你所依赖的任何东西在你的目标平台上是否稳定)
答案 6 :(得分:2)
将通用计算机内存视为具有数十亿平方的大型宾果卡。为了解决电路板上的任何单个方块,有一个方案可以标记每一行和每列B-5,I-12,O-52 ..等等。
如果卡片上有足够的方块,那么你的字母就会用完,所以你需要开始重复使用更多的字母并写下更大的数字才能继续唯一地对每个方格进行寻址。
在您知道之前,播音员正在大肆宣传巨大的数字和字母组合,让您知道在您的100亿平方卡上标记哪个方格。 BAZC500000,IAAA12000000,OAAAAAA523111221
计算机的位数指定了字母和数字复杂度的限制,以解决任何特定方块。
32位表示如果卡大于2 ^ 32个方块,则计算机没有足够的电线和转换器,以允许它唯一地物理地寻址读取值所需的任何特定方块或将新值写入指定的值记忆位置。
64位计算机可以单独处理大量的2 ^ 64个方块..但要这样做,每个方块需要更多的字母和数字,以确保每个方块都有自己唯一的地址。这就是64位计算机需要更多内存的原因。
寻址限制的其他常见示例是本地电话号码。它们通常是7位数111-2222或重新格式化为1,112,222 ...当有超过9,999,999人需要他们自己的电话号码时会发生什么?您添加区号和国家/地区代码,您的电话号码从7位数到10位数到11位,占用更多空间。
如果您熟悉即将发生的IPv4短缺问题同样存在问题.. IPv4地址是32位意味着只有2 ^ 32(~40亿)唯一的IP地址可能存在,并且今天有更多的人存在
我提到的所有方案(计算机,电话号码,IPv4地址)都有开销,其中某些部分是为组织目的而保留的,因此可用空间要少得多。
64位世界的性能承诺是,不是一次发送4个字节(ABCD),而是64位计算机一次可以发送8个字节(ABCDEFGH),因此字母表在不同的内存区域之间传输速度是32位计算机的两倍。对于某些应用程序而言,如果它们可以使用更多内存,那么它们运行得更快也会带来好处。
在现实世界中,intel等人的64位桌面处理器并不是真正的64位处理器,并且仍然限制为32位用于几种类型的操作,所以在现实世界中32位和64位之间的性能比特应用程序是边缘的。 64位模式为您提供了更多硬件寄存器,可以提高性能,但在“假”64位处理器上增加内存也会损害某些区域的性能,因此它通常是一种清洗方式。将来,当桌面处理器完全成为64位时,我们将看到更多的性能提升。
答案 7 :(得分:2)
我不认为我在之前的答案中看到了很多'注册'这个词。数字计算机是一堆寄存器,具有用于存储数据和程序的算术和存储器的逻辑。
但首先......数字计算机使用数字的二进制表示,因为二进制数字('位')0和1很容易用开关的两个状态(开/关)表示。早期的计算机使用机电开关;现代计算机使用晶体管因为它们更小更快。 很多更小,更多更快。
在CPU内部,开关在有限长度的寄存器中组合在一起,并且通常在整个寄存器上执行操作:例如,将该寄存器添加到该寄存器,依此类推。正如您所料,32位CPU的寄存器长度为32位。我在这里简化,但请耐心等待。
将计算机存储器组织为一系列“位置”是有意义的,每个位置与CPU寄存器保持相同的位数:例如,从该存储器位置加载该寄存器。实际上,如果我们将内存视为 bytes ,那只是寄存器的一个方便部分,我们从一系列内存位置(1,2,4,8)中加载一个寄存器。
随着晶体管变小,可以在计算机芯片的有限空间内实现用于更复杂算术的附加逻辑。 CPU房地产始终溢价。
但随着芯片制造的改进,可以在更大的芯片上可靠地制造更多的晶体管。寄存器可以更长,它们之间的路径可以更宽。
当保存存储器位置地址的寄存器较长时,它们可以处理较大的存储器,并且可以在较大的块中处理数据。结合更复杂的算术逻辑,事情变得更快。
并不是我们之后所有之后的事情吗?
答案 8 :(得分:1)
解释为什么32位模式只能访问4GB的RAM:
最大可访问内存空间= 2 n 字节,其中n是体系结构的字长。因此,在32位架构中,最大可访问内存空间为2 32 = 4294967296 = 4GB RAM。
64位架构可以访问2 64 =很多内存。
刚刚注意到Tchens发表的评论。无论如何,没有CS背景,是的计算机组织和架构书籍最多也难以理解。
答案 9 :(得分:1)
1111111111111111
二进制(= 2 0 +2 1 +2 2 ... + 2 15 = 2 16 -1)1111
开始的所有操作码都保留供将来使用”我希望这会有所帮助。
答案 10 :(得分:0)
值得注意的是,某些应用程序(例如多媒体编码/解码和渲染)在完全利用64位写入时会获得显着的(2x)性能提升。
的32位与64位基准答案 11 :(得分:0)
非CS人士。 64位将更好地用于计算(各种)它也会很好,它将允许你有更多的RAM。
此外,如果您的RAM有限(例如VPS或小型RAM专用服务器) - 选择32位,那么服务的内存就会减少。
答案 12 :(得分:0)
这是一个非常简单的解释,因为上面的所有内容都非常详细。
32位是指寄存器。寄存器是存储数据的地方,所有程序都通过操作这些东西来操作。装配直接对它们进行操作(因此人们为什么常常兴奋地在装配中进行编程)。
32位表示基本寄存器组可以保存32位信息。不出所料,64位意味着64位信息。
为什么这会让程序更快?因为您可以更快地完成更大的操作。顺便说一句,它只会使某些类型的程序更快。通常,游戏可以充分利用优化每个处理器,因为它们具有数学运算(因此可以使用寄存器)。
但有趣的是,正如tchen所提到的,他们还有很多其他“东西”可以让你无论如何都可以进行更大规模的操作。即使在'32位'系统上,SSE,SSE2等也将具有64位寄存器和128位寄存器。
基于(我想象)Windows特定的内存寻址系统,增强的内存寻址能力直接说明了基本寄存器大小的增加。
希望有所帮助。其他海报比我准确得多,我只是想简单地解释一下(这对我知之甚少有帮助:)。
答案 13 :(得分:0)
我对这个问题有一个很好的答案,但它并不适合这个答案块....简单的答案是,为了让你的程序从内存中获取一个字节,它需要一个地址。在32位CPU中,每个字节的存储器地址存储在32位(无符号)整数中,最大值为4 GB。当您使用64位处理器时,内存地址是64位整数,它为您提供大约1.84467441×10 ^ 19个可能的内存地址。如果您不熟悉编程,这真的应该足够了。你应该更专注于学习如何编程,而不是处理器的内部工作,以及为什么你不能在32位CPU上访问超过4 GB的RAM。
答案 14 :(得分:0)
用32位处理器解释可寻址存储器范围的简单答案是:
让我们假设您只允许构造3位数字,因此最大数量u可以达到999.数字范围是(0 - 999)。您只需要使用1000个号码。
但如果允许你有6位数字,那么你可以构造的最大数字是999999.现在范围是(0 - 999999)。所以现在你有100万个号码可以使用。
同样,您可以在处理器中拥有更多位,更大的地址集(上例中的数字),您可以构建并最终用于存储数据等。
任何比这更简单的事情都会让人感兴趣!
-AD。