内存就是一大堆能存 0 和 1 的格子:地址线告诉它找哪一个,数据线告诉它放什么;地址线多一条,容量就翻一倍。
前两章讲的是【数据怎么被表示】,这一章换了个问法:数据放在哪儿、怎么摆。
一、内存是干什么的
内存是 CPU 手边的临时仓库——程序要从磁盘搬到内存里才能跑,算出来的中间结果也要先放在这儿。 它有两个特点:速度快、但断电就没了。 正因为这两点,才需要在【快但小】和【慢但大】之间来回倒腾——那是第五章的事。 这一节只问一件事:这个仓库是怎么盖起来的?
二、两个插口:地址线加数据线
内存的物理结构简单到一句话就能说完:一大堆能存 0 或 1 的格子。 硬件只管两件事: 地址线——告诉它【找哪一个格子】。 数据线——告诉它【往格子里放什么、从格子里取什么】。 除此之外它什么也不会干:不会排序、不会查找、不会算数。 那些全是程序的事。
三、地址线有几条,决定能点多少格子
每条地址线只有【通】和【不通】两种状态,也就是一位。 所以 n 条地址线能点出的格子数是 2 的 n 次方——每多一条线,容量就翻一倍。 10 条 → 1024 个格子;20 条 → 约 100 万;32 条 → 约 43 亿。 (每格按 1 字节算,32 位地址能寻到的就是 4 GB——这也是 32 位系统装不下更大内存的原因。)
四、它的缺点,正好是后面所有办法的起点
内存一次只能读一个格子,而且读哪个格子都得从头用地址去点。 它不知道你把什么放在了哪里,也不记得上一次读过什么。 所以【怎么摆】就成了程序自己的责任:摆得顺,一次就找到;摆得乱,就得翻箱倒柜。 下面六节要讲的数组、栈、队列、链表、树,全都是在这么一串方格子上摆出来的形状。
五、动手 Demo:内存的物理结构十分简单
内存就是一大堆能存 0 或 1 的小格子。 地址线告诉它【找哪一个格子】,数据线告诉它【放什么】。
for n, cap in ((10, "1 KB"), (16, "64 KB"),
(20, "1 MB"), (32, "4 GB")):
print("%2d 条地址线 -> %d 个格子(%s)" % (n, 2 ** n, cap))
mem = [0] * 8
mem[3] = 42
print("mem[3] =", mem[3])
实跑输出:
--------------------------------------------------------------------
内存的物理结构十分简单
--------------------------------------------------------------------
**内存就是一大堆能存 0 或 1 的小格子。** 硬件只管两件事:
地址线 告诉它【找哪一个格子】
数据线 告诉它【往格子里放什么、从格子里取什么】
地址线有几条,就决定了能点多少个格子——**每多一条线,容量翻一倍。**
地址线 可寻址的格子数 按每格 1 字节算
----------------------------------------------
10 条 1024 1 KB
16 条 65536 64 KB
20 条 1048576 1 MB
32 条 4294967296 4 GB
拿 8 个格子直观体验一下【按地址读写】:
地址 0 1 2 3 4 5 6 7
内容 0 0 0 42 0 0 7 0
读出 mem[3] = 42,mem[6] = 7
**物理层面就这么简单:给它一个地址、给它数据,剩下的不用管。**
后面所有的数据结构,都是在这么一串方方正正的格子上摆出来的。
每多一条地址线,可寻址的格子数就翻一倍——容量是指数长的,不是线性长的。 32 条地址线正好对应 4 GB,这就是 32 位系统的天花板。
30 秒实验
- 算一算:你的电脑有 16 GB 内存,至少要几条地址线才够?
- 想想为什么内存断电就丢数据,而磁盘不会——这是下一章的开场问题。
常见误区
- 以为内存会【自己找】数据。它只会按地址一格一格地读写。
- 以为内存越大程序越快。摆放方式不对,再大的内存也白搭。
自测三问(点开对答案)
1. 内存的物理结构是什么? —— 一大堆能存 0 或 1 的格子,外加地址线和数据线两组线。 2. 地址线的作用是什么? —— 指出要访问哪一个格子;n 条地址线能寻址 2 的 n 次方个单元。 3. 为什么 32 位系统最多用 4 GB 内存? —— 32 条地址线最多寻址 2 的 32 次方个字节,也就是 4 GB。- ☐ 下一节(4.2 内存的逻辑结构像一幢大楼)
相关笔记
- 内存的逻辑结构像一幢大楼 — 给这串地址装一个顺手的看法
- 用好内存先从数组开始 — 第一个摆出来的形状
- 看一看CPU的内部构造 — 内存是 CPU 手边的仓库
- 💻 计算机是怎样跑起来的 · 索引 — 讲硬件是怎么搭起来的
- ⚙️ 程序是怎样跑起来的 · 索引