硬件部分组成原理

8个二进制位是一字节 可以表示从0到255一共256个数 32位能表示43亿左右 64位能表示9.2x10^18
1kb(千字节)=1024字节 8192位
1mb(兆字节)=1024kb 一百万多字节 mega就是百万字节
1gb(千兆字节)=1024mb 十亿多字节 giga就是十亿字节
1tb=1024gb 一万亿字节 ​​​

晶体管一根控制线输入 两个电极一个输出一个接地用来做非门 可以控制电流走向 两个晶体管串联两个输入做与门 并联做或门 与非一串 并联一个或 再加个与做异或门 ​​​

然后用逻辑门来拼算数单元 最简单的两个位的加法电路 两个输入 一个输出 和异或门逻辑相同 1+1此时会有进位 加一个与门即可表示进位 这个电路叫半加器 那么处理超过两个位的加法时 此时有三个输入 需要全加器 把一个半加器输出和另一个输入并联 然后用一个或门检测两个半加器的进位 输出进位 现在来制作一个8位加法器 第一位输入用一个半加器 后面每一个进位都输入下一层全加器 用全加器嵌套七次 最后输出的进位如果还要进到第九位 就是和太大溢出了 现代计算机每秒钟几十亿次计算 用的是超前进位加法器

逻辑单元同理 把not and or xor逻辑门组合起来 进行一些逻辑操作 比如检测一个数值是不是负数 算数单元和逻辑单元构成一个算数逻辑单元v 两个8位的输入 一个4位的操作代码 一个8位输出 一个1位标志 0或负数或溢出 表示两个数相等或大于小于 复杂的alu有更多标志 ​​​

用一个or门把输出接回其中一个输入做一个回向电路 该电路能永久记录1 同样的方式做一个and门回向电路 能永久记录0 把这两个电路结合起来 可以做一个and or锁存器 两个输入 分别是设置和复位 如果设置和复位都是0 电路会输出最后一次的输出结果 ​​​

在锁存器的基础上 再加一些逻辑门 输入变成一条数据输入线 一条允许写入线 就做成了门锁 一个锁存器只能存一位 8个锁存器并排放一起就能存8位的信息 一组这样的锁存器就是寄存器 能存多少位的数字叫位宽 现在一般是64位 ​​​

如果并排放置锁存器 64位就需要64根输入线64根输出端加1根启动线 所以用矩阵把锁存器排列成网格 256位做成16x16 写入时只用打开交叉处锁存器的允许写入线 加一个and门 只有行线列线都为1时 and门才输出1 可以单独启用某一个锁存器 这样就只需要一根数据线 一根允许写入线连接所有的锁存器了 读取数据也同理 只需要一根允许读取线 按行列取地址 只有相对应的一个锁存器开启 把这个256位的内存看作一个整体 只需要一个8位地址 一个数据线 一个允许写入线 和一个允许读取线 继续抽象 把8个这样的寄存器并排放置 8位地址线同时给这8个寄存器同样的地址 每块寄存器存1位 就存了一个8位数 总共能存256个字节 继续抽象成一个整体的可寻址内存 即一个有256个地址 每个地址能读一个8位数的随机存取存储器ram

先拿一个内存来 再来几个寄存器abcd用来临时存数据和操作数据 给cpu支持的所有指令分配一个id 比如一个八位代码 前四位存操作码后四位表示数据来自哪里 比如ram或寄存器 另外还需要两个寄存器 一个追踪程序运行到哪里了 叫指令地址寄存器 存当前指令的内存地址 另一个存当前指令 叫指令寄存器 cpu的第一个阶段叫取指令阶段 将指令地址寄存器连接到ram 比如地址为0 那么ram返回地址为0的数据复制到指令寄存器里 现在一个八位的指令拿到了 第二阶段解码阶段 比如前四位的指令0010是放到寄存器a里 后四位表示的是ram的地址1110 接下来有一个逻辑门组成的控制单元来检验前四位操作码是不是0010 第三阶段执行阶段 这个检验指令的电路可以打开ram的允许读取线 把地址14的数据传到a去 同时检验电路能启用a的允许写入线 指令就完成了

不同指令由不同逻辑电路解码 这些逻辑电路会配置cpu内的组件来执行对应操作 把控制单元抽象成一个整体 它是cpu的总指挥 当然还有算数逻辑单元与其连接 进行运算和逻辑处理 cpu的节奏由时钟管理 时钟以精确的间隔 触发电信号 控制单元会用这个信号 推进cpu的内部操作 确保一切按步骤进行 就像节拍器一样 cpu取指令 解码 执行的速度叫时钟速度 单位是赫兹 比如这三个指令用了1秒 频率就是3/1=3hz 1Mhz是一秒钟一百万个时钟周期 现在的手机电脑都是每秒几千兆赫兹 一秒钟十亿个时钟周期 计算机超频意思是修改时钟速度 加快cpu速度 超频太多会让cpu过热或产生乱码 因为信号跟不上时钟 同理还有降频 把cpu速度降下来 可以省电 特别是用电池的手机笔记本 现代处理器可以按需求加快或减慢时钟速度 动态调整频率

cpu是可编程的 如果写入不同指令 就会执行不同任务 cpu是一块硬件 可以被软件控制 指令和数据都是存在同一个内存里的 它们从根本上讲没有区别 都是二进制数 软件让我们做到硬件做不到的事 比如alu没有除法功能 但是程序可以让cpu在内存不同地址中跳转取指令 连续跑不同指令 实现除法功能 毕竟加减乘除的本质都是加法 现代cpu的指令有多位 比如32位或64 位 这叫指令长度 还有一种叫可变指令长度 指令可以是任意长度 但读取阶段会复杂一点 现代处理器有上千个指令和指令变种 长度从8到120位 指令越来越多 是因为给cpu设计了越来越多的功能

现代cpu直接在硬件层面设计了除法 可以直接给alu除法指令 这让alu更大也更复杂 现在处理器有专门的电路来处理图形操作 解码压缩视频 加密文档等等 如果用标准操作来实现 要很多个时钟周期 有些处理器有额外的电路来处理更复杂的操作 用于游戏和加密等场景 ​​​

超高的时钟周期带来另一个问题 如何快速传递数据给cpu ram成了瓶颈 ram是cpu之外的独立组件 意味着数据要用线来传输 叫总线bus 电信号的传输速度接近光速 cpu每秒可以处理上亿条指令 很小的延迟也会造成问题 ram还需要找地址 取数据 输出数据 一条从内存读数据的指令可能要多个时钟周期 cpu空等数据 解决延迟的方法之一是给cpu加一点ram 叫缓存cache 因为处理器里面空间不大 所以缓存一般只有kb或mb 缓存提高了速度 cpu从ram拿数据时 ram不用传一个 可以传一批 存在缓存 因为缓存离cpu近 一个时钟周期就能给数据 比反复去ram拿数据快的多 如果想要的数据已经在缓存 叫缓存命中 如果想要的数据不在缓存 叫缓存未命中

缓存也可以当临时空间 存一些中间值 适合长或复杂的运算 假设cpu算完了 想把结果传回地址150 就像之前 数据不是直接存到ram 而是存在缓存 这样不但存起来更快 如果要接着算 取值也快一些 但这样带来一个问题 缓存和ram不一致了 这种不一致必须要记录下来 之后要同步 因此缓存里每块空间 有一个特殊标记 叫脏位dirty bit 同步一般发生在缓存满了 而cpu又要缓存时 在清理缓存腾出空间之前 会先检查脏位 如果是脏的 在加载新内容之前 会把数据写回ram

另一种提升性能的方法叫指令流水线 cpu是按序处理 取址 解码 执行 不断重复 这种设计 三个时钟周期执行一条指令 但因为每个阶段用的是cpu的不同部分 意味着可以并行处理 执行一个指令时 同时解码下一个指令 同时读取下下个指令 不同任务重叠进行 同时用上cpu里所有部分 这样的流水线 每个时钟周期执行一个指令 吞吐量x3 这也会带来一些问题 第一个问题是 指令之间的依赖关系 举个例子 你在读某个数据 而正在执行的指令会改这个数据 也就是说拿的是旧数据 因此流水线处理器 要先弄清数据依赖性 必要时停止流水线 避免出问题 高端处理器 比如电脑手机那种 会更进一步 动态排序有依赖关系的指令 最小化流水线的停工时间 这叫乱序执行 这种电路非常复杂 但因为非常高效 几乎所有现代处理器都有流水线

第二个问题是条件跳转 比如jump negative 这些指令会改变程序的执行流 简单的流水线处理器看到jump指令会停一会儿 等待条件值确定下来 一旦jump的结果出了 处理器就继续流水线 因为空等会造成延迟 所以高端处理器会用一些技巧 ​​​可以把jump想成是岔路口 高端cpu会猜哪条路的可能性更大一些 然后提前把指令放进流水线 这叫推测执行 当jump的结果出了 如果cpu猜对了 流水线已经塞满正确指令 可以马上运行 如果cpu猜错了 就要清空流水线 就像走错路掉头 为了尽可能的减少清空流水线的速度 cpu厂商开发了复杂的方法 来猜测哪条分支更有可能 叫分支预测 现代cpu的正确率超过90%

理想情况下 流水线一个时钟周期完成一个指令 然后超标量处理器出现了 一个时钟周期完成多个指令 即便有流水线设计 在指令执行阶段 处理器里有些区域还是可能会空闲 比如 执行一个从内存取值指令期间 alu会闲置 所以一次性处理多条指令(取指令+解码)会更好 如果多条指令要cpu的不同部分 就多条同时执行 我们可以再进一步 加多几个相同的电路 执行出现频次很高的指令 举例 很多cpu有四个 八个甚至更多完全相同的alu 可以同时执行多个数学运算 目前说过的方法 都是优化一个指令流的吞吐量 另一个提升性能的方法是 同时运行多个指令流 用多核处理器 意思是一个cpu芯片里 有多个独立处理单元 很像是有多个独立cpu 但因为它们整合紧密 可以共享一些资源 比如缓存 使得多核可以合作运算 但多核不够时 可以用多个cpu 高端计算机 比如现在给你传视频的YouTube服务器 让多人能同时流畅观看 2个或4个cpu是最常见的 但有时人们有更高的性能要求 所以造了超级计算机

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值