计算机科学速成课2
前面已经做了一个算术逻辑单元ALU,输入二进制,它会执行计算,还做了两种内存:寄存器,在此基础上扩大规模做出了RAM,RAM是一大块内存,能在不同的地址存储大量的数字。把这些组合起来,形成计算机的心脏,即中央处理单元CPU(Central Processing Unit)。
CPU负责执行程序,像是office,浏览器等等。程序(program)由一个个操作(operation)组成,这些操作称之为指令(instruction),顾名思义,指示计算机要做什么。如数学指令,CPU会让ALU进行数学运算。内存指令,CPU会和内存通信,然后读/写值。
搭建一个CPU如下
首先需要一些内存,上part的RAM
再来四个8位寄存器,用来临时存储数据和操作数据
还需要两个寄存器,一个寄存器追踪程序运行到哪里了,“指令地址寄存器,存储当前指令的内存地址。另一个寄存器存当前的指令,“指令寄存器”。
CPU支持的指令对应的指令表,此例中,前四位来存储操作码,后四位代表数据来自哪里,寄存器或是内存地址。
启动计算器时,所以寄存器从0开始。CPU的第一个阶段叫做取指令阶段(fetch phase),负责拿到指令。首先,将指令地址寄存器连接到RAM,寄存器的值为0,所以RAM返回地址为0的值,00101110会复制到指令寄存器里。
拿到了指令,要知道是什么指令才能执行,即CPU的第二阶段,解码阶段(decode phase),参照指令表,前四位0010是LOAD_A指令,意思是把RAM的值放入寄存器A中,后四位1110是RAM的内存地址。指令是由控制单元进行解码的,
知道了是什么指令,就可以开始执行了,即执行阶段(execute phase)。
指令完成,把指令地址寄存器+1,去拿内存中的下一条指令,“执行阶段”就结束了。
不同的指令是由不同的逻辑电路进行解码,这些逻辑电路会配置CPU内的组件来执行对应的操作。控制单元指挥CPU的所有组件。
上述的“取指令-解码-执行”完成后,现在可以再来一次,从取指令开始,此时指令地址寄存器的值是1,所以RAM返回地址为1的里的值:00011111,解码阶段,前四位0001是LOAD_B指令,从RAM里把值复制到寄存器B中。后四位的内存地址是1111,即15。进入执行阶段,“控制单元”叫RAM读取地址15的值,并配置寄存器B开始接收。
最后一件事是指令地址寄存器加1,如此又完成了一个循环。
下一条指令有点不同,10000100,1000是ADD 指令,而0100不再是RAM 的地址,而是2位2位分别代表两个寄存器。01代表寄存器B,00代表寄存器A,所以10000100这条指令代表的是将B中的值加到A里面,涉及到相加操作,需要ALU。
控制单元负责选择正确的寄存器作为ALU的输入,并配置ALU进行正确的操作。即启用寄存器B和寄存器A作为ALU的输入,传递ADD操作码告诉它要做什么,接着控制单元用一个自己的寄存器保存计算结果,关闭ALU,将值写入正确的寄存器中。最后,将指令地址寄存器加1,该循环完成。
最后一个指令,01001101,解码得知是STORE_A指令,将寄存器A的值放入内存地址为1101(13)中。
如此,模拟运行了一个电脑程序,它从内存中加载两个值,相加,再将结果写入内存中。CPU的工作节奏“取指令-解码-执行”是由“时钟”来完成的,时钟以精确地间隔触发电信号,控制单元会用这个电信号,推进CPU的内部操作,确保一切按照步骤进行。
CPU“取指令-解码-执行”的速度叫做“时钟速度”,单位是赫兹,1赫兹代表1秒一个周期。例子中6min讲了4个指令,读取-读取-相加-存储,所以时钟速度是4 * 3 / 6 * 60,即0.03赫兹。
超频即修改时钟速度,加快CPU速度,超频过多会让CPU过热,或是产生乱码,因为信号跟不上时钟。
如此,加上时钟后,CPU才是完整的。RAM是在CPU之外的独立组件,CPU和RAM之间通过“数据线”,“地址线”,“允许读/写线”进行通信
CPU之所以强大是因为它是可编程的,如果写入不同的指令就会执行不同的任务。所以CPU是一块硬件,可以被软件控制。
早期计算机的提速方式是减少晶体管的切换时间,这些晶体管组成了逻辑门,ALU和前面说的其他组件。但现代处理器有上千条指令,有各种巧妙复杂的电路。
超高的时钟速度带了一个问题:如何快速的传递数据给CPU。因为RAM需要时间找地址,取数据,配置,输出数据,这样会造成CPU空等数据,解决的方法之一就是给CPU加一些RAM即缓存。缓存提高了速度,CPU从RAM中取数据时,RAM不用传一个,可以传一批。缓存里的每块空间,有一个特殊标记—dirty bit(脏位),需要和RAM中的数据进行同步。
另一种是使用指令流水线的方式来提升性能。前面CPU都是按照如下的方式按序处理,这种设计,三个时钟周期执行一条执行,但每个阶段用的是CPU的不同部分,意味着可以并行处理。
这样也会带来几个问题,比如指令之间的依赖关系,条件跳转。
也可以像这样
这些年,处理器不但大大提高了速度,而且也变得更加复杂,用了各种技巧榨干每个时钟周期,做尽可能多的运算。而我们的任务是运用这些计算能力做一些炫酷实用的事情。而这就是编程。
程序如何进入计算机?程序需要加载进内存。
早期的编程方式,不管是插线板,开关或是穿孔纸卡,都要非常了解底层硬件,比如操作码,寄存器,这样才能写程序。这样编程很难,所以我们需要一种简单的方式告诉计算机要做什么,一种更简单的编程方式。
p15 阿兰 图灵
非数学,非计算机专业的我,对编程什么的一窍不通的我要怎么理解图灵机的概念?
图灵机是计算模型,证明了这个简单假想机器,如果有足够的时间和内存,可以执行任何计算。但不是所有的问题都可以用计算解决。