早期计算机的提速方式是 减少晶体管的切换时间。晶体管组成了逻辑门,ALU和之前讲的其他组件,但是这种方式最终会遇到瓶颈,所以处理器厂商发明各种新技术来提升性能,不但让简单指令运行更快也让他能进行更复杂的运算
上一篇文章中我们做了一个除法的程序,其实现原理是不断使用减法当检测到0或者负数时停止。但是这种方式需要很多个时钟周期才能完成(13个周期,每次发一个时钟周期CPU去取一次指令执行【取指令,解码,执行】),特别低效。
现在的CPU已经直接再硬件层面设计了除法,可以直接给ALU除法指令让其运行除法,只需一个时钟周期。
聪明的你应该已经想到了现代CPU厂商提高效率的办法了:没错,那就是给硬件设计越来越多的指令让其支持更多的操作,只为了减少执行操作时所需要的时钟周期。 (除法之前再软件层面设计基于简单的硬件指令需要执行13个,现在只需要一个指令即可)。
现代处理器中有专门的电路来处理图形操作,解码压缩视频,加密文档。。。
通过上面的优化操作,指令执行的效率越来越快了,但是指令执行需要的是数据。因此出现了另外一个问题——如何快速传递数据给CPU? 就像跑车的速度很快,但你加油的速度太慢了。你老是得等油加满才能继续跑,所以解决问题时怎样让油加的更快
RAM是CPU之外的独立组件,前面几篇文章我们也讲过指令是存储在RAM中的,CPU需要去和RAM通信,包括从RAM中取指令,读取指定内存地址的值给寄存器,寄存器将值存储到指定内存地址。。。。这些操作都是通过BUS总线来通信的(BUS总线结合了之前的RAM的允许数据输入线,数据输出线等等)
总线可能只有几厘米,电信号传输接近光速,因此即使很小的延迟也会造成问题。比如RAM需要时间去找数据,输出数据,一个从内存中读数据这个指令可能要多个时钟周期去完成,但是此时CPU却在空等数据这肯定是不行的。
解决的方法之一就是给CPU加一点RAM,也就是“缓存”
处理器的空间不大,所以缓存只有KB或者MB,而RAM都是GB,缓存提高了速度。
如果每次CPU从RAM读取数据时RAM传的不是一个,而是一块呢?
我们假设现在是一个图书管理员,需要将刚采购的图书放到指定类别的图书架上。大家不可能一次只拿一本去挨个找到对应的货架放上去吧,都是一次拿很多本然后再去放。虽然这样拿书花的时间会长一点,但是这些书都在你手上可以很快的把书放到货架上,而不是每次都去拿一本。
和每次读取一个缓存行的道理是一样的,虽然读取的时间会花的久一点,但是数据可以存在缓存中。
当取数据时如果缓存中存在这块数据就叫缓存命中,缓存中不存在就叫缓存未命中。
对比于刚刚图书管理员的例子,如果你手上拿的书正好是货架对应类别的那就可以直接放到架子上,否则还是需要去采购的图书里面再拿下一批
缓存离CPU近,一个时钟周期就可以给到数据,CPU不需要空等数据了。
缓存也可以当临时空间,存一些中间值,适合长/复杂的运算
有了缓存当然方便,我们计算出来的值也可以放入到缓存中这样就省的放入内存再从内存中读取了,但是好是好,有一个问题就是缓存中的数据会和RAM中不一致。这种不一致会被记录下来:在每个缓存行的空间中都有一个特殊标记,叫“脏位”, 等待之后同步到内存中。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。