内容来源:计算机科学
指令和程序
指令:指示计算机要做什么的代码,多条指令共同组成程序。
计算机指令长度
由于早期计算机每个字只有8位,指令只占4位,意味着只能有16个指令,这远远不够。
现代计算机有两种方式解决指令不够用的问题:
最直接的是用更多位来表示指令,如32位或64位。
采用“可变指令长度”,令不同的指令的长度不同,尽量节约位数。
该情况下,部分指令后面需要跟数据,如JUMP,称为立即值。
高级CPU设计
现代处理器有专门的电路来处理图形操作,解码压缩视频,加密文档等等,如果使用标准操作来实现需要很多个时钟周期。即便如此,现如今的CPU一秒最少也有上亿次的指令,超高的时钟速度带来一个问题,如何快速地传递数据给CPU,也就是RAM出现了瓶颈。
总线:
RAM是CPU独立之外的组件,所以数据的传递需要通过数据线来实现,我们称之为总线。RAM传输数据需要经过很多到程序,取地址,取数据,配置.....一条普通的指令就需要很多个时钟周期,这会造成CPU空等,就像一台高效的蒸汽机却没有煤能烧。
解决方法:
1.给CPU加一点RAM——“缓存”
如果没有缓存,也就是RAM只能一个一个的传输数据给CPU,而有了缓存之后RAM可以成批成批的给CPU传输数据。 缓存也可以临时空间,存一些中间值,适合长或者复杂的运算。
CPU将计算好的数据返回到缓存中,而不是直接存到RAM中,这同样会加快运行速度,但出现了一个问题:缓存和RAM不一致,这种不一致必须记录下来之后要同步。因此缓存里的每块空间都有一个特殊标记,叫做“脏位”(dirty bit)。
同步一般发生在当缓存满了而CPU又要缓存的时候,在清理缓存之前,会先检查“脏位”,如果是“脏”的就会在加载新缓存前将数据写回RAM中。
2.“指令流水线”
也就是并行处理,CPU的每一部分并不冲突,可同时进行所有部分。之前可能三个时钟周期完成一个指令,现在可以一个周期完成一个指令。
同样也一定存在一定的问题,如数据的“依赖性”,方法是动态排序有依赖关系的指令。又如“问题跳转”(JUMP),会改变指令的顺序,方法是“推测执行”(分支预测),现代CPU预测准确率超过90%。
3.运行多个指令流(超标量处理器)
刚刚说过的方法都是优化一个指令流的吞吐量,另一个方法是,同时运行多个指令流,一个时钟周期完成多个指令(通过使用多核处理器)
多核处理器的意思就是一个CPU芯片里有多个独立的处理单元,他们可以合作运算,共用缓存。当有更高需求时会使用多个CPU