CPU到底是如何工作呢?

作者: 何朱必 分类: 信息技术, 更新… 发布时间: 2020-12-26 18:33 ė views 6 没有评论

CPU是什么?

CPU是Central Processing Unit的缩写,中文名全称为中央处理器。CPU的组成包括了运算逻辑、寄存器和控制部件,它可以解释指令和进行数据运算处理。因为CPU本身就是超大规模的数字电路,只认识“0”和“1”,所以所有的指令和数据都需要由“0”和“1”组成。而由“1”和“0”组成的数字串对于我们人类来说“读懂”它的含义也会感觉到一脸的茫然。鉴于这种在人脑和电脑CPU两者无法直接“交流”的情况下,人类又一次发挥了他极具创造性的想法发明了编译器。编译器的出现搭起了人类大脑和电脑CPU的沟通的桥梁与纽带。

CPU为什么可以运行我们的程序呢?

上面说到CPU只认识“0”和“1”,那它为什么可以运行我们的程序呢?CPU的确不可以直接运行我们编写的程序。但如果直接只用“0”和“1”的组合来写程序,那是相当的烦所,也难以找到错误,是非常不现实的。聪明的人类为了解决这个大麻烦,就发明了汇编语言,用一些容易理解和记忆的字符来代替“0”和“1”组成的指令。

例如:

  • ADD:表示逻辑加减
  • MOV:代表数据传递
  • JMP:代表跳转

当然还是需要通过汇编器把这些用汇编语言编写的程序翻译为“0”和“1”组成的十六进制机器码。

随着计算机技术的发展,写的程序也越来越复杂了,发现用汇编语言编写程序的效率也相当低,然后聪明的人类又发明了我们现在用的各种高级语言,比如C,C++,PHP,Python等等,当然这些由高级语言编写的程序就需要通过编译器”翻译”为CPU能够识别的十六进制机器码。

汇编器或者编译器可以理解代码与CPU沟统的“桥梁”了,通过它进行“翻译”,CPU就可以认识代码了。

下面详细说说CPU的这一工作原理

由于CPU是一个极为庞大的集成电路,为了说明问题我们用其中一个极为简单的数字处理电路为例来说明CPU是如何“认识”我们人类编写的代码的。我们知道CPU中包含着数量众多的绝缘栅晶体管(MOSFET),在这些众多的绝缘栅晶体管(MOSFET)中分为两类,一类是P沟道的绝缘栅晶体管、另一类是N沟道的绝缘栅晶体管。

对于P沟道的绝缘栅晶体管来说,当给它的输入端加一个“1”时(高电平)时该管子就会处于“关闭”状态,当给它的输入端加一个“0”时(低电平)时该管子就会处于“打开”状态。

对于N沟道的绝缘栅晶体管来说,当给它的输入端加一个“0”时(低电平)时该管子就会处于“关闭”状态,当给它的输入端加一个“1”时(高电平)时该管子就会处于“打开”状态。因此根据这些MOS管的特点在任何一种输入条件下PMOS和NMOS都不会处于打开的状态。因此在CPU中就有用这些MOS管组成的与非门电路和或非门电路。因此就可以执行逻辑运算,所以说逻辑运算也是CPU的功能之一。

那么下一个问题是我们使用计算机语言编写的程序,比如常用的C语言或者汇编语言等等都有逻辑表达式或者逻辑指令,编写好一个逻辑运算的程序后要通过刚才讲的编译器对源程序进行编译生成CPU能够识别的“语言”(二进制代码)。又由于这个机器语言(二进制代码)与我们编写的逻辑运算程序是一一对应的,因此只要把这段代码“灌进”CPU的内部他就会按照我们人类的要求运作起来了,从而也就能够“认识”我们人类所写的代码了。

通过以上的简单实例给朋友们再现了CPU是怎么认识代码的过程的,我们通过“管中窥豹,时见一斑”的方法希望能给有疑惑的朋友提供一个参考答案,如有阐述不周之处希望朋友们批评指正。

 

其实,CPU也不知道我们敲得代码是什么意思。想要让一段代码编程可执行的程序,需要进行一系列的操作。

关于CPU识别程序的问题,细讲起来是比较麻烦的一件事情,我们来分步骤逐一解释。

1.CPU的基本工作原理——数字电路

在具体将这个问题之前,我们先来了解一下半导体的特性。

顾名思义,半导体就是一种介于导体和绝缘体中间的物质,它具有以下特性。

比如上图,如果电流是从A端流向C端,则电路通畅;反过来的话就不行了。大家可以把它理解一种单方向控制电流的设备。

电流只有两种情况:开路和闭路,将开路规定为0,闭路规定为1,这也就是我们所熟知的二进制。

根据这种特性,设计者们开发出了“与”,“或”,“非”,“异或”四种情况:

  • 与门:只有同时具备条件A和条件B时,才能得出结果1,当其中任意一个条件为0时,结果为0。

1+1=1; 1+0=0; 0+1=0; 0+0=0

  • 或门:只有条件A或条件B都为0时,才能得出结果0;当其中任意条件为1时,结果为1;

1+1=1; 1+0=1; 0+1=1; 0+0=0

  • 非门:就是相反的意思,条件A的反为B,条件B的反为A;

输入x 输出y

0 1

1 0

  • 异或门:当两个条件取值相异(0和1)时,结果为1;反之为0

1⊕1=0;

1⊕0=1;

0⊕0=0;

根据这几种门电路,还衍生出了一些电路,比如与非门,或非门等等。但基本的电路状还是不会变的。这些门电路构成了CPU的基本工作原理——数字电路。

无论是数据的计算,还是指令的调度,CPU都是要通过运算来实现的。门电路的目的就是为了通过控制电流的状态,来实现计算的原理。当然了CPU上的电路是非常复杂的,如何将由门电路构造成的加法器,乘法器之类集成到一块指甲盖大小的电路板上绝非易事,这也是为什么芯片技术被称为最难突破的尖端技术的主要原因之一。

在简单了解CPU的工作原理后,就是关于高级语言和机器语言的转换问题了

机械语言和高级语言

早期的计算机编程是一件非常痛苦的事情,只要涉及到需要位移量的运算时,例如乘法运算,就要做大量的插线工作。也许一个几分钟就能算完的程式,插拔线路就得花上半个小时,还不能插错,否则就白忙活了。所以当时做这些工作的都是一些靓丽的摩登女郎,穿着漂亮的制服以缓解工作人员的压力……

随着计算量不断地增大,这种插拔的方式已经满足不了实际需求。,人们开始考虑:能不能设计一种语言来更高效的设计程序呢?由此,高级语言诞生了。

高级语言:一种接近于人类自然语言的表达方式,通过一些较为直观的单词,符号来表示低级语言。从而使编程变得明了易学,可读性强。

同时,高级语言分为面向过程和面向对象两类。前者在同一个功能每实现一次,都得重新编写一次代码,所以代码的重复利用率比较差;后者面向由于引入了类的概念,只要只要编写一次代码,后面便可以通过调用类的方式多次使用,大大提升了效率。所以java能成为最受欢迎的编程语言不是没有道理的。

机器语言:计算机最原始的语言,全部由0和1构成的数字串构成,也是cpu唯一可以识别的语言。

另外,还有一种汇编语言,很多人存在一个误区,觉得汇编语言就是机器语言,其实不然,CPU还是不知道汇编语言是个什么东西。汇编语言本质上还是一种计算机低级语言,通过汇编语言我们可以了解CPU 到底干了些什么,以及代码的运行步骤。

如何将高级语言转换成计算机可以识别的机器语言呢?这时候就需要编译器的发挥作用了:

简而言之,编译器就像是一个中转平台,就是将程序员使用的高级语言翻译为计算机可以识别运行的机器语言。其主要工作流程可以具象为:源代码 (source code) → 预处理器 (preprocessor) → 编译器 (compiler) → 目标代码 (object code) → 链接器(Linker) → 可执行程序 (executables),也就是我们最终使用的后缀名为.exe这样的程序。

最后说个题外话,编译器对于程序的所起的影响可谓举足轻重,甚至可能影响到CPU的执行效率。所以现在厂家除了绞尽脑汁的提升CPU性能外,也将目光投向了编译器,编译器极有可能在未来成为新的热门导向。

本文出自何朱必博客,转载时请注明出处及相应链接。

本文永久链接: http://www.hezhubi.com/cpu.htm

发表评论

您的电子邮箱地址不会被公开。

Ɣ回顶部