实际上计算机组成原理这玩意儿,看着挺玄乎,就像是让人在开水锅里煮土豆,既看不见锅底的逻辑,又认定全是开水。
不过别急,咱们把它拆解开,像剥洋葱一样,一层层看透了,你会发现它实际上没那么难,就连有点像咱们看人,总会有点印象,但未必能一下子记住所有细节。 最核心的东西,就是那些让程序能跑起来的“地基”。
比如 CPU 内部,那堆晶体管排列得密密麻麻,但咱们一般/平平人要是盯着看,怕是看半天也看不出个门道。
不过有个概念得提,就是 Cache,这玩意儿实际上就是给 CPU 贴的身份证,专门存着它时常要用的数据。想象一下,你每次去图书馆找一本书,要是那书在书架正中间,你直接拿就行;要是得翻到书架的最尽头,那忒费劲了。CPU 也是这样,Cache 就是那个“时常用”的书,数据直接放里面,速度飞快。而主存,也就是那种庞大的内存条,存着程序运行时的主要代码和变量。
这就好比你要去图书馆查阅资料,要是资料在书架正中间,直接拿就行;要是得翻到书架的最尽头,那忒费劲了。
故此,Cache 是为了让 CPU 少跑一趟,而主存就是存放所有“资料”的大本营。 再聊聊时序,这玩意儿听起来挺抽象,实际上就是一条工夫线。计算机工作时,指令得按顺序来,但这顺序得排好。
比如你说的“取指”,那是读指令,得先让 CPU 去内存拿指令;接着是“译码”,把这条指令变成 CPU 能懂的语言;然后是“执行”,启动干活。
要是这顺序乱了,那简直就是把电脑给卡住了,就像你做饭,先把菜端上来再启动切菜,那锅肯定炸。
故此时序安排得再好,要是指令执行错了,那也是白搭。并且在这里还得注意,指令执行是有顺序的,不能乱,也不能跳过。
比如你想让 CPU 执行指令 A,先把指令 A 拿到内存里,再译码,最终执行,这个过程里不能跳过任何一个环节,否则指令就废了。 说到数据,那得提一下寄存器。在计算机的世界里,寄存器就像是 CPU 内部的“工作台”,操作直接在上面进行,速度极快。而主存和 Cache 就在外面。
举个例子,假设你在写个程序,让 CPU 去计算 1024 乘以 512 的结局。
这时候,CPU 会先从主存里把"1024"取出来,放在寄存器里,然后再去主存里把"512"取出来,也放在寄存器里。
这时候两个数就在寄存器里见面了,不需求再跑去主存了。
这个例子能看出,Cache 就是为了把那些常用的数,比如刚刚例子里的"1024",直接存起来,下次再用的时候,直接从 Cache 里拿,不用再去主存里翻来翻去。 再说说内存管理,这仿佛是给内存戴的眼镜,让你知道哪块是代码,哪块是数据,哪块是堆栈,哪块是栈底。操作系统就像个管理员,把内存划分得井井有条。
比方说,程序运行时需求地址空间,操作系统就给每个程序分一块地盘。操作系统有段管理、页管理这些技术,说白了就是给内存分批次,一次只拿一批数据,避免一次性拿忒多的数据,就像你搬家,不能把所有行李一次性搬进电梯,那样会堵死。
还有中断,这玩意儿就像个自动报警系统。当 CPU 正在做某事,比如算加法,突然有个紧急电话打进来,告诉它“快跑,有个关键会议要开了”,CPU 就得立马停下手里的活,去响应这个电话。
这时候,CPU 就得暂停原来的工作,去处理中断信号,这就像你正在开会,突然有人急事找你,你得先回去,等会议终止后再持续原来的议程。 还有输入输出,这环节主要涉及 I/O 端口和中断。输入输出是为了让 CPU 把数据从外部世界拿进来,要么把数据传给外部设备。
比如键盘,你按下一个键,键盘就是个输入设备,它会把这个信号传给 CPU,CPU 就知道按了啥键,然后程序就知道要处理这个事件。输出设备比如显示器,它是输出设备,把数据传出去。
这些设备之间如何沟通呢?主要靠中断和 I/O 端口。中断就是把突发的关键事件通知 CPU,I/O 端口则是专门用于和外部设备换数据的通道。 最终,还得提一下总线,这就像是一个庞大的路由器。CPU、内存、外设之间得有个传送带,叫总线。CPU 想把数据传出去,还得通过总线发信号给外设,外设再把数据拉回来。
这总线里又分了数据总线、地址总线和管住总线。数据总线负责传送数据,地址总线负责告诉 CPU 要传啥数据,管住总线负责管住整个系统的切换。 总的来说,计算机组成原理就是把这些零散的局部拼成一张整个的网。别看看着复杂,但只要你理解了数据是如何流动的,指令是如何执行的,内存是如何被管理的,那些抽象的概念也就没那么可怕了。
实际上,咱们每天敲代码,背后就是这些硬件在默默工作。
不过,了解硬件原理,也能让你写代码时更懂它,写出来的程序更稳健。
毕竟,知彼知己,百战不殆嘛。