文章目录
CPU是什么?
0、热身问题
- 程序是什么?
指示计算机每一步动作的一组指令。 - 程序由什么组成?
指令和数据。 - 什么是机器语言?
CPU可以直接识别并使用的语言。 - 正在运行的程序存储在什么位置?
内存。 - 什么是内存地址?
内存中,用来表示指令和数据存储位置的数值(类比“门牌号”)。 - 计算机的构成元件中,负责程序的解释和运行的是哪个?
CPU。
之前只知道CPU是中央处理器(Central Processing Unit),相当于计算机的大脑,它的内部由数百万至数百亿个晶体管构成,但其实了解这些还是远远不够的。
1、CPU的内部结构解析
CPU的功能:解释和运行机器语言的程序内容。
CPU的组成:
- 寄存器:负责暂存指令、数据等处理对象;
- 控制器:负责把内存上的指令、数据读入寄存器,并根据指令的执行结果来控制整个计算机;
- 运算器:负责运算从内存读入寄存器的数据;
- 时钟:负责发出CPU开始计时的时钟信号。
各部分之间由电流信号相互流通。
接着简单说一下内存(后面又章节会提到)。
内存指的是计算机的主存储器(mian memory),简称主存。主存通过控制芯片等CPU相连,主要负责存储指令和数据。CPU可以通过地址编号读取主存中的指令和数据。
程序的运行机制:程序启动后,根据时钟信号,控制器会从主存中读取指令和数据到寄存器中,进而对这些指令和数据加以解释和运行,运算器对数据进行运算,控制器再根据结果来控制计算机。
2、CPU是寄存器的集合体
CPU的四个构成部分中,我认为寄存器是最重要的,因为程序是把寄存器作为对象来描述的。
不同的CPU内部的寄存器的数量、种类以及寄存器存储的数值范围都是不同的。
根据寄存器的种类,大致分为八类,如下表所示。
寄存器 | 功能 |
---|---|
累计寄存器(accumulator register) | 存储执行运算的数据和运算后的数据 |
标志寄存器(flag register) | 存储运算处理后的CPU状态 |
程序计数器(program register) | 存储下一条指令所在内存的地址 |
基址寄存器(base register) | 存储数据内存的起始地址 |
变址寄存器(index register) | 存储基址寄存器的相对地址 |
通用寄存器(general register) | 存储任意数据 |
指令寄存器(instruction register) | 存储指令 (CPU内部使用,程序员无法操作) |
栈寄存器(stack register) | 存储栈区域的起始地址 |
对于程序员来说,CPU就是具有各种功能的寄存器的“集合体”。
一般而言,程序计数器、标志寄存器、累加寄存器、指令寄存器和栈寄存器只有一个。而基址寄存器、变址寄存器、通用寄存器一般不止一个。
后面会经常提及这些寄存器,所以每个寄存器的大致功能要记住,才不会看得一头雾水。
3、决定程序流程的程序计数器
以“123和456这两个数值相加,并将结果输出到显示器上”这个例子来展示程序执行的流程。
备注:一般数据和指令都是存储在多个地址上的,即一个数据或者一个指令可能会占据多个字节,但是本例为便于说明,把数据和指令分配到一个地址上。
地址0100是程序运行的开始位置,当操作系统把程序加载到内存后,会将程序计数器设定为“0100”。
CPU的控制器会参照程序计数器的值从内存中读取相应指令并执行,每执行完一个指令,程序计数器的值加1,即“0101”。
注:若指令占据多个内存地址时,程序计数器的值则加上加上相应的数值。
4、条件分支和循环机制
程序流程分为:
- 顺序执行:按照地址内容的顺序执行指令。
- 条件分支:根据条件执行任意地址的指令。
- 循环分支:重复执行同一地址的指令。
顺序执行,霉执行一个指令,程序计数器的值就加1(若指令占多个内存地址时,则加上相应的数值)。
条件分支和循环分支,机器语言的指令就可以将程序计数器的值设为任意地址。
以“输出123的绝对值到显示器”的程序为例。
当执行到地址为“0102”的指令时,此时累加寄存器的值大于0,则跳转执行地址为“0104”的指令,这就是条件分支。
5、函数的调用机制
函数调用机制:通过把程序计数器的值设定成函数的存储地址来实现的。
在编译高级变成语言的程序后,函数调用的处理会转换成机器语言的“call”指令,函数结束的处理会转成机器语言的“return”指令。
call指令:在程序计数器的值被设定为函数的入口地址前,call指令会把函数执行结束后要执行的指令地址存储到栈的主存内。
return指令:函数执行完毕后,通过函数出口执行return指令,把保存在栈中的指令的内存地址设定到程序计数器。
下面以“调用MyFunc函数”的C语言程序片段举例。
6、通过地址和索引实现数组
再次回顾一下基址寄存器和变址寄存器的功能。
基址寄存器(base register):存储数据内存的起始地址。
变址寄存器(index register) :存储基址寄存器的相对地址。
假设计算机内存上划分着“0x 0000 0000 ~ 0x FFFF FFFF”这些内存地址,我们可以使用一个32位的寄存器来查看我们需要的内存地址。
但是,假设我们要查看“0x 1000 0000 ~ 0x 1000 FFFF”的地址时,我们也可以使用两个寄存器来操作,这样就更方便。
7、CPU的处理其实很简单
虽然高级编程语言编写的程序看起来很复杂,但是CPU实际处理的事情很简单。CPU能执行的机器语言指令很少,只是通过不断的重复执行某个运算而已。
类型 | 功能 |
---|---|
数据传送指令 | 寄存器和内存、内存和内存、寄存器和外围设备之间的数据读写操作 |
运算指令 | 用累加寄存器执行算术运算、逻辑运算、比较运算、移位运算 |
跳转指令 | 实现条件分支、循环、强制跳转等 |
call / return 指令 | 函数的调用 / 返回调用前的地址 |
8、补充:比特和字节
8.1、比特
比特bit是二进制位(Binary digit)的简称,一个二进制包含的信息量成为一比特bit。
比特(bit)是计算机内部数据存储的最小单位。
二进制在效率和成本方面的优势为全世界所接受,现在电脑所有的信息都是二进制的,就是0和1组成的。
8.2、字节
字节Byte是计算机数据处理的最小单位。
习惯上用大写的“B”表示,每个字节有8个二进制位,其中最右边的一位为最低位,最左边的一位为最高位,每个二进制位的值不是0就是1。
一个字节由8个二进制位组成,即“1 Byte = 8 bit”,这也是计算机设计时规定的。
相关换算:
1 Byte = 8 bit
1 KB = 1024 Byte = 1024 * 1 Byte = 1024 * 8 bit = 8 Kb
注意:K是1024,即2^10,并不是1000。
1 MB = 1024 KB
1 GB = 1024 MB
1 TB = 1024 GB
8.3、字
字和字节都是计算机的存储单元。
字由若干个字节组成,一个字节是8个比特bit。
字的位数叫做字长,即cpu一次处理二进制代码的位数。
字长与计算架构有关,比如32位机,一个字就是32位,换算成字节就是4字节;同样的64位机,一个字就是64位,也就是8字节。字也是计算机一次处理数据的最大单位。
字 与 字节的换算:
32位计算机:1字 = 32位 = 4字节
64位计算机:1字 = 64位 = 8字节
8.4、32位机和64位机
我们的电脑是32位还是64位主要是受到电脑cpu、主板硬件决定的,32位的cpu一次处理32位数据,64位的就处理64位数据。
简单理解就是64位在性能上远远强于32位。
比如32位操作系统最大支持4G内存,如果电脑内存小于4G的话,是不能安装64位操作系统的。
那为什么是4G呢?
这个在后面讲“内存”时我们会说,现在先简单地提一下。
首先呢,4G指的是4GB。32位指的是CPU的32位地址线,可以访问2^32个不同的地址单元。一个地址单元是1Byte。
2^32 * 1 B
= 2^2 * 2^10 * 2^10 * 2^10 B
= 4 * 1024 * 1024 * 1024 B
= 4 * 1024 MB
= 4 GB
注:如有错误,敬请指正。