打开1 个文档时,文件最初保存在存储设备上;编辑时,程序和正在处理的数据主要驻留在内存中;按下保存后,修改才有机会成为能够长期保留的文件。这几个动作看似连续,背后却由不同部件接力完成。理解这种分工,才能解释为什么磁盘还有空间,程序仍会提示内存不足,也才能判断1 台云虚机究竟需要增加哪1 种资源。
本课从1 台计算机的整体结构出发,认识 CPU、内存、总线、输入输出设备以及存储层次,建立程序装载和执行的概念模型。学完后,应能沿着1 条请求描述数据经过哪些部件,区分容量、带宽与访问延迟,并把单机资源限制写成可验证的非功能需求。这里沿用 H1、H2 中比特、字节和数据编码的基本认识;不要求具备电路知识,也不展开 CPU 内部的精细实现。
整机一张图:程序和数据在何处相遇
计算机中的文字、图像与指令最终都需要表示成比特。但“都由比特组成”并不意味着“都放在同1 个地方”。处理器只能通过规定的访问方式取得信息,存储设备也需要控制器与接口才能参与工作。整机结构要回答3 个问题:信息存在哪里,谁解释并处理信息,各部件怎样交换信息。
冯·诺依曼结构提供了一副理解整机的骨架:程序以指令的形式存放在存储器中,处理器依次取出指令、解释指令并执行操作。指令可以要求处理器读取数据、完成运算、写回结果,也可以改变下1 条指令的位置。因此,程序无需通过重新连接机器线路来更换,装入不同指令就能完成不同任务,这就是存储程序思想的重要意义。
在这个抽象模型中,指令和数据共同位于可寻址的存储器中。“可寻址”意味着可以用地址指定某个存储位置,类似用编号找到一格柜子。地址说明位置,位置中保存的比特才是内容。同一串比特被当作指令还是数据,与程序的执行方式有关,不能仅靠观察外形区分。这里的存储器主要对应执行时使用的主存,而不是把硬盘直接当成处理器的取指对象。

图中的线表示逻辑连接,不代表现代机器内部只有一根共享导线。现实系统可能为不同用途设计不同通路,处理器附近也存在多级存储。本课保留“处理器访问内存,设备经接口交换数据”的关系。它足以帮助我们定位多数整机问题;具体通路如何并行工作,留待后续学习。
还要区分模型中的统一视角与操作系统提供给程序的视角。程序通常使用自己的地址空间,并不直接支配整台机器的所有物理内存。操作系统如何完成管理属于 S1 及后续内容。此处只需记住:程序发出1 次内存访问,背后必须有可用的物理资源和管理机制支撑,地址本身不是凭空产生的容量。
五大部件:把分工对应到实际设备
传统组成把计算机分为运算器、控制器、存储器、输入设备和输出设备。运算器执行加减、比较和逻辑操作;控制器组织取指、解释与执行的次序。在现代计算机中,二者主要集成在中央处理器,即 CPU 中。CPU 还含有少量寄存器,用来暂存当前指令执行紧密依赖的数据和状态。寄存器容量很小,但离实际运算最近。
主存通常由内存条或板载内存提供,负责保存正在使用的指令和数据。它能按地址读取和写入,适合处理器频繁访问;常见的动态随机存取存储器需要持续供电维持内容。固态硬盘和机械硬盘则属于长期存储设备,断电后通常仍能保留数据。教材中的“存储器”可以是较宽的类别,讨论运行时容量时必须明确说的是主存还是持久存储。
输入设备把外部信息带入系统,例如键盘、传感器以及网卡接收方向;输出设备把结果交给外部,例如显示器、打印机以及网卡发送方向。许多设备同时承担输入和输出,硬盘读出数据与写入数据就是2 个方向。因此,“外设”描述其在整机中的角色,并不意味着它一定在机箱外。网卡和固态硬盘都可以位于机箱内部。
总线及其他互连负责传递地址、数据和控制信息。地址用于说明访问目标,数据是实际搬运的内容,控制信息说明读写方向、请求与完成等状态。可以把互连理解为有规则的交通系统:既要有运输能力,也要规定参与者如何发起传输和确认结果。设备控制器负责把设备自身的工作方式接到系统能够使用的接口上。

五大部件是功能分类,采购清单则是产品分类,两者不必一一对应。1 块芯片可以集成处理器、内存控制器及多种接口,一件设备也可以同时承担多个功能。判断故障或性能时,应先问哪个功能环节受限,再查对应的硬件和软件路径。看到“磁盘忙”就断言 CPU 不重要,或看到“CPU 强”就认定整机一定快,都跳过了这种分工分析。
以读取内存中的1 个整数为例,处理器提出目标地址和读取要求,内存控制器按内存接口的规则组织访问,再把取得的数据送回。处理器不是把地址当成要计算的整数,也不是直接操纵每个存储单元。若内存条接触不良,机器可能在上电检查时无法识别容量,甚至不能继续启动;这与硬盘剩余空间不足属于不同环节,清理文件不能修复内存连接。
互连也会形成独立约束。例如网卡接收数据并写入内存时,需要经过设备接口和系统内部通路;存储设备同时搬运数据,也可能竞争其中的共享资源。即使2 个设备各自都能达到较高传输速率,整机同时工作时的总速率仍受共同通路限制。扩展卡若安装在可用通道较少的插槽中,可能能够正常识别,却达不到预期带宽。排查时应核对插槽支持的连接规格、实际协商结果及并行传输时的表现,把“设备存在”“连接正常”和“传输能力足够”分开验证。
指令周期:1 次加法也需要取数和写回
设想程序需要把2 个整数相加,并把结果保存在内存中。为了便于理解,可以把任务写成“读取第1 个数、读取第2 个数、相加、保存结果”。这只是表达动作的教学序列,并不对应所有处理器都相同的机器指令数量。真实机器指令的形式由指令集决定,源代码中的1 行表达式也可能被翻译成多条指令。
处理器中有1 个用于指示后续取指位置的状态,通常称为程序计数器。取指阶段,处理器根据这个位置取得指令;译码阶段,识别指令要求执行什么操作、需要哪些操作数;执行阶段,完成运算、内存访问或控制转移;随后按指令需要写回结果并确定后续位置。不同教材可能把这些动作拆成不同数量的阶段,本课强调的是职责而不是固定拍数。

顺序执行时,后续位置通常指向紧接着的指令。遇到条件分支时,比较结果可能让处理器转到其他位置,形成选择与循环。程序不是把所有指令同时倒进运算器,而是在规则约束下持续推进状态。处理器执行了很多条指令,也不保证应用已经完成1 项用户任务:1 项任务可能还在等待输入、等待数据,或者反复执行无效计算。
在这段动画中,应特别注意箭头的先后与对象:取指搬运的是指令,读取操作数搬运的是数据,写回改变的是结果所在的位置。它们都可能经过存储访问通路,但意义不同。寄存器让处理器能够暂存当前要用的数,却不会让整个文件自动进入 CPU。1 次保存到内存也不等于文件已经持久保存,这2 种“写入”的目标和完成条件不同。
“时钟频率高,所以任何程序都更快”是容易产生的误解。频率描述每秒时钟周期数,程序耗时还取决于需要执行多少工作、每项工作需要怎样的资源,以及等待占了多少时间。不同处理器、不同程序之间,只比较频率很难推出实际耗时。本课采用顺序展开的动画帮助观察逻辑依赖;真实处理器如何提高执行效率,属于 H9 的讨论范围。
从启动到装载:文件怎样成为运行中的程序
断电保存的程序文件需要经过装载,才能参与日常执行。计算机上电后,处理器按平台规定从启动入口开始执行固件代码。固件完成必要初始化,并按启动配置寻找后续启动组件,随后由启动链把操作系统的核心部分装入内存并转交控制。不同设备的启动步骤有差异,但都需要先建立能够继续加载和执行代码的环境。
操作系统运行后,用户点击应用图标,才进入启动某个应用的过程。系统定位程序文件,检查其格式与所需资源,建立执行所需的地址空间和初始状态,并安排处理器开始执行。程序中的指令、初始数据以及所依赖的其他代码,需要以适当方式映射或装入可访问的内存。装载不是把整个存储设备的内容1 次性复制过去。

实际系统可以先建立映射,在某些内容第1 次被访问时再把相应部分调入内存,所以“启动程序”不等于“全部内容已经物理读入”。同样,打开1 个大文件,也可能只读取索引和当前需要的片段。文件大小、程序占用的内存以及已经读入的数据量是不同指标。把它们分开,才能解释小程序处理大文件或大程序只使用部分功能等常见现象。
运行期间,程序还会申请保存临时数据的空间,读取用户文件,并通过操作系统访问设备。由此可见,程序文件、内存中的执行状态和输出文件具有不同生命周期。关闭程序后,运行状态通常会被回收,而已成功持久保存的文件仍可再次打开。应用能否恢复未保存的工作,则取决于它是否实现了自动保存、日志或其他恢复机制。
内存不足时,一些系统会利用存储设备支持部分内存内容的换入换出,但这不等于给机器增加了同等性能的物理内存。频繁搬运可能显著增加等待,也可能因配置或资源限制而直接导致分配失败。理解这种区别后,排查启动慢就有了方向:既可能是读取文件慢,也可能是内存压力大,或是程序启动后进行了大量计算,不能只根据“还没出现窗口”定位原因。
存储层次金字塔:容量、延迟和带宽要分开看
处理器需要低等待地获得数据,而业务又希望保存大量数据。越靠近运算的存储资源,通常容量越小、单位容量成本越高、访问延迟越低;越适合长期保存大量内容的存储,通常延迟越大。于是形成从寄存器、缓存、主存到本地持久存储的层次。若把远程存储也放入观察范围,还必须加入网络、服务端处理和服务约定带来的影响。
缓存是为了保留近期或邻近可能再次使用的信息而设置的较快存储层。访问时,在所讨论的缓存中找到需要的内容称为命中,找不到称为未命中。未命中通常需要从更低层取得数据,然后才能继续。缓存的存在不会改变主存和磁盘的容量定义;不同层复制了部分相同数据,也不能把这些容量简单相加成程序可用的主存。

这种组织能发挥作用,与程序的局部性有关。刚用过的信息可能很快再次使用,称为时间局部性;访问某个位置后,可能接着访问附近位置,称为空间局部性。例如遍历1 段连续数组,通常比在巨大数据集中零散跳转更容易利用相邻数据。局部性是1 种常见行为特征,并非保证;具体访问模式需要结合程序观察。
容量回答“能够容纳多少”,常用字节及其倍数描述;访问延迟回答“1 次请求要等多久”,常用纳秒、微秒或毫秒描述;带宽回答“单位时间能够传输多少”,常用字节每秒描述。排队也会使请求等待增加。设备即使具备很高的顺序带宽,处理大量小而分散的请求时,整体表现仍可能由每次访问的开销和并发能力决定。
可以用搬书作类比:书架能放多少书对应容量,走到书架取回第一本需要多久对应延迟,1 段时间内能搬回多少书对应吞吐能力。这个类比不能推导具体硬件参数,却能提醒我们先选对指标。购买容量更大的设备,不必然缩短1 次小读取的等待;增加并发,也可能在资源饱和后只增加排队。
滑块采用1 个明确简化的2 层模型:先查询快层,耗时1 纳秒;未命中时,再访问慢层,额外耗时100 纳秒。若命中率为百分之90,平均访问时间就是1 纳秒加上百分之十乘100 纳秒,得到11 纳秒。命中率提高到百分之99时,平均值降到2 纳秒。这里把访问视为依次发生,不模拟重叠、预取或写入策略。
这组数值是教学设定,不是某种 CPU 的实测规格,也不能用来预测整机速度。模型说明的是:少数较慢访问仍可能显著影响平均值。命中率相同的2 个应用,如果访问总次数、计算量或等待设备的时间不同,整体耗时也可能不同。评估容量是否合适时,还要看活跃工作集,即1 段时间内反复使用的那部分数据是否能被较快层有效容纳。
I/O 与中断:处理器怎样知道设备有了结果
输入输出通常写作 I/O,表示计算机与设备之间的数据交换。程序请求读文件时,操作系统和驱动程序把请求转换成设备能够理解的操作;设备控制器执行相应动作,并通过系统规定的方式报告进展。CPU、内存与设备参与同1 条路径,却不必在每个时刻都同时工作。设备的忙碌时间与 CPU 的实际执行时间也因此可以不同。
处理器可以反复读取设备状态,检查请求是否完成,这叫轮询。轮询容易理解,在某些场景也很有效,但不断检查会消耗处理器执行机会。另1 种方式是中断:设备或其他事件源发出通知,处理器在体系结构允许的边界响应,转去执行处理代码,保存和恢复必要状态后继续后续工作。中断并不是把机器断电,也不是任意位置都能立即完成通知处理。

现代系统中,较大的数据传输常可由直接内存访问机制,即 ,帮助完成。CPU 和驱动程序先配置传输,设备或相关控制逻辑在允许的内存范围内搬运数据,完成后再报告结果。这样可以减少 CPU 逐字节搬运的工作,但设备依然占用内存和互连的传输资源。DMA 也不会替应用解释文件格式或自动完成业务计算。
中断只说明某个事件需要处理,不必然表示“1 份应用请求已经成功结束”。驱动程序还要读取状态,判断完成、错误或其他情况,再由操作系统把结果传给等待它的程序。多个完成事件也可能被合并通知,因此中断次数不能直接等同于文件数、网络包数或业务请求数。通知机制与数据本身的传输路径,应在概念上区分开来。
当设备工作时,处理器可以有机会执行其他任务,但是否有可执行任务、何时切换由操作系统决定。对应用而言,等待慢设备常常意味着总耗时增加,而 CPU 占用却未必很高。于是,“CPU 不忙但用户觉得慢”完全可能发生。此时应沿 I/O 路径检查设备延迟、队列、网络和存储服务,而不是仅根据 CPU 利用率宣布资源充足。
与云虚机的对应:规格是资源入口,性能要看路径
云虚机把整机的某些资源以虚拟化形式交给用户:虚拟 CPU 提供指令执行能力,虚拟内存支撑程序的执行状态,虚拟块设备提供磁盘接口,虚拟网卡连接网络。从应用角度仍然可以沿着 CPU、内存、存储和 I/O 的骨架分析。虚拟化改变资源的提供和管理方式,没有取消计算与数据传输的物理成本。
1 个 是1 个虚拟处理器执行资源的呈现,不能普遍理解成独占1 个完整物理核心。它如何映射到底层执行资源,与实例类型和平台实现有关。主频、处理器代际、共享方式以及平台限制都会影响实际表现。因此,2 个同样标注若干 vCPU 的实例,也需要在目标工作负载下验证,不能仅凭数量认定性能相等。
虚机标注的内存容量也不是应用能够全部占用的容量。操作系统、后台服务和其他进程都需要空间,应用自身还包含代码、运行时和临时缓冲。估算业务数据占用时,应计入索引、对象组织和运行峰值等额外开销。存储文件为若干字节,不代表它解码或构建索引后仍只需要相同数量的内存。
云盘容量、每秒输入输出操作数、吞吐量与延迟是不同维度。每秒输入输出操作数常写作 IOPS,需要结合单次操作大小理解;同样的操作次数,搬运的数据量可能相差很大。实例本身还可能限制总存储或网络带宽,购买更高规格的单个云盘,也可能受到实例侧通路约束。应核对当前配置的限制和测试条件,而不是只看设备宣传中的最高值。

例如,1 个服务接收请求后读取记录、解析内容、生成结果并发送响应。读取涉及存储,解析涉及 CPU,活跃记录和临时对象占用内存,响应经过网络。增大内存可能减少重复读取,优化表示可能减少解析工作,增加 CPU 则主要帮助可由更多执行资源处理的部分。措施应对应证据:某条通路的容量或服务能力,不能替另1 条通路完成工作。
常见坑:把现象归回正确的部件
第2 类误判是把平均值当成每次体验。缓存命中时很快,未命中时可能慢很多;请求之间还有大小和排队差异。平均延迟改善后,少量慢请求仍可能影响用户体验。观察服务时,可以同时记录吞吐量、平均延迟与较高分位延迟。所谓百分之95分位延迟,是使至少百分之95观测值不超过它的1 个统计位置,不能理解成平均耗时的百分之95。
第3 类误判是把“增加核心”当成通用加速按钮。若任务必须先完成1 步才能进行下1 步,可并行执行的部分就有限;若大部分时间都在等同一设备,增加执行资源也未必能缩短等待。此时应检查任务的依赖关系和共享资源。只要有某个环节限制持续处理能力,其他环节的空闲就不能自动转化为端到端吞吐量。
第4 类误判是把写入内存当成持久保存。应用把修改放入缓冲区,操作系统接收写入请求,设备报告某种写入完成,是可能不同的时刻。能够承受何种故障,需要结合应用、操作系统及存储服务的持久化约定确认。设计时应明确“收到响应后允许丢失多少数据”,再选择相应机制;不能仅因为数据曾出现在内存中就推断掉电后仍能恢复。
第5 类误判是从1 次使用率读数直接宣布瓶颈。CPU 总体利用率不高时,可能有1 条关键执行路径已经繁忙;磁盘吞吐量不高时,也可能是小请求的访问延迟正在限制进度。应把观察窗口内的工作负载、资源利用率、等待与用户侧延迟放在一起解释。指标是定位线索,因果判断还需要受控地改变条件并比较结果。
放进方案里

容量估算应记录依据与余量。假设计划同时保留10 条活跃索引,每条在内存中的实际占用估为2000 字节,则索引主体约需20000 字节。这个数尚未包含运行时、临时结果和操作系统,应通过代表性样本测量额外开销,再预留增长空间。持久存储则另算原文、索引副本、日志和保留周期,不能用内存估算直接替代。
带宽估算也要写出条件。若峰值每秒200 次查询,每次确实需要从存储读取一兆字节,则读取需求约为每秒200兆字节;这只是数据量估算,还需要核对请求大小、访问方式和设备延迟。若有缓存,应分别记录命中率假设及失效时的负载,并核对实例侧与设备侧限额。
非功能需求应规定可验收的边界:在明确的数据规模、并发和到达率下,要求持续吞吐量达到目标,同时使百分之95分位响应时间不超过约定上限,并保持内存峰值低于预留线。验收窗口、预热条件、缓存状态与错误率也应记录,否则2 次测试可能无法比较。
最后写明单机瓶颈与处理条件。若证据显示 CPU 执行能力不足,可评估优化计算或增加可用执行资源;若活跃集超出内存,则评估减少驻留数据或扩容;若存储或网络先到限制,就核对相应通路。每项调整都应附复测方式,并说明何种负载增长会触发重新评估。
小结:为操作系统与处理器细节建立坐标
本课建立了3 条可以反复使用的联系。第一,存储程序思想把指令和数据纳入可寻址的存储结构,CPU 通过取指、译码、执行等动作推进程序。第二,运行中的程序依赖内存、设备和互连共同支撑;启动、装载、运行与持久保存是不同过程。第三,容量、延迟和带宽描述不同约束,整机性能取决于业务经过的完整路径。
分析1 项新任务时,可以先描述数据从哪里来、在何处处理、结果去哪里,再为每1 段补上容量、处理速率和等待时间。这样既能避免把所有慢都归咎于 CPU,也能说明为什么增加某种资源可能有效。概念模型用于确定观察方向,实际配置和性能结论仍应由明确条件下的测量支持。
接下来的 S1 将讨论操作系统怎样管理 CPU、内存与设备,并向应用提供可使用的接口。H9 则会继续观察处理器和存储层次内部的工作方式。带着本课的整机坐标进入后续内容,就能把更细的机制放回同1 条执行与数据流中理解,而不必把每个新名词当作孤立部件记忆。
下一课转向 H9 CPU 基础:把本章验收过的结论带进后续主题,写成可检查的方案约束。