CPU 是怎么执行一条指令的:取指、译码、执行
电脑里跑的每个程序,拆到底都是一条一条指令。打开网页、保存文件、算出一道算术题,背后都是成千上万条指令被 CPU 一条接一条地执行完。CPU 干的活看起来复杂,其实核心动作只有三个:取指、译码、执行。它一辈子就在这个循环里打转,区别只是转得足够快。
第一步叫取指。CPU 内部有一个程序计数器,存的是下一条指令在内存里的地址。CPU 先读这个地址,再从内存把指令取回来,取完就把计数器加一,指向再下一条。内存里的指令只是一串二进制数,CPU 在取回来之前并不知道它是什么意思,先取回来再说。程序能按顺序往下跑,全靠这个计数器一格一格往前走;只有遇到跳转指令,它才会改道去另一个地址。
第二步叫译码。取回来的指令一般分成两部分:操作码和操作数。操作码说明要做什么,是加法、读内存还是跳转;操作数说明对哪些数据下手,可能是一个具体的数,也可能指向某个寄存器或者内存地址。CPU 里的控制单元把这串二进制翻译成一组控制信号,决定让哪个部件工作、数据从哪里来、结果送到哪里去。不同的指令译出来是完全不同的动作,但译码这一步的流程本身是固定的。
第三步是执行。按照译码的结果真正动手干活:算术指令就把两个数送进算术逻辑单元算出结果,读写指令就去内存或寄存器里取数和存数,跳转指令就把程序计数器改成目标地址。算出的结果一般先放回寄存器,那是 CPU 内部最快的一小块存放处,数量不多,但读写几乎不用等待。执行完这一条,循环立刻回到第一步,去取下一条。
三步循环为什么能快到让我们感觉不到延迟?一靠时钟,二靠流水线。时钟每跳一下,CPU 就往前推一步,一秒能跳几十亿次,三步的循环也就跟着转几十亿次。同时现代 CPU 会把取指、译码、执行排成流水线:上一条还在执行,下一条已经在译码,再下一条已经在取指,三步并行着走,而不是等一条走完三步才开始下一条。单条指令很简单,但数量大、速度快,合起来就是我们看到的电脑在干活。
那一条指令慢在哪里?多数时候慢在等数据。操作数在寄存器里,随取随用;要去内存里取,就得走总线,慢得多;内存里没有、要去硬盘上找,就更慢。所以同样是取指、译码、执行三步,数据在哪,速度就差在哪。很多程序优化做的事情,其实就是减少这种等待:让常用的数据尽量留在寄存器和缓存里,别让 CPU 空转着等内存。
简单说,CPU 没有魔法,它只会取指、译码、执行这三步。程序计数器保证顺序不错,译码保证意思不理解错,执行保证结果放对地方。三步循环几十亿次,软件就跑起来了。理解了这个循环,再看电脑卡、程序崩,思路就清楚了:要么是取指的路堵了,要么是译码的指令错了,要么是执行时等数据等得太久。
- 点赞
- 收藏
- 关注作者
评论(0)