一个32位处理器和1GB内存可以获得多少个内存地址,而一个64位处理器可以得到多少个内存地址?
我认为是这样的:
1GB的RAM除以32位还是除以4?获得多少个内存地址?
但是我不确定。这就是为什么我问。
我在维基百科上说,1个内存地址是32位宽或4个八位位组(1个八位字节= 8位),而64位处理器是1个内存地址或1个整数是64位宽或8个八位位组。但是也不知道我是否正确理解了。
一个32位处理器和1GB内存可以获得多少个内存地址,而一个64位处理器可以得到多少个内存地址?
我认为是这样的:
1GB的RAM除以32位还是除以4?获得多少个内存地址?
但是我不确定。这就是为什么我问。
我在维基百科上说,1个内存地址是32位宽或4个八位位组(1个八位字节= 8位),而64位处理器是1个内存地址或1个整数是64位宽或8个八位位组。但是也不知道我是否正确理解了。
Answers:
简短答案:可用地址的数量等于以下较小者:
以上内容的详细答案和解释:
内存由字节(B)组成。每个字节由8位(b)组成。
1 B = 8 b
1 GB的RAM实际上是1 GiB(千兆字节,不是千兆字节)。区别在于:
1 GB = 10^9 B = 1 000 000 000 B
1 GiB = 2^30 B = 1 073 741 824 B
无论CPU机器字有多大,内存的每个字节都有其自己的地址。例如。Intel 8086 CPU是16位的,它按字节寻址内存,现代的32位和64位CPU也是。这就是第一个限制的原因-您的地址不能超过内存字节。
内存地址只是CPU从内存开头跳到要查找的字节数。
现在,您必须知道32位的实际含义。如前所述,它是一个机器字的大小。
机器字是CPU用于保存数字(在RAM,高速缓存或内部寄存器中)的内存量。32位CPU使用32位(4字节)保存数字。内存地址也是数字,因此在32位CPU上,内存地址由32位组成。
现在考虑一下:如果有一位,则可以在其上保存两个值:0或1。再增加一位,则有四个值:0、1、2、3。在三个位上,可以保存八个值:0,1,2 ... 6,7,7.这实际上是一个二进制系统,它的工作方式如下:
Decimal Binary
0 0000
1 0001
2 0010
3 0011
4 0100
5 0101
6 0110
7 0111
8 1000
9 1001
10 1010
11 1011
12 1100
13 1101
14 1110
15 1111
它的工作原理与通常的加法完全相同,但最大位数为1,而不是9。十进制为0 0000
,则将其加1并得到0001
,再加一次,则得到0010
。这里发生的情况就像是十进制09
加一个:将9更改为0,然后递增下一位。
从上面的示例中,您可以看到始终有一个最大值,可以保留位数不变的数字-因为当所有位数均为1并尝试将值增加1时,所有位数都会变为0,从而破坏数。这称为整数溢出,会给用户和开发人员造成许多不愉快的问题。
11111111 = 255
+ 1
-----------
100000000 = 0 (9 bits here, so 1 is trimmed)
可能的最大数目始终为2 ^ N-1,其中N为位数。如前所述,内存地址是一个数字,并且也有一个最大值。因此,机器字的大小也限制了可用内存地址的数量-有时您的CPU无法处理足够大的数字以寻址更多的内存。
因此,在32位上,您可以保留0到2 ^ 32-1之间的数字,即4 294 967295。它比1 GB RAM中的最大地址还多,因此在特定情况下,RAM的数量将成为限制因素。
理论上,32位CPU的RAM限制为4 GB(2 ^ 32),而对于64位CPU,则为16 EB(艾字节,1 EB = 2 ^ 30 GB)。换句话说,64位CPU可以访问整个Internet ... 200倍;)(由WolframAlpha估计)。
但是,在实际的操作系统中,32位CPU可以寻址大约3 GiB的RAM。那是因为操作系统的内部体系结构-一些地址保留用于其他目的。您可以在Wikipedia上了解有关此所谓的3 GB障碍的更多信息。您可以使用“ 物理地址扩展”取消此限制。
说到内存寻址,我应该提到的东西很少:虚拟内存,分段和分页。
正如@Daniel R Hicks在另一个答案中指出的那样,操作系统使用虚拟内存。这意味着应用程序实际上不是在实际的内存地址上运行,而是由OS提供的地址。
此技术允许操作系统将某些数据从RAM移到所谓的Pagefile(Windows)或Swap(* NIX)中。HDD比RAM慢几个数量级,但是对于很少访问的数据来说,这并不是一个严重的问题,它使OS为应用程序提供的RAM比实际安装的更多。
到目前为止,我们所说的是平面寻址方案。
分页是一种替代性的寻址方案,它允许寻址更多的内存,这通常是在平面模型中使用一个机器字即可实现的。
想象一下,一本书充满了四个字母的单词。假设每页上有1024个数字。要寻址数字,您必须知道两件事:
现在,这正是现代x86 CPU处理内存的方式。它分为4 KiB页(每页1024个机器字),并且这些页都有数字。(实际上,页面也可以是4 MiB或2 PA具有PAE)。当您要寻址存储单元时,需要该页中的页码和地址。请注意,每个存储单元仅由一对数字引用,分段不会如此。
好吧,这与分页非常相似。仅举一个例子,它用于Intel 8086。地址组现在称为内存段,而不是页面。不同之处在于,细分可以重叠,而且确实重叠很多。例如,在8086上,大多数存储单元可从4096个不同的段中获得。
一个例子:
假设我们有8个字节的内存,除第4个字节等于255外,其他所有字节均为零。
平面内存模型的插图:
_____
| 0 |
| 0 |
| 0 |
| 255 |
| 0 |
| 0 |
| 0 |
| 0 |
-----
具有4字节页面的页面内存的插图:
PAGE0
_____
| 0 |
| 0 |
| 0 | PAGE1
| 255 | _____
----- | 0 |
| 0 |
| 0 |
| 0 |
-----
4字节段移位1的分段存储器的示意图:
SEG 0
_____ SEG 1
| 0 | _____ SEG 2
| 0 | | 0 | _____ SEG 3
| 0 | | 0 | | 0 | _____ SEG 4
| 255 | | 255 | | 255 | | 255 | _____ SEG 5
----- | 0 | | 0 | | 0 | | 0 | _____ SEG 6
----- | 0 | | 0 | | 0 | | 0 | _____ SEG 7
----- | 0 | | 0 | | 0 | | 0 | _____
----- | 0 | | 0 | | 0 | | 0 |
----- ----- ----- -----
如您所见,可以通过四种方式寻址第4个字节:(从0开始寻址)
它总是相同的存储单元。
在实际的实现中,段的偏移量超过1个字节(对于8086,它为16个字节)。
分段的不好之处在于它很复杂(但是我想您已经知道了;)好是,您可以使用一些聪明的技术来创建模块化程序。
例如,您可以将某个模块加载到一个段中,然后假装该段小于其实际大小(恰好可以容纳该模块),然后选择与该伪较小段不重叠的第一个段并加载下一个模块, 等等。基本上,您通过这种方式获得的页面是可变大小的页面。
除上述内容外,请注意,还使用了虚拟寻址以及多个地址空间。因此,即使您只有1GB的RAM,程序在概念上也可以使用多达4GB的虚拟内存(尽管大多数操作系统会将其限制为小于此值)。从概念上讲,您可以拥有(几乎)无限数量的4GB地址空间。
RAM的大小不会(最大程度上)限制程序的最大大小或可以运行的程序数量,而是会限制性能。当实际内存变为“过量使用”,并且系统在RAM与磁盘之间来回“交换”内存的“页面”时,系统开始“崩溃”,性能急剧下降。
1GB的RAM将占用1024 * 1024 * 1024字节或1,073,741,824字节。
32位处理器始终具有4 * 1024 * 1024 * 1024字节,或4,294,967,296字节的地址空间 。1 GB的RAM出现在此空间中。在Intel处理器上,一些中断向量需要在地址0处出现,因此物理RAM从地址0开始并上升。
其他内容也会出现在该地址空间中,例如BIOS和选件ROM(在前1Mbyte中为高384Kbyte),I / O设备(如APIC)和视频RAM。我还不完全了解的系统管理模式“ SMRAM”还会发生一些奇怪的事情。
从内核的角度来看,这是物理地址空间。MMU可以以任何方式将所有这些重新排列到用户空间进程。
32位处理器最多可寻址2 ^ 32个单独的内存字节(约4GB),但是拥有1GB的内存将使1 * 1024 * 1024 * 1024可寻址的字节内存(尽管您可能仍具有2 ^ 32的虚拟地址空间) )。一个64位的CPU可以寻址2 ^ 64个单独的字节,但是我认为大多数系统只使用48位作为内存地址的上限。可寻址字节2 ^ 48。
接受的答案给出了很好的解释。但是我不认为这是答案。它不包含有关地址总线的任何内容。而其大小实际上是内存受限的主要原因。例如8080是8位处理器(其数据总线的大小是8位),但是它具有16位地址总线。它可以寻址2 ^ 16 =(2 ^ 6)*(2 ^ 10)= 64 * 1024字节= 64KB。
您可以在“技术历史记录”部分中找到更多信息(32位)。
我相信最基本的信息在这次对话中丢失了,所以这是我的答案:
说“这是一个32位处理器”意味着cpu一次可以理解和使用的指令大小或命令大小是32位。与64位处理器类似:它们最多可以处理64位指令。
可以将其想像成一台旧的机械计算器:您只有这么多的数字,因此根本无法输入更多的数字。
现在,CPU可以使用的地址也必须适合相同的空间,因此对于32位处理器,其使用的地址最多也只能是32位。因此,从这里我们可以简单地计算最大地址数(即,CPU可以使用的最大RAM数量):
2 ^ 32 = 4294967296(= 4 GB)
要么
2 ^ 64 = 18446744073709551616(=更多;)
或者,作为一个有趣的例子,我的旧Commodore 64具有16位CPU,因此它能够管理以下内存:
2 ^ 16 = 65536字节(= 64 KB)
这是基本逻辑,但是,如前所述,有很多方法可以解决此限制,例如虚拟地址空间,内存映射等。