为解决各种问题,人们发明了不计其数的机器。计算机种类繁多,从嵌入火星漫游机器人的计算机到为操纵核潜艇导航系统的计算机,不一而足。冯诺伊曼在年提出第一种计算模型,无论笔记本电脑还是电话,几乎所有计算机都遵循与这种模型相同的工作原理。那么你们了解计算机是如何工作的吗?本文将讨论这些内容:
◎理解计算机体系结构的基础知识
◎选择编译器将代码转换为计算机可以执行的指令
◎根据存储器层次结构提高数据的存储速度
毕竟,在非程序员看来,编程要像魔法一样神奇,我们程序员不会这么看。
体系结构
计算机是一种根据指令操作数据的机器,主要由处理器与存储器两部分组成。存储器又称RAM(随机存取存储器),用于存储指令以及需要操作的数据。处理器又称CPU(中央处理器),它从存储器获取指令与数据,并执行相应的计算。接下来,我们将讨论这两部分的工作原理。
存储器
存储器被划分为许多单元,每个单元存储少量数据,通过一个数字地址加以标识。在存储器中读取或写入数据时,每次对一个单元进行操作。
为读写特定的存储单元,必须找到该单元的数字地址。
由于存储器是一种电气元件,单元地址作为二进制数通过信号线传输。
二进制数以2为基数表示,其工作原理如下:
每条信号线传输一个比特,以高电压表示信号“1”,低电压表示信号“0”,如图7-1所示。
对于某个给定的单元地址,存储器可以进行两种操作:获取其值或存储新值,如图7-2所示。存储器包括一条用于设置操作模式的特殊信号线。
每个存储单元通常存储一个8位二进制数,它称为字节。设置为“读”模式时,存储器检索保存在单元中的字节,并通过8条数据传输线输出,如图7-3所示。
设置为“写”模式时,存储器从数据传输线获取一个字节,并将其写入相应的单元,如图7-4所示。
传输相同数据的一组信号线称为总线。用于传输地址的8条信号线构成地址总线,用于在存储单元之间传输数据的另外8条信号线构成数据总线。地址总线是单向的(仅用于接收数据),而数据总线是双向的(用于发送和接收数据)。
在所有计算机中,CPU与RAM无时无刻不在交换数据:CPU不断从RAM获取指令与数据,偶尔也会将输出与部分计算存储在RAM中,如图7-5所示。
CPU
CPU包括若干称为寄存器的内部存储单元,它能对存储在这些寄存器中的数字执行简单的数算,也能在RAM与寄存器之间传输数据。可以指示CPU执行以下典型的操作:
◎将数据从存储位置复制到寄存器3;
◎将寄存器3与寄存器1中的数字相加。
CPU可以执行的所有操作的称为指令集,指令集中的每项操作被分配一个数字。计算机代码本质上是表示CPU操作的数字序列,这些操作以数字的形式存储在RAM中。输入/输出数据、部分计算以及计算机代码都存储在RAM中。
通过在RAM中包含重写部分代码的指令,代码甚至可以对自身修改,这是计算机病毒逃避反病毒软件检测的惯用手法。与之类似,生物病毒通过改变自身的DNA以躲避宿主免疫系统的打击。
图7-6取自Intel操作手册,显示了部分CPU指令映射为数字的方法。随着制造工艺的发展,CPU支持的操作越来越多。现代CPU的指令集极为庞大,但最重要的指令在几十年前就已存在。
CPU的运行永无休止,它不断从存储器获取并执行指令。这个周期的核心是PC寄存器,PC(programcounter)是“程序计数器”的简称。PC是一种特殊的寄存器,用于保存下一条待执行指令的存储地址。CPU的工作流程如下:
(1)从PC指定的存储地址获取指令;
(2)PC自增;
(3)执行指令;
(4)返回步骤1。
PC在CPU上电时复位为默认值,它是计算机中第一条待执行指令的地址。这条指令通常是一种不可变的内置程序,用于加载计算机的基本功能。
在许多个人计算机中,这种程序称为BIOS(基本输入输出系统)。
CPU上电后将继续执行这种“获取-执行”周期直至关机。然而,如果CPU只能遵循有序、顺序的操作列表,那么它与一个花哨的计算器并无二致。CPU的神奇之处在于可以指示它向PC中写入新值,从而实现执行过程的分支,或“跳转”到存储器的其他位置。这种分支可以是有条件的。以下面这条CPU指令为例:“如果寄存器1等于0,将PC设置为地址”。该指令相当于:
ifx=0