第1章
数据存储
在这一章中,我们将要学习与计算机中数据表示和数据存储有关的主题。还会讨论一些技术问题,因为这些情况通常都反映在现今计算机的外部特征上。但是,我们讨论的主题大多数都是与计算机设计密切相关的,即使今天的技术被明天的技术所代替之后也是如此。
1.1 位和它们的存储
在当今的计算机里,信息是用由0和1组成的位模式编码的。数字0和1称为位(bit),即二进制数字。虽然你马上会将它们与数字值联系起来,但是它们实际上只是种符号,它们的意义是由处理中的应用决定的。有时位模式1表示数字值;有时它们表示字母和标点这样的字符;有时它们表示图像;有时它们则表示声音。要把位储存在计算机中需要一种可以有两个状态的设备,如开关(开或关)、电子控制继电器(激活与否)或其他将在下面提到的设备。一个状态用来表示1,另一个状态用来表示0。
1.1.1 布尔运算
让我们观察运算AND(与)、OR(或)和XOR(异或),如图1.1所示。这些运算类似于算术运算TIMES(乘)和PLUS(加),因为都是组合一对值(该运算的输入)产生第三个值(该运算的输出)。但是,不同于算术运算的是,由AND、OR和XOR运算所操作的数只能是0和1。这里,我们用数字0表示假,数字1表示真。在真/假值上的运算称为布尔运算(boolean operation),以纪念数学家乔治·布尔(George Boole,1815-1864),他是数学中称为逻辑的领域2里的先驱者。
布尔运算“与(AND)”是反映由两个较小、较简单的语句通过连接词AND组合而成的语句的真或假(值)。它具有如下的一般形式:
P AND Q
其中,P表示一个语句,Q表示另一个语句。例如,
Kermit是一只青蛙 AND Piggy小姐是一位演员
“与”运算的输入是复合语句中两个分句的真或假(值),而它的输出则表示该复合语句本身的真或假(值)。P AND Q型的语句是真,当且仅当它的两个分句都是真。所以,1 AND 1是1,而所有其他情况产生的输出都是0,如图1.1所示。
同理,“或(OR)”运算是基于如下形式的复合语句
P OR Q
其中,P表示一个语句,Q表示另一个语句。当至少有一个分句为真时,这个语句才为真,如图1.1所示。
在英语中,没有单独一个连接词可以表达XOR(异或)运算。当一个输入为1(真),而另一个输入为0(假)时,“异或”运算的值为1(真),否则为0(假)。例如,形为P XOR Q的语句意味着“P和Q不相同时为真。”如图1.1所示。
“异或”运算
“或”运算
“与”运算
图1.1 布尔运算AND、OR和XOR(异或)
运算NOT(非)是另一个布尔运算。它不同于AND、OR和XOR,因为它只有一个输入。它的输出是输入的相反值:输入为真时输出为假,反之亦然。于是,如果“非”运算的输入是语句
Fozzie是一头熊
那么它的输出是
Fozzie不是一头熊
1.1.2 门和触发器
当给出一个布尔运算的输入值时能够产生该布尔运算的输出值的设备称为门(gate)。门可以用各种各样的技术构造出来,如齿轮、继电器和光学设备。当今的计算机通常是用小的电子电路实现的,它是用电压电平表示数字0和1。但是,我们不需要了解这些细节。对我们来说,用符号形式来表示门就足够了,如图1.2所示。注意,“与”、“或”、“异或”和“非”门是用不同形状的图表示的,它的一边是输入,而另一边是输出。

图1.2 “与”、“或”、“异或”和“非”门的图形符号以及它们的输入输出值表
上面这样的门为构造计算机提供了构件。在用这些构件构造计算机时,一个重要的环节是如图1.3所描绘的电路。这是称为触发器的电路中的一个特殊例子。触发器(flip-flop)是一个这样的电路,它产生的输出值0或1能够一直保持,直到来自另一个电路的短暂脉冲的到来才能将它的值改变。换句话说,它的输出是在外部的触发下在两个值之间转换。在图1.3所示的电路中,只要两个输入仍然是0,那么它的输出(不论0或1)都不会改变。但是,如果在它上部的输入上短暂地置一个1,那么将会强制使它的输出为1;反之,如果在它下部的输入上短暂地置一个1,那么将会强制使它的输出为0。

图1.3 一个简单的触发器电路
下面进行详细讨论。在不知道图1.3中电路的当前输出的情况下,假定上部的输入改变为1而下部的输入仍然为0(见图1.4(a))。这将使“或”门的输出为1,不管该门的另一个输入是什么。这样,使“与”门的两个输入都为1,因为该门的另一个输入已经为1(由触发器下部的输入经过“非”门得到)。于是,“与”门的输出将变成1,这意味着“或”门的另一个输入也将是1(见图1.4(b))。这就保证“或”门的输出仍然是1,即使触发器上部的输入变回0(见图1.4(c))。简言之,触发器的输出已变成1,而且这个输出值在上部的输入变回0后仍将保持。

(a)将上面的输入置1。 (b)这使“或”门的输出为1,接着使“与”
门的输出为1。
?
(c)在上面的输入变为0后,由于“与”门的输出为1,故“或”门的输出仍为1。
?图1.4 将触发器的输出设置为1
同样,在下部的输入上短暂地置一个1,将强制使触发器的输出为0,而且这个输出值在下部的输入值变回0后仍将保持。
由此可见,触发器的意义在于,它是计算机中储存一个二进制位的理想存储构件。储存在触发器里面的值是它的输出值。其他的电路只要给这个触发器的输入端发送脉冲就可以很容易地改变它的值。同样,其他的电路可以将触发器的输出作为自己的输入,来利用这个触发器中储存的值。
当然,还有其他的办法来搭建触发器。另一个例子如图1.5所示。如果测试一下这个电路将会发现,虽然它与图1.3的电路有不同的内部结构,但是它们的外部特征是一样的。这就引出了抽象工具的作用的第一个例子。当设计一个触发器时,工程师考虑如何利用门电路作为构件来搭建触发器的方法。然后,一旦设计好触发器和其他基本电路,工程师又可以利用这些电路作为构件来搭建更为复杂的电路。这样,计算机电路图的设计呈现为层次结构,它的每一层都利用下一层的构件作为抽象工具来加以利用。

图1.5 搭建触发器的另一个方法
1.1.3 其他存储技术
20世纪60年代,二进制位利用磁芯储存在计算机中。磁芯(cores)由磁性材料做成,形状像炸面圈似的小环,环中心穿有几根导线3。当通过导线传送电流时,每个磁芯磁化为两个极性方向中的一种。之后,观察通过磁芯环内导线传送的电流的效应就可以检测出磁芯的磁场方向。于是,磁芯为储存一个二进制位提供了另一种手段:用它的一个磁场方向表示1,用另一个磁场方向表示0。不过因为体积大而且耗电,这种系统已经被淘汰了。
一种比较新的储存二进制位的方法是用电容。电容由两块相互平行放置的金属板组成,板间距离很小。如果给这两块板加一个电压源(一块接正极,一块接负极),那么来自电压源的电荷将分布在这两块板上。当撤去电压源时,这些电荷将滞留在这两块板上。如果将这两块板连接起来,那么电流将在这个连接上流动,电荷也将被中和。于是,电容可以处在两个状态中的一个:充电和放电。当今的技术已经能够在一块晶片(称为芯片(chip))上构建数百万个微小电容以及与它们相关的电路。于是,电容已经成为计算机中储存二进制位的一种流行技术。
还有一种比较新的技术可以把二进制位储存在几埃4大小的设备里。(一埃的长度小于氢原子的直径。)一个实例是快闪存储器(flash memory),简称闪存。有的数码相机利用它来存放图像。使用闪存,二进制位是通过由二氧化硅做成的微小容器里的电子来表示的。二进制位由容器的“满”和“空”来表示。每个容器的直径约为90埃。
触发器、磁芯、电容和闪存不仅代表了微型化上的进步,它们也提供了具有不同级别易失性的存储器系统。磁芯将无限期地保持它的磁场。触发器在电源断开时其保存的数据将丢失。微电容里存放的电荷很不稳定,它们自己会逐渐消失,即使它们所依附的电路能够正常工作。因此,对微电容里的电荷要进行有规律的补充,这是通过一种称为刷新电路的电路技术实现的。由于这种易失性,通过这些技术构建的计算机存储器(见1.2节)称为动态存储器(dynamic memory)。闪存中微容器里的电子能够保留许多年,因此小型闪存系统成为诸如电子玩具、电话和通用计算机(见3.2节)等设备里永久性记录程序的流行技术。在这些应用中,微容器里的内容只需要读,而不再需要改变,因此引出了称为只读存储器(Read Only Memory,ROM)的存储器系统。
1.1.4 十六进制记数法
当考察计算机的内部活动时,我们必须与二进制串打交道,有的串可能很长。长的二进制位串通常称为流(stream)。不幸的是,流很难为人脑所理解。单是誊写位模式101101010011就很乏味,而且容易出错。因此,为了简化这些位模式的表示,我们通常使用称为十六进制记数法(hexadecimal notation)的简写记数法,它利用了计算机里位模式的长度大都是4的倍数的优点。特别是,十六进制记数法利用一个符号来表示一个4位模式,所以一个12位的串只需要3个字符就可以表示。
图1.6描述了十六进制编码系统。左边一列给出了所有可能的4位模式;右边一列给出了在十六进制记数法中表示左面的位模式所用的符号。利用这个系统,位模式10110101表示为B5。它是这样得到的:先把位模式分为长度为4的子串,然后每个子串用对应于它的十六进制符号代替:1011用B表示,而0101用5表示。按这个方法,16位模式101001001100100可用比较简短的形式A4C8表示。
位模式 十六进制
图1.6 十六进制编码系统
在下一章中,我们将广泛地使用十六进制记数法。那时你将体会到它的有效性。
问题与练习![]()
1. 输入什么样的位模式可以使下面的电路的输出为1?
![]()
2. 对于图1.3中的触发器,本节曾经提到,当给下部的输入上加1(上部的输入保持为0)时,将强制它的输出变为0。请描述这个触发器在这个情况下所发生的事件序列。
3. 假设图1.5的两个输入都是0。请描述在这个触发器上部的那个输入短暂地置为1时所发生的事件序列。
4. 经常需要协调一个电路各部分的工作。这是通过给这个电路中需要协调的各部分连入一个脉动信号(称为时钟信号)来实现的。随着时钟信号在值0和1之间交替取值,它激活各种电路构件。下图所示的例子就是这样的电路的一部分,它包含了图1.3的触发器。什么样的时钟信号值可以使触发器屏蔽该电路的输入值的作用?什么样的时钟信号值可以使触发器响应该电路的输入值的作用?

5.a. 如果一个“或”门的输出传递给一个“非”门,那么这个组合电路计算的布尔运算称为NOR(或非),它仅当两个输入都为0时才输出1。“或非”门的符号类似于“或”门,仅在输出上加了个圆圈。下图包含一个“与”门和两个“或非”门。这个电路计算的是什么样的布尔运算?

b. 如果一个“与”门的输出传递给一个“非”门,那么这个组合电路计算的布尔运算称为NAND(与非),它仅当两个输入都为1时才输出0。“与非”门的符号类似于“与”门,仅在输出上加了个圆圈。下图是包含“与非”门的电路。这个电路计算的是什么样的布尔运算?

6.用十六进制记数法表示下列的位模式。
a. 0110101011110010 b. 111010000101010100010111 c. 01001000
7.下面的十六进制数表示什么位模式?
a. 5FD97 b. 610A c. ABCD d. 0100
-------------------------------------------------------------
1原文为patterns of bits,若干二进制位的组合。一般写为bit pattern或bits pattern。——译者注
2一般称为数理逻辑(mathematical logic)。——译者注
3通常有x轴线、y轴线、读写线和禁止线等。——译者注
4 1埃=百亿分之一米。——译者注