使用 32 位处理器和 1GB RAM 我们可以得到多少个内存地址,使用 64 位处理器可以获得多少个内存地址?
我认为它是这样的:
1GB 内存除以 32 位还是除以 4?以获取内存地址的数量?
但我不确定。所以我才问。
我在维基百科上看到,1 个内存地址是 32 位宽或 4 个八位字节(1 个八位字节 = 8 位),而 64 位处理器中 1 个内存地址或 1 个整数是 64 位宽或 8 个八位字节。但我也不知道我理解得是否正确。
答案1
简短回答:可用地址的数量等于下列地址中较小者:
- 内存大小(以字节为单位)
- CPU 机器字中可以保存的最大无符号整数
以上内容的长答案和解释:
内存由字节(B)组成。每个字节由 8 位(b)组成。
1 B = 8 b
1 GB 的 RAM 实际上是 1 GiB(gibibyte,不是 gigabyte)。区别在于:
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 必须从内存开头跳过的字节数才能到达其要查找的地址。
- 要访问第一个字节,它必须跳过 0 个字节,因此第一个字节的地址是 0。
- 要访问第二个字节,它必须跳过 1 个字节,因此其地址为 1。
- (等等……)
- 为了访问最后一个字节,CPU 跳过 1073741823 个字节,因此其地址是 1073741823。
现在你必须知道 32 位实际上意味着什么。正如我之前提到的,它是一个机器字的大小。
机器字是 CPU 用于保存数字的内存量(在 RAM、缓存或内部寄存器中)。32 位 CPU 使用 32 位(4 字节)来保存数字。内存地址也是数字,因此在 32 位 CPU 上,内存地址由 32 位组成。
现在想想:如果你有一位,你可以在其上保存两个值:0 或 1。再添加一位,你就会有四个值:0、1、2、3。在三位上,你可以保存八个值:0、1、2......6、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)
- 对于 1 位来说,最大值是 1,
- 2位-3,
- 3位-7,
- 4 位 - 15
最大可能数始终是 2^N-1,其中 N 是位数。如前所述,内存地址是一个数字,它也有最大值。这就是为什么机器字的大小也是可用内存地址数量的限制 - 有时您的 CPU 无法处理足够大的数字来寻址更多内存。
因此,在 32 位上,您可以保存从 0 到 2^32-1 的数字,也就是 4 294 967 295。它大于 1 GB RAM 中的最大地址,因此在您的特定情况下,RAM 数量将是限制因素。
理论上,32 位 CPU 的 RAM 限制为 4 GB(2^32),而 64 位 CPU 的 RAM 限制为 16 EB(EB,1 EB = 2^30 GB)。换句话说,64 位 CPU 可以处理整个互联网……200 次;)(估计WolframAlpha)。
然而,在实际操作系统中,32 位 CPU 可以寻址大约 3 GiB 的 RAM。这是由于操作系统的内部架构 - 一些地址被保留用于其他目的。您可以阅读有关这个所谓的维基百科上的 3 GB 壁垒。您可以使用以下方式解除此限制物理地址扩展。
说到内存寻址,我应该提几点:虚拟内存,分割和分页。
虚拟内存
正如@Daniel R Hicks 在另一个答案中指出的那样,操作系统使用虚拟内存。这意味着应用程序实际上并不操作实际的内存地址,而是操作操作系统提供的内存地址。
这种技术允许操作系统将一些数据从 RAM 移动到所谓的页面文件 (Windows) 或交换 (*NIX)。HDD 比 RAM 慢几个数量级,但对于很少访问的数据来说,这不是一个严重的问题,它允许操作系统为应用程序提供比您实际安装的更多的 RAM。
分页
到目前为止我们所讨论的是平面寻址方案。
分页是一种替代寻址方案,它允许寻址比在平面模型中使用一个机器字通常所能寻址的更多的内存。
想象一下一本充满 4 个字母的单词的书。假设每页有 1024 个数字。要寻址一个数字,您必须知道两件事:
- 打印该单词的页数。
- 该页面上的哪个单词就是您要查找的单词。
现在,这正是现代 x86 CPU 处理内存的方式。它被划分为 4 KiB 页(每页 1024 个机器字),这些页都有编号。(实际上,页也可以是 4 MiB 大或 2 MiB,聚丙烯酰胺凝胶电泳)。当您想要寻址存储单元时,您需要页码和该页中的地址。请注意,每个存储单元都由一对数字引用,而分段则不是这种情况。
分割
嗯,这个与分页非常相似。举个例子,它曾用于 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 开始寻址)
- 段 0,偏移量 3
- 段 1,偏移 2
- 段 2,偏移 1
- 段 3,偏移量 0
它始终是同一个记忆单元。
在实际实现中,段移动超过 1 个字节(对于 8086 来说是 16 个字节)。
分割的不好之处在于它很复杂(但我想你已经知道这一点;)它的好处是,你可以使用一些巧妙的技术来创建模块化程序。
例如,您可以将某个模块加载到某个段中,然后假装该段比实际要小(刚好能容纳模块),然后选择第一个不与该伪较小段重叠的段并加载下一个模块,依此类推。基本上,通过这种方式,您可以获得大小可变的页面。
答案2
1GByte 的 RAM 将占用 1024*1024*1024 字节,即 1,073,741,824 字节。
32 位处理器始终具有 4*1024*1024*1024 字节,或 4,294,967,296 字节地址空间 1GB 的 RAM 位于此空间内。在 Intel 处理器上,一些 RAM 需要出现在地址 0 处以用于中断向量,因此物理 RAM 从地址 0 开始向上扩展。
该地址空间中还包含其他内容,例如 BIOS 和选项 ROM(在前 1Mbyte 中的上部 384Kbytes 中)、I/O 设备(如 APIC)和视频 RAM。系统管理模式“SMRAM”中还存在一些奇怪的内容,我目前还不完全理解。
注意,从内核的角度来看,这是物理地址空间。MMU 可以以任何方式将所有这些重新排列到用户空间进程。
答案3
除上述内容外,请注意虚拟的寻址被使用,以及多个地址空间。因此,即使您只有 1GB 的 RAM,程序在概念上也可以使用最多 4GB 的虚拟内存(尽管大多数操作系统会将其限制为低于此值)。并且从概念上讲,您可以拥有(几乎)无限数量的此类 4GB 地址空间。
RAM 大小不会(在很大程度上)限制程序的最大大小或可以运行的程序数量,而是限制性能。当实际内存“过度使用”且系统开始“颠簸”时,它会在 RAM 和磁盘之间来回“交换”内存“页面”,性能就会下降。
答案4
接受的答案给出了很好的解释。但我不认为这是答案。它没有包含任何关于地址总线而其大小实际上是内存限制的主要原因。例如 8080 是 8 位处理器(其大小数据总线是8位的,但是地址总线是16位的,可以寻址2^16=(2^6)*(2^10)=64*1024字节=64KB。
您可以找到更多此处(32 位)在“技术历史”部分。