(一个内存地址能存多少)我电脑里的RAM能容纳多少个内存地址?
我电脑里的RAM能容纳多少个内存地址?
有时候,查看计算经验的表面级别是很有趣的,而其他日子,深入研究内部工作是很有趣的。今天,我们来看看计算机内存的结构,以及您可以将多少东西打包到一个RAM中。
今天的问答环节是由超级用户提供的,这是Stack Exchange的一个细分部门,这是一个由社区驱动的Q&A网站分组。
问题
超级用户读取器JohanSmohan正在努力解决处理器类型和内存大小如何协同工作以生成总地址。他写道:
使用32位处理器和1GB内存可以获得多少个内存地址,使用64位处理器可以得到多少个内存地址?
我想是这样的:
1GB的RAM除以32位4位(?)才能得到内存地址的数目?
我在维基百科上读到,一个内存地址是32位宽或4位字节(1位字节=8位),而64位处理器中有1个内存地址或1个整数是64位宽或8位字节。但我也不知道我是否正确地理解了它。
这些问题可以让一个好奇的极客在晚上熬夜。在Johan的假设系统中,有多少个地址可用?
答案
超级用户贡献者Gronostaj对RAM的划分和使用提供了一些见解:
简短答覆:可用地址的数目等于较小的地址:
- 内存大小(以字节为单位)
- 最大的无符号整数,可以保存在cpu的机器字中。
对上述问题的详细答复和解释如下:
内存由字节(B)组成。每个字节由8位(B)组成。
1 B = 8 b1GB的RAM实际上是1GIB(千兆字节,而不是千兆字节)。不同之处是:
1 GB = 10^9 B = 1 000 000 000 B1 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。在三位上,您可以保存8个值:0,1,2…。6,7.这实际上是一个二进制系统,它的工作方式如下:
Binary Decimal0 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^N1,其中N是位数.正如我前面所说,内存地址是一个数字,它也有一个最大值。这就是为什么机器字的大小也是对可用内存地址数量的限制--有时CPU无法处理足够大的数字来寻址更多的内存。
因此,在32位上,您可以将数字从0保持到2^32-1,这是4 294 967 295。它超过了1GB RAM中的最大地址,因此在特定情况下,RAM的数量将是限制因素。
理论上,32位CPU的RAM限制为4GB(2^32),64位CPU的RAM限制为16 EB(EB=2^30 GB)。换句话说,64位cpu可以处理整个internet…。200倍;)(按WolframAlpha估计)。
然而,在现实的操作系统中,32位CPU可以处理大约3 GIB的RAM.这是因为操作系统的内部架构-一些地址是为其他目的预留的。你可以在维基百科上读到更多关于这个所谓的3GB屏障的信息。您可以通过物理地址扩展来取消此限制。
谈到内存寻址,有几件事我应该提及:虚拟存储器, 分割和寻呼.
虚拟存储器
正如@DanielRHicks在另一个答案中指出的那样,OSes使用虚拟内存。这意味着应用程序实际上不是在实际内存地址上工作,而是在操作系统提供的地址上操作。
这种技术允许操作系统将一些数据从RAM移动到所谓的Pagefile(Windows)或交换(*Nix)。HDD比RAM慢几个数量级,但是对于很少被访问的数据来说,它不是一个严重的问题,它允许OS提供比实际安装的更多的RAM应用程序。
寻呼
到目前为止,我们讨论的是所谓的平面寻址方案。
分页是一种可供选择的寻址方案,它允许使用平面模型中的一个机器字来寻址更多的内存。
想象一下,一本书里满是四个字母的单词。假设每页上有1024个数字。要解决一个数字,你必须知道两件事:
- 打印该单词的页数。
- 那个页面上的哪个词是你要找的。
现在,这正是现代x86 CPU处理内存的方式。它分为4个Kib页面(每个1024个机器单词),这些页面都有数字。(实际上,页面也可以是4 MIB大或2 MIB与PAE)。当您想要寻址内存单元格时,您需要该页中的页码和地址。请注意,每个内存单元格被精确地引用一对数字,这不是分割的情况。
分割
这个和分页很相似。它被用于Intel 8086,举一个例子。地址组现在称为内存段,而不是页。不同的是片段可以重叠,而且它们确实有很多重叠。例如,在8086上,大多数存储单元可以从4096个不同的片段中获得。
例如:
假设我们有8个字节的内存,除了等于255的第4个字节之外,所有内存都保持着零。
平面内存模型的说明:
_____| 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 |
----- ----- ----- -----
如您所见,第四个字节可以通过四种方式寻址:(从0寻址)
- 段0,偏移量3
- 部分1,抵消2
- 第2部分,抵消1
- 第3段,偏移距0
它总是同一个内存单元。
在实际实现中,段移动超过1字节(对于8086是16字节)。
分段的坏处在于它很复杂(但我想您已经知道了;)更好的是,您可以使用一些聪明的技术来创建模块化程序。
例如,您可以将某个模块加载到一个段中,然后假装该段比实际小(仅足够小到足以容纳该模块),然后选择第一个不与伪小段重叠的段,然后加载下一个模块,依此类推。基本上,这样做就是变大小的页面。
在解释中有什么要补充的吗?在评论中发出声音。想从其他精通技术的Stack Exchange用户那里读到更多答案吗?请看这里的完整讨论主题。
以上是 (一个内存地址能存多少)我电脑里的RAM能容纳多少个内存地址? 的全部内容, 来源链接: utcz.com/wiki/670157.html