人类为什么要发明计算机
因为懒,哈哈。
计算机软硬件的终极目标
完全代替人类做事情。也可以说是人工智能机器人。 不过人工智能机器人总是伴随着各种伦理上的讨论: 记忆是否可以伪造;克隆人是否该和人享有同样的社会地位;克隆人是否可以被用于战争;等等。
所幸,至今没有人工智能机器人能够通过图灵测试,所以这些问题都也只是纸上谈兵; 或是科幻影小说、影视的作品中的看点。
图灵测试:图灵测试是指测试者在与被测试者(一个人和一台机器)隔开的情况下,通过一些装置(如键盘)向被测试者随意提问。进行多次测试后,如果有超过30%的测试者不能确定出被测试者是人还是机器,那么这台机器就通过了测试,并被认为具有人类智能。图灵测试一词来源于计算机科学和密码学的先驱阿兰·麦席森·图灵写于1950年的一篇论文《计算机器与智能》,其中30%是图灵对2000年时的机器思考能力的一个预测,目前我们已远远落后于这个预测。
计算机原型
最开始出现的应该是图灵机。
【图一:图灵机原型】
表示由程序操控一个寄存器,往特定的存储位置存入特定的值。
后来的冯·诺依曼体系结构,即存储程序原理:把程序本身当作数据来对待,程序和该程序处理的数据用同样的方式储存。就是这个原型的一种实现。
【图二:冯·诺依曼体系的工作原理】
在这个原理之上,计算机的基本组成分为五大部分: 运算器+控制器(CPU), 存储器(内存),输入设备,输出设备。
【图三:计算机部件的连接】
计算机中的程序
程序在底层,也即是低级语言(如汇编语言)中,是可以直接操作寄存器的,每一个操作的指令,都会被送到一条流水线中去处理,流水线大致分为取指,译码,执行三个步骤(复杂的情况下还会后续访存,写回,更新,这几个步骤)。这种流水线的工作形式保证了CPU的高效利用。
然而光靠这种流水线作业来高效利用CPU的处理能力是远远不够的。通常情况下,CPU的处理速度远远超过计算机其他部件的处理速度。
【图四:计算机各部件的处理速度对比】
想要提高CPU的利用率,要么提升硬盘等设备的速度,和CPU匹配;这在现阶段是不可能实现的。 要么,就承认局限性,充分压榨CPU的能力。
CPU的高效利用
同步变为异步
CPU同时为所有的程序服务,就像餐厅里的服务员在每个顾客之间跑来跑去一样,只在顾客需要的时候出现。并且,服务员完成自己的服务的速度,比后台的厨师完成备餐的速度要快许多;这种差别就像在计算机里一样,CPU的速度远远快于其他设备。
举个实例:某个程序告诉CPU它想调用硬盘里的某个数据的时候,CPU会发起一个读取硬盘数据的操作,但是发起这个操作之后,CPU不会等待硬盘完成,而是立刻去干别的事情,由DMA控制器来负责把数据从硬盘读到内存, 完成后通知CPU。
顺序变为并发
CPU既然是为所有程序服务的,那么就需要在各个程序之间切换,因为CPU只有一个。
一般当一个程序需要进行io操作(读写硬盘,连接网络等)时,这个程序就会进入等待队列,直到数据来了再唤醒这个程序;这和在餐厅点餐是类似的,顾客(程序)点好了菜,总是需要等待后台做好餐(io操作),再由后台人员(程序调度)告诉服务员(CPU)去把菜端上来。
服务员这么忙,顾客那么多,肯定要考虑公平啦。操作系统限制CPU为每个程序服务的时间,一旦超过时间,CPU会更换程序去服务;而未完成服务的程序则会进入一个就绪队列,等待下次CPU来执行它。
增加中间件
当CPU要读取一个数据时,首先从CPU缓存中查找,找到就立即读取并送给CPU处理。 没有找到,就从速率相对较慢的内存中读取并送给CPU处理,同时把这个数据所在的数据块调入缓存中,可以使得以后对整块数据的读取都从缓存中进行,不必再调用内存
【图五:一个存储器层次模型的示例】
增加缓存这个中间件,也是对局部性原理的一种实践。局部性原理可以说是上帝的规则,它在程序和硬件设计中无处不见。
三种不同类型的局部性:
时间局部性(Temporal Locality):如果一个信息项正在被访问,那么在近期它很可能还会被再次访问。 程序循环、堆栈等是产生时间局部性的原因。
空间局部性(Spatial Locality):在最近的将来将用到的信息很可能与现在正在使用的信息在空间地址上是临近的。
顺序局部性(Order Locality):在典型程序中,除转移类指令外,大部分指令是顺序进行的。顺序执行和非顺序执行的比例大致是5:1。此外,对大型数组访问也是顺序的。 指令的顺序执行、数组的连续存放等是产生顺序局部性的原因。
图大多来自《深入理解计算机系统》