计算机系统的九个伟大思想
现代计算机系统经过70多年的发展已经非常成熟了,计算机的设计者们总结了九个伟大的设计思想,新的计算机系统设计时无不遵循着这九大思想。
一.摩尔定律
摩尔定律是英特尔处理器的创始人之一戈登·摩尔经过多年的观察于1965年得出的一个结论,这个结论就是每隔18个月到24个月,固定大小的单芯片上的硅基晶体管的数量会翻一到两倍,这样就可以在功耗不变的情况下,加大处理器的时钟频率,从而处理器的性能也会翻一到两倍,这个结论在早期还算灵验,早期的处理器设计工作往往需要几年,因此新一代处理器诞生时,单芯片上的硅基晶体管数量很容易翻一到两倍,这个就好像在挤牙膏,随着硅基晶体管集成度越来越高,摩尔定律被打破了,很难做到每一代处理器性能翻一到两倍,能做到50%就不错了。
戈登.摩尔
现在单芯片上的硅基晶体管已经到了7nm级别,由于硅基晶体管的物理特性(栅极电容宽度到了1nm,电阻接近与0,晶体管的源极和漏极就会发生短路,击穿了,因此无法实现开关功能),固定大小的单芯片上不可能突破nm级别,到1nm级别只是理论可能,能不能造出来还另说了,这个实际就好比你拿了一张A4纸进行对折,刚开始对折很容易,当对折几次后,后面的对折难度越来越大,直至不能对折为止。
虽然摩尔定律已经过时,不过新的计算机系统设计时,可以参考这一思想来预测未来计算机系统的工艺水平。
二.分层
计算机界有句谚语:“任何疑难问题,都能通过分层来解决”,虽然这句话说得有点极端,但是不无道理,计算机系统到处都在体现着分层的思想。
分层有的时候也称为抽象,它将一个复杂的系统分成多个层次,每一层专注与这一层功能的实现,分层通常是从上到下的,下面的层次为上层提供服务,这些服务是一些约定好的的接口规范,把这些服务接口定义好了,各个层次就可以专注于各个层次的事情,不用考虑其他层次带来的影响,从而每一层可以独立进行设计和开发,提高生产效率,降低设计难度和复杂度。
在计算机系统中的一个常见的分层如下图:
计算机分层
如上图,计算机系统被分为4个层次,应用程序,运行库,操作系统,硬件。
硬件层提供硬件接口(IO接口)给操作系统,硬件接口有统一的接口规范,操作系统不和具体的硬件打交道,只通过硬件接口控制硬件。
操作系统提供系统调用给运行库,每类操作系统的系统调用都有它自己的实现机制,但是每类系统调用都有调用号或者调用名称和调用参数规范,运行库只需要根据系统调用号或者调用名称 调用参数就可以进行系统调用,不要考虑系统调用的具体实现。
运行库是我们通常所说的API,例如Windows SDK,这些SDK提供给应用程序,之所以封装运行库,很大一部分原因是,直接进行系统调用比较复杂,运行库对系统调用进行了二次封装,简化了调用难度。
应用程序就是我们调用运行库开发的程序,当然应用程序内部还可以继续分层,我们统称它们为应用程序就可以了。
当然计算机中分层的思想还有很多,例如网络协议分层,虚拟内存等,这里不再阐述。
三.加速大概率事件
加速大概率事件远比优化小概率事件更能提高性能,大概率的事件通常比小概率事件更加简单,因此更易于提高,大概率事件是经过仔细的实验和评估得出的结论,不是想当然,自我感觉出来的,当然并不是小概率事件就不去加速,只是大概率事件优先加速,它获得的效益远比小概率事件高。
举个程序开发的例子,一段代码有多个分支,每个分支都有一个被执行到的概率,因此我们可以实验分析每个分支的概率,按照概率大小进行排序,对大概率的分支优先加速优化。
四.通过并行性提高性能
从计算机诞生起,计算机的设计者就通过并行操作来提高性能,通常为了完成一个功能,需要进行一系列的操作,我们可以把这些操作进行重新排列,使得每个操作尽量不依赖其它操作,多个独立的操作就可以同时运行,最大化地利用资源,达到提高性能的目的。
五.通过流水线提高性能
流水线是并行性的一个特例,处理器就是通过流水线的方式来提高指令的执行效率,流水线最初起源于车辆制造,车辆被拆分成很多个的部件,每个部件又可以继续拆分,拆分后的所有部件形成了流水线图,流水线图呈拓扑结构,拓扑中同一层的部件可以由独立的生产线进行生产,这样就可以灵活地扩充生产线来提高车辆的制造效率。
流水线优化的最大目标是将依赖延迟到最后,对所有的依赖关系进行拆解,拆解成多个不互相依赖的步骤,使得每个步骤可以并行运行,从而从整体上提高运行吞吐量和效率。
六.通过预测提高性能
古语云:'人无远虑,必有近忧',这句话也是可以用在计算机上的,在某些情况下,我们可以大胆地预测计算机下一步的动作,可以提前将这些动作完成,等到需要执行这些动作的时候,已经提前准备好了,当然提前预测也是有失败率的,假设失败造成的效率下降为X,执行了预测的动作后,提高的效率为Y,只要X小于Y,这个提前预测就是有效的,是可以提高性能的。
计算机里一个比较常见的提前预测的例子就是磁盘预读,通常我们读取磁盘的数据时,会先将硬盘数据读入到缓冲中,程序从缓冲中读取数据,当缓冲数据被读完后,处理器再从磁盘读取下一批数据,这里可以假设读取磁盘数据是顺序的,我们可以提前把下一次要读取的数据,加入到另外一个缓冲中,这样读取当前缓冲数据的时候,已经开始读取下一批缓冲的数据了,充分地利用了硬件资源,当前缓冲数据读取完毕后,直接可以用下一批缓冲的数据,不需要等待,当然这里如果下一批数据变成了随机的,那就可能会造成已经读取的数据的失效和浪费,不过,如果大部分情况下都是顺序读取的,提前读取获得的性能提高远大于由于读取失效造成的性能下降。
七.局部性原理
局部性原理的意思是计算机处理器经常执行的指令和操作的数据通常会聚集在一个较小的连续区域。
局部性原理分为时间局部性,空间局部性,顺序局部性。
时间局部性:最近访问的数据和指令很有可能不久会继续访问,例如循环操作,在循环操作里的指令和数据会不断重复执行,这些指令和数据就是热点指令和数据,聚集在一个局部的连续区域。
空间局部性:最近访问的数据和下一次访问的数据在空间上是连续的,并且就在附近,例如处理器正在读取同一个磁道上数据时,当前访问扇区2,下一步很有可能访问扇区3或者扇区1。
顺序局部性:程序中的指令大部分都是连续的,跳转指令(call,jmp)等除外,另外对于数组来说,所有的元素都是连续存放的。
因此我们根据局部性原理,可以将连续的指令和数据进行缓冲,例如处理器将指令和数据放在高速缓冲上来提高性能。
八.存储器层次
计算机发展到现阶段,以目前CPU集成电路的集成方式和材料,性能已经快发挥到极致了,存储器的性能成了计算机系统性能的瓶颈,因此程序员们希望存储器的速度更快,容量更大,价格更便宜,事实上想要全部满足很难做到,因此计算机设计者发明了存储器层次来解决这个问题,速度最快,容量最小,价格最贵的存储器处在顶层,速度最慢,容量最大,价格最便宜的存储器处在最底层,我们通常所说的内存处在中间层次,它是存储器速度,容量,价格权衡后的结果,如下图
存储器层次
九.通过冗余提高可靠性
计算机不光要速度快,而且要可靠,任何一个物理器件都可能失效,因此可以通过对物理器件进行冗余的方式来提高计算的可靠性,冗余的部件可以替代失败部件并且可以帮助监测错误,就好比一辆车的轮胎都需要有个备胎,一旦轮胎坏了可以用这个备胎进行替换。