作者:Milap Neupane翻译:疯狂的技术宅
原文:https://www.freecodecamp.org/...
未经允许严禁转载
CPU,也被称为微处理器,是计算机的大脑。让我们通过深入了解计算机的核心,来帮助自己有效地编写计算机程序。
“工具通常比机器更简单,它一般用手就可以操作,而机器需要被动物或蒸汽动力启动。”—— Charles Babbage
计算机是由电力驱动的机器,但其灵活性和可编程性有助于实现工具的简单性。
CPU 是计算机的大脑。它执行提供给它的指令。它的主要工作是执行算术和逻辑运算并一起编排指令。在深入了解主要部分之前,我们先来看看CPU的主要组件以及它们的作用分别是什么:
处理器的两个主要组件
- 控制单元 — CU(Control unit )
- 算术和逻辑单元 — ALU(Arithmetic and logical unit)
控制单元 — CU
控制单元 CU 是 CPU 的一部分,用来帮助协调指令的执行,它告诉 CPU 该做什么。根据该指令,激活将 CPU 连接到计算机的其他不同部分的电路,其中包括 ALU。控制单元是 CPU 接收处理指令的第一个组件。
控制单元有两种类型:
- 硬连线控制单元。
- 可微编程(微编程)控制单元。
硬连线控制单元是硬件,需要更改硬件来修改它的工作方式;可编程控制单元可以通过编程来改变其行为。硬连线 CU 在处理指令时更快,而可编程 CU 则更灵活。
算术和逻辑单元 — ALU
算术和逻辑单元 ALU 进行所有的算术和逻辑计算。 ALU 执行加法、减法等操作。 ALU 由执行这些操作的逻辑电路或逻辑门组成。
大多数逻辑门有两个输入端和一个输出端。
下图是半加器电路的一个例子,它接收两个输入并输出结果。A 和 B 是输入,S 是输出,C 是进位。
存储 — 寄存器和内存
CPU 的主要工作是执行提供给它的指令。通常要处理这些指令,它需要数据。一些数据是中间数据,其中一些是输入,另一些是输出。这些数据以及指令存储在以下存储中:
寄存器
寄存器是一小组可以存储数据的地方。寄存器是锁存器的组合。 锁存器也称为触发器,是逻辑门的组合,它能够存储 1 bit 信息。
锁存器有两根输入线:写入和输入线,还有一根输出线。我们可以使写入线更改存储的数据。当禁用写入线时,输出始终保持不变。
CPU 用寄存器来存储输出数据。因为它是中间数据,所以把它送到主存储器(RAM)会很慢。该数据被发送到由总线(BUS)连接的其他寄存器中。寄存器可以用来存储指令、输出数据、存储地址或其它类型的数据。
内存(RAM)
RAM 是一个用优化的方式被紧凑的排列在一起的寄存器的集合,以便它可以存储更多的数据。 RAM(随机存取存储器)是易失性的,当关闭电源时它的数据会丢失。
什么是指令
指令是计算机可以执行的粒度级的计算。 CPU 可以处理各种类型的指令。
指令包括:
- 算术运算,如加和减
- 逻辑指令,如与、或、非
- 数据指令,如移动,输入,输出,加载和存储
- 流程控制指令,例如 goto、if ... goto、call、return
- 通知 CPU 程序已结束的 halt 指令
指令通过使用汇编语言提供给计算机,也可以由编译器生成,或以某些高级语言的形式进行解释。
这些指令在 CPU 内部是硬连线的。 ALU 包含算术和逻辑运算,其中控制流由 CU 管理。
在一个时钟周期内计算机可以执行一条指令,但现代计算机可以执行多个指令。
计算机可以执行的一组指令称为指令集。
CPU时钟
时钟周期
计算机的速度是由其时钟周期决定的。它是计算机每秒时钟周期的数量。单个时钟周期非常小,大约是 250 * 10^-12 秒。时钟周期越短处理器的速度也越快。
CPU 时钟周期以 gHz(千兆赫兹)为单位。 1gHz 等于10⁹Hz(赫兹)。赫兹意味着每秒的周期数。所以1千兆赫表示每秒 10⁹ 个周期。
时钟周期越高,CPU 可以执行的指令就越多。时钟周期 = 1 / 时钟速率CPU时间 = 时钟周期数/时钟速率
这意味着可以提高时钟速率,通过改善 CPU 时间来优化 CPU 执行指令的速度。某些处理器提供了提高时钟周期的能力,但由于它是物理变化,因此可能存在使 CPU 过热甚至被烧毁的问题。
如何执行指令
指令按顺序存储在 RAM 中。假设我们有一个 CPU,其指令包括 OP 代码(操作代码)和存储器或寄存器地址。
控制单元内有两个指令寄存器(IR),它用来加载指令的 OP 代码和指令地址寄存器,它用来加载当前执行指令的地址。在 CPU 的内部还有其他寄存器,用于保存存储在指令最后 4 位地址中的值。
接下来我们举一个添加两个数字的指令的例子。以下是指令和说明:
STEP 1 — LOAD_A 8:
该指令最初保存在 RAM 中,比如说<1100 1000>。前4位是操作码,它决定了指令是什么。该指令被提取到控制单元的 IR 中。指令被解码为 load_A,这意味着它需要加载地址 1000 中的数据,地址 1000 是寄存器 A 指令的最后 4 位。
STEP 2 — LOAD_B 2
与上面类似,这将存储器地址 2(0010)中的数据加载到 CPU 寄存器 B 中.
STEP 3 — ADD B A
现在下一条指令是对这两个数字进行加法运算。在这里 CU 告诉 ALU 执行加法操作并将结果保存回寄存器 A.
STEP 4 — STORE_A 23
这是一组非常简单的指令,可以对两个数字进行加法运算。
我们已经成功的对两个数字进行了加法运算!
总线
CPU、寄存器、存储器和 IO 设备之间的所有数据都通过总线进行传输。要将前面进行加法运算的数据加载到存储器中, CPU 需要将存储器地址写入地址总线,并将运算的结果写入数据总线,还要在控制总线中启用正确的信号。通过这种方式,数据在总线的帮助下加载到存储器中。
缓存
CPU 还有将指令预取到其缓存的机制。据我们所知,处理器可以在一秒钟内完成数百万条指令。这意味着从 RAM 中获取指令所花费的时间比执行它们要多。因此 CPU 缓存会预取一些指令和数据以使执行速度更快。
如果高速缓存和操作存储器中的数据不同,则数据被标记为脏位。
指令流水线
现代 CPU 使用指令流水线来执行指令并行化。获取-解码-执行。当一条指令处于解码阶段时,CPU 可以处理另一条指令用于获取阶段。
但是当一条指令依赖于另一条指令时会有问题。因此处理器执行没有依赖且按不同顺序执行的指令。
多核计算机
它基本上是不同的 CPU,但有一些共享资源,例如缓存。
性能
CPU 的性能由它的执行时间决定。性能 = 1 / 执行时间
假设执行一个程序需要 20ms。 CPU 的性能是 1/20 = 0.05ms 相对性能 = 执行时间1 / 执行时间2
CPU 性能考虑的因素是指令执行时间和 CPU 的时钟速度。因此为了提高程序的性能,我们需要提高时钟速度或减少程序中的指令数。处理器的速度有限,具有多核的现代计算机可以每秒支持数百万条指令。但是如果我们编写的程序有很多指令,这将会降低整体性能。
Big O 表示法根据给定的输入确定性能使如何受到影响的。
工程师在 CPU 中进行了大量优化使其更快,并尽可能多地执行指令。在编写任何程序时,我们需要考虑如何减少提供给 CPU 的指令数量将能够提高计算机程序的性能。
本文首发微信公众号:前端先锋
欢迎扫描二维码关注公众号,每天都给你推送新鲜的前端技术文章
欢迎继续阅读本专栏其它高赞文章:
- 深入理解Shadow DOM v1
- 一步步教你用 WebVR 实现虚拟现实游戏
- 13个帮你提高开发效率的现代CSS框架
- 快速上手BootstrapVue
- JavaScript引擎是如何工作的?从调用栈到Promise你需要知道的一切
- WebSocket实战:在 Node 和 React 之间进行实时通信
- 关于 Git 的 20 个面试题
- 深入解析 Node.js 的 console.log
- Node.js 究竟是什么?
- 30分钟用Node.js构建一个API服务器
- Javascript的对象拷贝
- 程序员30岁前月薪达不到30K,该何去何从
- 14个最好的 JavaScript 数据可视化库
- 8 个给前端的顶级 VS Code 扩展插件
- Node.js 多线程完全指南
- 把HTML转成PDF的4个方案及实现
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。