03、Java JUC 源码分析 - 计算机基础-逻辑运算、继电器和门电路
前面介绍了CPU制造工艺和CPU工作流程,现在我们来了解一下其逻辑基础(本章内容部分参考自书籍:<<编码的奥秘>>)
(之前有写过一篇介绍二进制的文章:二进制:基础、正负数表示、存储与运算)
一、介绍
我们现在知道,在计算机内部,不论是数据还是地址都是一系列0和1的组合,那么计算机是通过何种方式"认识"0和1的呢?又是怎么将这些0和1运用起来执行各种运算操作的呢?CPU中主要的电子元件就是晶体管,像二极管、三极管等,它们是一种固体半导体器件,而半导体的开关状态正好就只两个状态,我们可以通过它的开关状态来传递和处理信息,所以我们可以用1表示开,0表示关,多个0和1的组合表示的就是不同的开光状态组合。
比如我们现在有2个灯泡排成一排,灯泡亮是一种状态,灯泡暗是另一种状态,对应我们的1和0。那么"10"和"01"则可以表示两种不同的状态,我们可以把每一个状态定义为一个行为或者一个字符标识,越多的灯泡就能有越多不同的标识。
二、逻辑与运算
真理是什么呢?亚里士多德认为逻辑与它有关。我们早在中学时代,就在数学中接触过逻辑运算,下面这张真值表,相信大家不会忘记。
通常我们可以用1(也就是真)来表示一个正确的命题,用0(也就是假)来表示一个错误的命题,不同的命题可以组合起来形成新的复合命题,复合命题是否正确(真假),则取决于每个子命题是否正确和它们复合的方式。
比如,我们说一只正常的猫有一张嘴,是一个正确的命题,可以表示为1,说正常的猫有八条腿,是一个错误的命题,可以表示为0。那么我如果说一只正常的猫有一张嘴,并且它有八条腿,明显这个符合命题是错误的。我又说一只正常的猫有一张嘴或者有八条腿,这个符合命题又是正确的。我们可以简化上述描述:
命题1:正常猫有一张嘴->真(1)
命题2:正常猫有八条腿->假(0)
那么,命题1并且命题2->假;命题1或者命题2->真。用符号简述这里的描述,比如用"X"表示并且(AND),用"+"表示或(OR)者,那么命题就成了:1X0=0;1+0=1。按照这个逻辑我们用小表总结一下:
当然,这些都是我们中学的知识,简单回顾一下,那么它又和我们的电路有什么关系呢?我们转换一下思维,比如我非要把上面的例子和电路联系起来,要怎么做?说搞就搞,我们随手就扔出一个电路图:
我们现在定义两个开关就是我们两个子命题,开关闭合表示子命题为真,开关断开表示子命题为假,串联则表示上面描述的"并且"操作,默认认为电源接通的话,这个电路图就可以认为是一个复合命题:每个开关的闭合表示子命题的真假,串联或者并联的方式表示命题复合方式,那么灯泡的亮和暗就代表了这个复合命题的真假,比如上面的串联电路可以表示我们的例子:正常猫有一张嘴 并且 正常猫有八条腿,很明显这个电路图中的灯泡不会亮,它可不会回光返照。相应的,我们的命题:正常猫有一张嘴 或者 正常猫有八条腿可以描述成下面的电路图:
显然,电源接通的情况下,这个灯泡是会发光的。我们的开关可以有很多很多,串联和并联的复杂程度也可以按照我们的要求随时变化,表示可以有很多命题可通过各种复合操作复合到一起。而我们用1表示开关的开启,0表示开关的闭合,似乎非常合理,也正好和我们的真值表一一对应。
举另外一个例子,我还们可以把周末是否要出去玩儿定义一下,很明显,选择就只有两个,出去和不出去。然后我们把可能影响我们是否要出门的因素和它们之间的依赖对我们的选择结果会产生的影响整理出来。比如,如果天气好并且我能起个早床,就可以出门玩儿;如果朋友约我打游戏,我就不出去玩儿等等。将这些列出来后,我们用开关(1/0)表示某一个事件是否发生,将它们之间的关系整合成一个电路图,就像下图一样,我们只需要根据实际情况拨动开关,观察灯泡是否发光,来决定我们是否要出门玩儿。
我们用电路图来表示我们的布尔代数看起来是很奇妙的,感觉这些都是自然而然。但是这个电路早在19世纪就被发明,但那时候却没有人意识到这一点,直到上个世纪30年代才被发现。另一方面,我们肯定不想在每次是否要出去玩儿都要想上图那样搞一个复杂电路图,当然,我们可以做一个控制面板来做简便选择:
控制面板上可以有多个开关和一个灯泡,对应上面的电路图。按照计算机的术语描述,开关就是一种输入设备,而灯泡则是输出设备。
三、继电器与逻辑门
可能你会觉得要控制每个开关都需要自己动手去拨动很麻烦(虽然咱们这个例子无所谓),但是当开关多达几十上百个,还怎么会有闲心去拨动开关呢?等调整完都改吃晚饭了o(╯□╰)o
其实像开关一样,继电器也可以串联或并联以执行逻辑中的简单任务。继电器的组合称为逻辑门。这里所说的“逻辑门执行简单逻辑任务”是指逻辑门只完成最基本的功能。继电器比开关好是因为继电器可以被其他继电器控制而不必用手指控制,这意味着逻辑门可以被组合起来以执行更复杂的任务,比如一些简单的算术操作。
我们来看下面一张电路图:
这张图最开始应该是出现在我们的中学物理教材,最开始A开关是断开的,灯泡不会亮,当我们闭合A开关,电流会通过围绕在铁棒上的线圈,根据电生磁效应,我们知道铁棒会具有磁性,我们甚至可以通过右手螺旋定则判断磁场方向。由于铁棒有了磁性,会把上面弹性的金属簧片B吸下来,从而连通上方的电路图,使灯泡放光,如果我们断开A开关,铁棒磁性消失,金属簧片B则因为没有了吸引力受弹性影响而回到原来的位置,导致电路断开,灯泡熄灭。当然,我们不可能只是为了开关灯泡,就搞一个这么"复杂"的东西出来,没有必要,我们有其它目标,虽然我们现在只是换了一种方式来控制开关。
正如开关可以串联一样,两个继电器(下图已经过简化)同样可以串联起来,上方继电器的输出为下方的继电器提供了输入。如下图所示,当两个开关均断开或断开一个时,灯泡不会发光,只有上下两个开关都闭合(我们可以说两个继电器都被触发),灯泡才会发亮,也就是相当于我们的串联电路,同样也可以设计一个并联电路或更加复杂的电路。
像这样,两个串联的继电器就是一个"与门",这个只是几个基本逻辑门中的其中一个。毕竟使用继电器书写出来太过于复杂,于是电气工程师们用一个特殊的符号表示它,如下图所示(A和B对应上图两个继电器的输入,Y则表示灯泡):
它表示只有当A和B都输入1或者说输入高电平(就像闭合开关一样),输出才是1(高电平),如果要画出其真值表,其实就和我们前面串联开关时画出的真值表一致。
四、总结
到现在,我们已经引出了逻辑门电路的概念,这个其实就是我们大学所学的数字电路与逻辑设计里的基础部分,也是我们整个计算机逻辑电路的基础,下面我们会着重介绍其它基础的门电路,并且这些门电路是怎么协调以完成我们的计算机操作的。
注:部分图片参考自<<编码的奥秘>>