功能依赖于结构,结构决定了功能。
CPU的全称是Central Processing Unit,直译是中央处理单元,我们一般叫它中央处理器。作为主机中最贵的元器件(不考虑显卡氪金族),它承担了几乎全部的计算工作,毕竟“能力越大,责任越大”。
那么CPU的超能力到底体现在哪里呢?答:它巨快,“天下武功,唯快不破”。目前民用主机CPU的最高主频大约是5GHz,也就是说它能在1秒钟里振动5 000 000 000次。我们在路上见到的汽车轮胎,转速一般为5转每秒(不严谨地说,1Hz=1转每秒);电风扇的转速一般为10转每秒;显示器刷新的频率一般是60Hz,而这频率足以让人眼看不出闪烁。这个数量级差别,不多说了,自行体会。
当然,如果CPU只是在空转,做无意义的振动,那也不值得我们对它肃然起敬,实际情况是它的振动是有信息输出的。这输出的信息就有两类:数据信息和控制信息。这两类信息对应了CPU的两大功能:计算和控制。
计算
要不是为了应付大量复杂计算,计算机恐怕不会出现在这世上。
显然,计算是CPU的重要使命。但是它无法进行高层次计算(比如“快,直接告诉我233后面第一个质数是多少”),只能进行简单计算。即便如此,它已然能够解决极其复杂的问题。事实上,对CPU来说,它的计算其实只是通过电路完成“一串二进制数输入”在特定运算规则下的“一串二进制数输出”而已,换言之,就是在电路上实现一系列信息转换,完成输入到输出的映射。
CPU并非铁板一块,内部精细的构造使得它能够完成复杂的计算任务。其中,完成运算的主要部分被称为运算器,包括算术逻辑部件(ALU)、状态字寄存器(PSW)等等。我画了一张图:
CPU的内部结构(图示)为了更好地理解CPU的计算过程,我想先请你做道算术题——“198+231=?”。你可以列竖式,但是打草稿算完之后请再口算一遍。
如果没算错的话,答案应该是429。不过正确性不重要,关键是计算的过程。回想一下,一般来说,你计算的时候,是从低到高一位一位加的;在十位进行相加的时候,你会“额外标记一下”这里有个到百位的进位;然后在百位进行相加的时候,你会提醒自己把进位给加上。
这里,请注意,尽管整个计算仅仅实现了从“198、231”这两个输入到“429”的输出,但是在整个计算过程中有先后顺序之分,还有很多其他信息产生,这些临时信息也需要保存。既然如此,CPU内部有上面那些个计算部件也就不难理解了。
控制
2509885——“爱我你就抱抱我”。“好的!你这么说,我就这么做。”
CPU承担着主机几乎所有的控制工作,因为不严谨地说,它是那堆零件中唯一有脑子的。为什么那些零件需要控制,它们不会自己工作吗?当然不会,想象生活中的这两种情况:你刷牙的时候得用牙膏,牙膏会自动打开盖子喷出适量牙膏吗?不会,需要你亲手驱动,对它进行控制;你拥有一家图书馆,里面配备了管理员,有一天你想看《钢铁是怎样炼成的》,如果你不声不响,管理员会把书送到你手上吗?不会,你至少得告诉他你要啥,然后他才去取,这也是控制。
我们可以从以上例子中很明显地看到,主体若要有效使用客体,必须与客体之间产生信息交流,其中控制信息不可或缺。(这看上去是一句废话,但很多人在学习计算机的原理时会忽略)。
回到前面的例子,一个完整的计算过程实际上是:使用电脑的人把“198+231”这个加法程序编写好,通过一系列编译链接过程加载进内存。然后CPU从内存中读出这条指令{一串二进制数},根据指令中的操作码生成具有先后顺序的控制信息,从而保证相关数据能进行有效地流动。控制信息的典型例子包括使能信号、读写信号等等。
也就是说,CPU的初始输入是有限长度的一条条指令,它看到指令就会明白自己该做什么。那么问题来了,谁告诉它的呢?它怎么知道看到“2509885”就要抱抱我呢?答案当然是:设计CPU的人在它里面放了本字典,每条指令的操作码都对应一系列特定的操作步骤。有些设计者是这么写的:“2509885——爱我你就抱抱我”“2509775——爱我你就亲亲我”。一条指令对应一套步骤,尽管两条指令有部分相似,但它们仍然是被看待成完全不同的两个系列操作,这就是硬布线方式。有些设计者是这么写的:“2509885——2509后面是885,那爱了之后就抱抱我”“2019885——2509后面是775,那爱了之后就亲亲我”。一条指令对应一段微程序,即一系列步骤,每个步骤叫一个微操作,会发出一轮控制信号(也叫微命令)。比如再看加法的例子,它把“向前进一”视为一个可以直接完成而不需要临时信息的微操作,这就是微指令方式。
番外
CPU再牛逼,还不是得为人类服务。
是的,CPU只是人类的工具,而人对CPU的操作并非直接通过双手不停地拨弄节拍发生器,而是通过“操作系统”。顾名思义,操作系统,就是替人操作计算机元器件的系统,其本质就是一段段程序。与普通程序不同的是,操作系统具有对CPU的完全控制权。那么问题来了,同为一段段程序,操作系统为什么能控制CPU而普通程序不用呢?我们先明确一下控制的含义,控制的意思是不仅有使用权,还有所有权,能把决定把CPU分配给谁。接下来回答“为什么操作系统能控制CPU而普通程序不能?”
首先要知道的一点是,自己能够标志自己是核心态还是用户态,在用户态只能执行非特权指令。
于是,操作系统能够控制CPU的原因有三:
1.操作系统是最先加载进内存的程序(这个时候CPU处于核心态),因此操作系统可以率先掌握CPU的控制权,同时它还告诉了CPU:“如果执行指令遇到异常时,就来执行我的程序哦!”;
2.当CPU运行其他程序时,如果发生内中断就会转去执行系统程序同时主动切换为核心态。具体说来,如果遇到系统调用,就会执行软中断,转去执行系统程序;如果遇到其他异常(比如除0、缺页),CPU就按照操作系统最初吩咐的,转去执行系统程序;
3.指令周期中安排了中断周期,在中断周期,CPU会默认去执行系统程序,同时切换为核心态。
当CPU执行系统程序的时候,系统程序能够运行内存区上的所有程序,包括那些与硬件驱动相关的程序。同时,系统程序也能执行那些特权指令,比如清内存、设置时钟、切换进程。特权指令的执行权就是操作系统控制CPU的标志。
另外还有一个深刻的哲学问题值得思考——CPU是执行程序的,但程序竟会反过来控制CPU。异化理论的又一生动写照。
结语
总的来说,CPU承担了计算机的主要计算和控制任务,它的行为以设计者设计的物理结构为基础,由指令和节拍决定。指令包括特权指令和非特权指令,特权指令涉及其他硬件和CPU的使用权。操作系统的出现是为了让人机交互更加友好和高效,它具有执行特权指令的能力,同时负责管理计算机的各种资源分配,普通程序必须通过它才能使用外设。
CPU真是跟简单数字打交道的不简单的玩意儿。
网友评论