初识CPU,一个程序在计算机中是如何运行的

初识CPU,一个程序在计算机中是如何运行的

初识CPU

我们知道,程序是保存在硬盘中的,如果想要运行程序,就要将他载入内存,而CPU也被设计为只能从内存中读取数据和指令。

对于CPU来说,内存只不过是个存放指令和数据的地方,并不能在内存中完成计算功能。如果我们要计算 a = b + c,必须将a、b、c都读取到CPU中才能进行加法运算。

CPU是个复杂的计算机部件,内部又包含了很多小零件,如图:
在这里插入图片描述

运算单元是CPU的大脑,负责加减乘除、比较、位移等运算工作,每种运算都有对应的电路支持,速度很快。

寄存器(Register)是CPU内部非常小、非常快速的硬件,他的存储容量有限,对于32位的CPU(这里不是指操作系统),每个寄存器一般能存储32位(4个字节)的数据;对于64位的CPU,每个寄存器一般能存储64位(8个字节)的数据。为了完成各种复杂的功能,现在CPU都内置了几十个甚至上百个的寄存器。嵌入式功能单一,寄存器数量较少。

我们经常听说的多少位的CPU,指的就是寄存器的位数。现在个人电脑用的CPU已经进入64位时代,如Intel的Core i3、i5、i7、i9等。

寄存器在程序过程中扮演的角色至关重要。他们可以用来完成数学运算、控制循环次数、控制程序的执行流程、标记CPU运行状态等。如,EIP(Extern Instruction Pointer)寄存器的值是下一条指令的地址,CPU执行完当前指令后,会根据EIP找到下一条指令,改变EIP的值,就会改变程序的执行流程;CR3寄存器保存着当前进程页目录的物理地址,切换进程就会改变CR3的值;ESP、EBP寄存器用来指向栈顶和栈底,函数调用会改变ESP、EBP的值。(这些都会在后面详细解释,这里只需大概了解)

我们看到在CPU内部还设置了缓存。虽然内存的读取速度已经很快了,但是和CPU比起来,还是有很大的差距的,不是一个数量级的,如果每次都从内存中读取数据,会严重拖慢CPU的运行速度,CPU会经常处于等待状态,无事可做。在CPU内部设置一个缓存,可以将使用频繁的数据暂时读取到缓存,需要同一个地址上的数据时,就不用再去访问内存,直接从缓存中读取就可以。

我们在购买CPU时,常常也会关心缓存的容量,如例如 Intel Core i7 3770K 的三级缓存为8MB,二级缓存为256KB,一级缓存为32KB。容量越大,CPU越强悍。

缓存的容量是有限的,CPU只能从缓存中读取部分数据,对于使用不是很频繁的数据,会绕过缓存,直接从内存中读取。所以不是每次都能从缓存中读取数据,这就是缓存的命中率,能从缓存中读取就命中,否则就没命中。关于缓存命中率,哪些数据该保存,哪些数据不保留,都有复杂的算法。

CPU指令

要想让CPU工作,必须借助特定的指令。例如,add用于加法运算,sub用于除法运算,cmp用于比较两个数的大小,这称为CPU的指令集。我们写的C语言代码等最终也会被编译成一条条的CPU指令。不同型号的CPU支持的指令集会有所差异,大部分是相同的。

我们以C语言中的加法为例来演示CPU指令的使用。假设有下面的C语言代码:

int a = 0X14, b = 0XAE, c;
c = a + b; 

在VS2010 Debug模式下生成的CPU指令为:

mov ptr[a],0X14
mov ptr[b],0XAE
mov eax, ptr[a]
add eax,ptr[b]
mov ptr[c],eax

mov和add都是CPU指令:

  • mov用来将一个数值移动到一个存储位置。这个数值可以是一个常数,也可以在内存或者寄存器上;这个存储位置可以是内存或者寄存器
    • 第一条指令中,ptr[a]表示变量a的地址, 0X14是一个数值,表示把0X14移到ptr[a]指向的内存,也就是给ptr[a]赋值。第二条指令类似
    • 第三条指令中,eax是寄存器的名字,该寄存器常用在加法运算中,用来保存某个加数或者运算结果。这个语句表示把变量a的值移动到寄存器eax中
    • 第五条指令表示把寄存器eax中的值移动到变量c中,此时eax中的值为a、b相加的和
  • add用来将两个数值相加,这两个数值可以在寄存器或者内存中。add会将相加的结果放在第一个数所在的位置。这条指令表示把eax和ptr[b]中的数值相加,并把结果放在eax中

总结来说:第一、二条语句给变量a、b赋值,第三、四条语句完成加法运算,第五条语句将运算的结果赋值给变量c。

实际上,上面的代码是汇编语言,不是CPU指令,汇编语言还要经过简单的转换才能成为CPU指令;为了能清楚的说明问题,这些语句未严格遵循汇编语法。

我们先大概了解了一下CPU的简单构造以及CPU指令,重点是先认识寄存器这个小部件,他在程序运行的过程中起着至关重要的作用,CPU就是用它来记录程序的运行状态,然后根据他的值来决定下一步操作。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JayerZhou

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值