尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

计算机基本原理:从冯·诺依曼体系到CPU执行指令的全景解析

计算机基本原理:从冯·诺依曼体系到CPU执行指令的全景解析 很多年前我刚入行的时候带我的前辈跟我说过一句话你以后写多少年代码都躲不开这一章的内容。他说的是教科书上第一张章节标题1.1 计算机基本原理。当时我不以为意觉得这章不就是背概念吗无非是CPU、内存、二进制这些东西考试能写出定义就够了。后来真的做了几年开发自己折腾装机、调性能、排查线上故障才发现当初最瞧不上的这节枯燥原理恰恰是几乎所有疑难问题的根子。所以这次想把计算机基本原理这个看似基础得不能再基础的题目展开成一篇能落地的东西。不管你是准备入行的新人、想补基础的产品经理还是写了几年代码但总觉得哪块没通的开发者这篇都能帮你在脑子里搭起一张计算机到底是怎么跑起来的全景图。1. 先搞清楚计算机基本原理这门地基课到底在讲什么很多新手会有个误区觉得原理等于理论理论就等于纸上谈兵。但计算机基本原理恰恰相反它没有一个字是多余的全是从实际机器里抽出来的共性规律。所谓原理就是不管什么牌子、什么价位的电脑拆开看、往里挖最终都逃不过的那套规则。这套规则可以浓缩成三个问题计算机由什么组成数据在计算机里怎么存、怎么算指令是怎么一步步被执行的把这三个问题想透了后面学操作系统、学网络、学编程语言都会轻松一大截。因为你会发现很多高层技术的设计动机都源于底层的这几个约束——比如内存不够用所以要虚拟内存CPU太慢所以要缓存程序太多所以要进程管理。追到底全是基本原理在起作用。这一节内容适合谁一句话所有和计算机打交道的人都适合。尤其是下面这四类人刚入行的程序员或培训班学员需要一个不靠死记硬背的底层认知框架。非科班转行者面试时被问冯·诺依曼体系是什么不能只答存储程序四个字。做产品、测试、运维的从业者日常沟通中需要准确理解内存、进程、缓存这些词的真实含义。喜欢折腾硬件、装机的DIY用户理解了原理之后配置电脑就不再是抄作业而是自己会算。我个人的看法是学这一节不要抱着背定义的心态而是抱着拆玩具的心态。把计算机当成一台你随时能拆开、能观察、能验证的机器原理自然就活了。2. 拆开一台电脑认识计算机的五脏六腑先做一个最朴素的动作把你的笔记本电脑或者台式机想象成可以拆开的。外壳拿掉你会看到什么一块主板主板上插着CPU旁边有内存条硬盘可能是贴在主板上的M.2固态也可能是SATA线连着的老式机械盘还有电源、风扇、各种接口。这就是最直观的硬件全景。2.1 用厨房做饭类比理解五大部件为了让这套东西好记我常用一个厨房做饭的类比讲给朋友和新人听效果一直不错CPU就是厨师负责算也就是所有实际的加工处理动作。内存是案板/操作台厨师要用的菜和调料得先放到手边拿起来快但地方有限一断电案板上的东西就没了。硬盘是冰箱和储物柜东西可以长期存放但厨师要取用时得先拿到案板上才能处理。输入设备是采购员把你的需求鼠标点击、键盘敲字送进厨房。输出设备是上菜员把处理完的结果屏幕画面、打印文稿端出来给你。这五个部分就是计算机的五大部件运算器、控制器、存储器、输入设备、输出设备。注意经典的划分里CPU内部还分运算器和控制器其中控制器负责指挥运算器负责执行。后来芯片越做越集成两者封装在同一颗CPU里但概念上依然是分开的。2.2 各部件参数背后的原理含义理解了角色分配再看硬件参数就通透多了。很多人选电脑只看i7还是i5内存多大但不知道这些参数对应到原理层面在说什么。CPU的主频分析师每分钟能做多少个动作核心数相当于厨房里有几个厨师。主频高不一定更快还得看每个动作干多少活这就是IPC每时钟周期指令数的概念。实际性能约等于主频乘以IPC再乘以核心数当然还要考虑散热降频这是后话。内存的频率和时序对应的是案板传递食材的速度。内存大小决定你同时能摊开多少半成品开几十个网页觉得卡很多时候是内存占用满了系统在疯狂用硬盘当备用案板也就是页面交换。硬盘的读写速度决定从冰箱拿食材的快慢。机械硬盘是先把货架慢慢转到位再伸手拿固态硬盘是凭编号直接到货架去取。这块的差距是数量级的所以现在的电脑把系统装在固态上开机体验差距极大。2.3 总线与主板大家怎么协作炊具、案板、冰箱都在厨房里它们之间靠什么连接靠的是台面、管道、线路。计算机里承担这个角色的是总线和主板。数据在CPU、内存、硬盘之间跑必须经过总线。总线的位宽和数据传输频率决定了厨房内部传菜通道有多宽、有多快。这里有个经典认知CPU再强如果总线带宽不够、内存速度跟不上整体体验还是会被拖住这就是常说的短板效应。实际装机时我见过不少人买了一颗顶级CPU却配了很普通的内存和硬盘结果整机表现平平。原理层面一句话就能解释数据进不来厨师再快也在等菜。3. 冯·诺依曼体系结构为什么所有现代计算机都长一个样如果你把不同年代、不同品牌的电脑拆开对比会发现它们千差万别。但从架构层面看几乎全都遵循同一个模板这就是冯·诺依曼体系结构。它由数学家冯·诺依曼在1945年提出核心思想可以总结成两点存储程序以及指令数据同等对待。3.1 存储程序四个字为什么是革命性的在冯·诺依曼之前计算机的程序是靠插拔线路、切换开关实现的。改一个计算任务可能得重新接一堆线相当于你要换一道菜得把整个厨房重新装修一遍。存储程序思想则是把指令像数据一样提前写进存储器里运行时由控制器一条条取出来解释执行。换任务的时候只需要换成另一段指令不需要动硬件。你今天能随时随地打开App干活全靠这个设计。软件和硬件因此解耦硬件提供了通用的执行环境软件负责定义行为。再往大了说智能手机、路由器、智能电视甚至洗衣机里的控制板本质上都是一台小小的冯·诺依曼结构计算机只有规模差异没有思想差异。3.2 一条程序在CPU里究竟是怎么走完一生的顺着存储程序的思想往下走你就能理解指令周期这个概念。CPU执行任何一条指令都逃不过四个步骤取指Fetch、译码Decode、执行Execute、回写Write-back。这一圈走完PC寄存器程序计数器自动指向下一条指令然后继续循环。我给你一个更直观的比喻你是一个只会读菜谱的厨师。菜谱放在案板边上内存你每次先看一眼当前该做哪一步取指然后理解这步是什么意思译码比如切三根葱接着动手切执行最后把切好的葱放到指定盘子里回写。做完一步你翻到菜谱下一行继续。这套流程就是CPU工作的节拍。你听到的主频3.0GHz意思是这个循环每秒能跑30亿次。虽然现代CPU做了流水线、乱序执行、分支预测这些优化但底层的框架逻辑依然是取指-译码-执行的老祖宗路径。学会了这个后面学汇编、学操作系统调度都能自然衔接上。3.3 用一段极简代码模拟CPU取指执行纸上谈兵不如动手模拟。我用Python写了一个极简的CPU模拟器指令集只有两个操作LOAD把数值加载到寄存器ADD把寄存器里的数和另一个数相加。至少能帮你直观看到指令是怎么被解释执行的。# 极简CPU指令模拟 program [ (LOAD, 3), # 把3装入寄存器 (ADD, 5), # 寄存器 5 (STORE,), # 把寄存器结果保存到result ] registers {acc: 0} memory {} pc 0 # 程序计数器 while pc len(program): instr program[pc] op instr[0] if op LOAD: registers[acc] instr[1] print(f执行到第{pc}条: 将 {instr[1]} 加载到寄存器当前acc{registers[acc]}) elif op ADD: registers[acc] instr[1] print(f执行到第{pc}条: 加上 {instr[1]}当前acc{registers[acc]}) elif op STORE: memory[result] registers[acc] print(f执行到第{pc}条: 将结果 {registers[acc]} 存入内存) pc 1 print(最终结果:, memory[result])运行这段代码你会看到PC指针一步步移动、寄存器数值一步步变化。真实CPU比这复杂得多但骨架上完全一致。每次看到这段代码我都觉得冯·诺依曼结构的美感在于它用极其简单的机制支撑起了极其复杂的生态。4. 数据的表示计算机为什么只认0和1我们平时看到的文字、图片、视频、声音五彩缤纷但到了计算机最底层全部归约为0和1两个状态。这个设计不是拍脑袋而是物理实现上最容易做可靠的事——电路里一个开关要么通要么断一个晶体管要么导通要么截止两种状态天然可靠、抗干扰。4.1 二进制、位和字节的基本功二进制的位bit是计算机最小的数据单位每一位要么是0要么是1。8个bit组成一个字节Byte这是日常存储容量计算的基本单位。所以我们说一个文件2MB其实是2兆字节要小心和Mb兆比特区分开。这个坑在计算机网络里尤其常见运营商说的100M宽带是100Mbps也就是每秒100兆比特换算成下载速度要除以8约12.5MB/s。很多新人拿着这个来问我为什么宽带是100M下载才12M其实就是bit和Byte的区别。十进制转二进制的原理本质是不断除以2取余数。比如把13转成二进制def dec_to_bin(n): if n 0: return 0 bits [] while n 0: bits.append(str(n % 2)) n // 2 return .join(reversed(bits)) print(dec_to_bin(13)) # 输出 1101反过来二进制转十进制是从右往左按位乘以2的幂再求和。1101就是1×2³ 1×2² 0×2¹ 1×2⁰ 8401 13。4.2 文字、图片、声音是怎么变成0和1的理解了数字的二进制其他信息类型就好办了。字符可以查表ASCII码表用7位或8位二进制对应128到256个字符A对应65a对应97这个对应关系是被世界标准的约定。但汉字数量太多一字节不够用所以有了GB2312、GBK后来为了全球统一字符又有了Unicode和UTF-8。UTF-8的好处是兼容ASCII同时在表示汉字时用3个字节这也是你在数据库里设置字符集时经常看到它的原因。图片的表示更直观。一张黑白图可以拆成一个矩阵每个点是一个像素0表示黑、1表示白。彩色图则是每个像素用RGB三个通道记录颜色强度每个通道0到255对应8位。于是你看到一张1920×1080的图本质上就是1920乘以1080个点、每个点3个字节的数据排列。视频则是每秒若干张图片连续播放声音则是把声波按固定频率采样每个采样点量化为一个数字序列。当年我第一次算出一张高清图占用空间有多大时才真正明白为什么需要压缩算法为什么一张手机照片动辄好几MB。这些都是基本原理直接推出来的。4.3 为什么说位运算是程序员的隐形利器二进制不只是存储的底层更是很多高效算法的基本功。位运算直接对二进制位操作速度极快。判断一个整数是不是偶数用n 1比n % 2更直观因为偶数的最低位一定是0。乘2可以用左移一位n 1除以2可以用右移一位n 1。权限管理里常用一个整数每一位代表一种权限通过按位与、按位或来快速判断和合并。我在实际开发里遇到过一个问题A和B两个集合做权限合并正常人可能先转成Set再遍历但直接用一个32位整数的位或一行代码就合并完了性能还好几个量级。这个思路如果你没啃过计算机基本原理很难自己悟出来。很多所谓的奇技淫巧其实都是底层原理的正常外推。5. 按下电源键之后一次完整的开机流程有了硬件组成、有了指令执行机制、有了数据表示基础我们把这些拼起来看看一台电脑从按下电源键到出现桌面中间到底发生了什么。这个过程像一部精心编排的话剧每个环节都有自己的职责。搞明白它对排查开机慢、引导失败、驱动异常等问题极有帮助。5.1 从POST自检到引导加载程序按下电源键电源开始供电主板上所有部件被唤醒。第一步是POSTPower-On Self-Test加电自检芯片组和BIOS/UEFI固件会对CPU、内存、显卡、键盘等关键硬件做快速体检。如果硬件有致命故障机器会通过蜂鸣声或诊断灯报错。内存条没插紧导致开不了机就是这个阶段过不去。自检通过后BIOS/UEFI需要决定从哪个设备加载系统。它按照你设定的启动顺序逐个检查硬盘、U盘、光驱等设备寻找可引导的标志。找到之后把引导扇区或EFI分区里的引导加载程序比如GRUB、Windows Boot Manager加载到内存里。引导加载程序的任务是进一步准备环境最终把操作系统内核加载进来。这块有个易混点不少老玩家把BIOS启动和UEFI启动混为一谈。BIOS是老式固件操作界面是蓝底白字依赖传统MBR分区表UEFI是替代它的新规范界面更友好支持GPT分区表启动速度更快还带安全启动功能。你在装双系统时如果引导方式没统一经常会出现明明装了Linux却启动不了的诡异问题。5.2 操作系统内核接管之后发生了什么引导加载程序把内核放进内存后就会把控制权移交给内核。内核这一阶段要做的事情非常多包括初始化CPU管理、建立内存管理页表、加载驱动程序、挂载根文件系统然后启动第一个用户态进程。以Linux为例这个进程通常是init或systemd它是所有用户进程的祖先。之后由systemd并行启动各种系统服务比如网络管理、日志服务、显示管理器。最终显示管理器拉起来图形登录界面你看到桌面、输入密码系统为你的用户会话创建一系列进程开局完成。有一个经常被问的问题为什么机械硬盘开机要转半天固态硬盘一下就进系统了因为开机过程大部分时间花在磁盘的随机读写上。固态硬盘的寻址延迟远低于机械硬盘的机械寻道时间所以差距被直接拉大。这也是原理直接解释使用体验的典型案例。5.3 用一条命令查看系统启动耗时作为补充你可以用命令实际观察系统运行状况。Windows下可以用任务管理器-启动页查看开机自启动项的影响Linux下可以用systemd-analyze这个工具看各阶段耗时# 查看总启动耗时 systemd-analyze # 查看每个服务的启动耗时排名 systemd-analyze blame | head -20我第一次用这个命令发现一个第三方服务占掉了开机两秒多关掉之后明显感觉开机轻快了不少。找出瓶颈、干掉瓶颈这种思路正是原理带给你的能力。6. 常见问题与易混淆概念排查实录教过很多新人也带过不少刚入职的同事我把大家最容易混淆、最容易踩坑的几个点整理成一张速查表。这些内容不是书上的习题而是真实工作交流中反复出现的原理性误解。常被混淆的概念它们到底差在哪一句话总结内存 vs 硬盘内存断电丢数据、速度快、容量小硬盘断电保留数据、速度相对慢、容量大内存是案板硬盘是冰箱位 vs 字节1字节8位网络带宽常用位/秒存储容量常用字节Mbps除以8才是MB/s进程 vs 程序程序是硬盘上的静态文件进程是程序被加载到内存后正在运行的实例菜谱是程序照菜谱做菜的过程是进程32位 vs 64位指CPU一次能处理的二进制位数也影响最大内存寻址范围64位能直接用大内存32位最多约4GB并发 vs 并行并发是多个任务交替执行看起来像同时并行是多个任务真正同时执行并发是单厨师轮流做菜并行是多厨师同时做中断 vs 轮询中断是设备主动通知CPU我好了轮询是CPU反复查看设备好了没中断是被动接收轮询是主动询问6.1 内存明明还有怎么电脑还是卡这个问题在工作中被问得快烂了。打开任务管理器内存占用才60%CPU也不高但系统就是卡。往往问题不在CPU或内存总量而在磁盘占用率100%。机械硬盘在处理大量碎片化小文件时磁头来回找道性能断崖下跌固态硬盘在做垃圾回收或固件调度时也可能出现短暂的高延迟。另有一个常见原因是后台进程中某个应用发生了死循环把单个CPU核心打到满载。由于操作系统调度会把它分配到不同核心上任务管理器里单看CPU整体百分比可能不明显但你已经感到卡顿了。此时看按进程排序才是排查的正确姿势。我遇到过一次特别典型的案例同事反馈电脑卡得生无可恋我一看任务管理器一个索引服务占CPU 30%多而且磁盘占用拉满。停掉服务、重建索引之后电脑恢复如初。原理告诉我们CPU、内存、硬盘任何一个成为瓶颈整体就像被堵住了一样。6.2 为什么关机了程序还在但是数据可能丢很多人会有个疑问为什么我关机再开机安装的软件还在但是某些未保存的文件找不回来了装了软件数据写在硬盘里断电不丢但运行中产生的临时文件或未保存内容只存在于内存里断电就没了。所以保存的本质就是把内存里的数据写回硬盘。这块有个进阶的指导思想你写代码时做数据库事务、做持久化本质上都是在和断电会丢数据这个物理特性周旋。理解了存储层级就理解了为什么需要缓存、需要回写、需要日志系统。6.3 排查问题的分析思路遇到计算机故障我一般按照软硬件分层的思路快速排查先判断是硬件还是软件问题。开机自检是否通过硬件管理里设备是否正常再判断是操作系统还是应用问题。换个同类软件试一下如果都一样大概率是系统或底层问题。然后看资源瓶颈。打开任务管理器或top命令观察CPU、内存、磁盘、网络哪个先到100%。定位到具体进程后再根据日志和进程行为决定处理方案。这套思路其实就是基于基本原理的演绎。你不需要背一堆故障案例只要知道计算机由什么组成、数据怎么流动、指令怎么执行大部分问题都能按这条线拆出来。7. 学完之后你可以继续往哪个方向走计算机基本原理是很多知识体系的入口学完这一节我建议你顺着几条线继续深入下去。每条线都能看到基本原理的影子。第一条线是操作系统。理解了CPU怎样执行程序你就知道进程调度为什么要做时间片切换理解了内存和硬盘的区别就明白虚拟内存为什么能突破物理内存限制。操作系统就是把基本原理加工成资源管理器的大系统。第二条线是编程语言。原理里讲的存储程序思想对应到编程里就是代码放在那里由运行时一条条执行理解函数调用栈、递归、指针这些概念都要回到内存里如何组织数据这个起点。第三条线是计算机组成原理与体系结构。如果你想深入芯片内部去看流水线、缓存一致性、分支预测器这条线最能满足硬件发烧友的好奇心。我有一个实操建议学完这章不妨找一台老电脑拆开看看把CPU、内存、硬盘、电源一一辨认出来然后装回去开机再对照资料重读一遍冯·诺依曼结构。当年我带过的实习生里凡是动手拆过机器的后面学操作系统、学体系结构都要顺畅很多。原理不是用来束之高阁的是用来指导你动手和解决问题的。最后说一点我自己这些年最深的体会计算机里的每一个复杂机制拆到底层都是很朴素的道理。学会基本原理不是为了背下来考高分而是为了让你在遇到一个从没见过的问题时能顺着数据从哪里来、到哪里去、中间经历了哪些处理这条主线把它推出来。技术栈会一直变语言和框架会层出不穷但1.1这一节讲的东西十几年前有效现在依然有效再过十年也不会过时。把这层地基打牢后面不管盖多高的楼你都不会心虚。
返回列表