写代码吃cpu还是显卡,写代码用什么cpu

CPU对我们来说既熟悉又陌生,熟悉的是我们知道代码是被CPU执行的,当我们的线上服务出现问题时可能首先会查看CPU负载情况。陌生的是我们并不知道CPU是如何执行代码的,它对我们的代码做了什么。本文意在简单解释我们代码的生命周期,以及代码是如何在CPU上跑起来的。

CPU对我们来说既熟悉又陌生。熟悉的是我们知道代码是由CPU执行的。当我们的在线服务出现问题时,我们可能会首先检查CPU负载。奇怪的是,我们不知道中央处理器是如何执行代码的,以及它对我们的代码有什么影响。本文旨在简要解释我们代码的生命周期以及代码如何在CPU上运行。

简单!代码原来是这样被CPU跑起来的

00-1010一个漂亮的控件c加上一个漂亮的控件v,pa ~,我们愉快地写下了代码,而当代码保存下来后,它就会存储在我们磁盘的某个地方。它可能是用java或python这样的高级语言编写的,也可能是用C这样的古老语言编写的,但现在已经不能运行了,因为计算机不知道它们,而只知道二进制系统,简称0和1。如果你这样想,我只能呵呵了,请帮我翻译一下下面的机器码:

01010100101001001001001100100100100100010001001001001 Copy code显然,作为高质量的人类,我们无法识别这段代码写的是什么,于是出现了像java这样的高级语言,它给机器代码披上一层外衣,然后交给伟大的程序员去创造未来。

所以反过来,我们的代码需要用机器码来代替,这样才能被计算机识别,计算机才能帮助我们。这个转换过程通常被称为编译.

# include studio . hint main(){ printf(' Hello World \ n ');返回0;}复制代码这是每个程序员都应该写的一段代码(hello.c)。在Linux下,当我们使用GCC编译Hello World程序时,我们只需要最简单的命令:

Gcc hello.c./hello# Hello World复制代码看似很简单的一行,其实编译过程非常复杂,并不是我们想象中的编译。事实上,它分为四个步骤,即预压、编译、组装和链接。

简单!代码原来是这样被CPU跑起来的

预编译:这个过程主要处理源代码中以“#”开头的预编译指令,如“#include”、“define”等。编译:这个过程是对预处理文件进行词法分析、语法分析、语义分析和优化后产生相应的汇编代码,是最复杂的。汇编:这个过程就是把汇编代码转换成机器码,也就是上图中的对象文件hello.o链接:我们的代码程序往往是由多个代码文件组成的。当每个文件被组装成一个”。“阿档,组装他们需要一个机制在一起。这个过程叫做链接。好吧,原来的编译是这样的。通过这整个编译操作,我们的代码终于可以执行了。我们只是跑。/hello.out输出Hello World。等等,这个简单的过程怎么了?

编译-让计算机认识我

ok,ok,编译后,我们的程序终于可以执行了。接下来我们从CPU的角度来看看Hello World是如何打印的。

首先,编译文件存在于磁盘上,必须先加载到内存中。在这里,你可能会问:为什么CPU不能直接读取磁盘,程序通过内存运行?答案是慢,慢的磁盘会影响我们程序执行的速度,所以我们需要更快更接近CPU的存储,也就是内存。

简单!代码原来是这样被CPU跑起来的

内存是一大块存储器。

空间,可以存储很多数据信息,那么如何找到我们要写的程序呢?答案是地址,其实每个字节在内存中都有一个地址,这样当CPU去内存中读我们的程序时,只需要根据对应的地址就可以知道我们程序的具体内容。

简单!代码原来是这样被CPU跑起来的

等等...,这里似乎又有个问题,CPU是如何与我们的内存、磁盘通信的?应该有个媒介之类的吧。没错,这个媒介就是主板上的总线芯片组,总线好理解,就像高速公路,数据信息可以通过这条高速公路传递到CPU中,这个芯片组是个什么玩意?电脑主板上芯片很多,这里说的主要是南桥芯片和北桥芯片。先来个解释:

  1. 北桥芯片:北桥负责高速设备和CPU之间的沟通,主要就是CPU和内存、显卡之间的通信,但是随着技术的迭代,主板上的北桥芯片已经被内置到了CPU里了。
  2. 南桥芯片:南桥负责低速设备和北桥之间的通信,主要负责I/O总线之间的通信,如USB、LAN、ATA、SATA、音频控制器、键盘控制器、实时时钟控制器、高级电源管理等。

嗯... 为什么CPU与高速设备、低速设备之间的通信需要这两个芯片?CPU自己不能干吗?这里还是类似拆分任务的功能,如果把所有的任务都交给CPU来处理,CPU会太忙了,还有比较重要的一点,如果南桥芯片坏了,那么我们可以直接更换南桥,而不用换掉整个CPU。

简单!代码原来是这样被CPU跑起来的

终于CPU通过总线和芯片打通了磁盘、内存之间的通信了,接下来的一切开始交给CPU。

CPU-最强大脑

CPU全称是Central Processing Unit,即中央处理单元,它的本质就是一块超大规模的集成电路。从逻辑上来分,它的内部是由寄存器、控制器、运算器和时钟组成的,下面来解释下各个组成是干什么的。

  • 寄存器:CPU内部其实有很多类型的寄存器,我们只需了解寄存器就是暂存数据、指令等信息的,它的本质是临时存储,由于是直接集成在CPU内部,所以读写它们的速度很快,一般一个CPU内部会有20-100个寄存器,这里给大家列举下常用寄存器与其功能。 累加寄存器:存储执行运算的数据和运算后的数据 标志寄存器:存储运算处理后的CPU的状态 程序计数器:存储下一条指令所在内存的地址 基址寄存器:存储数据内存的起始地址 变址寄存器:存储基址寄存器的相对地址 通用寄存器:存储任意数据 指令寄存器:存储指令,CPU内部使用,程序员无法通过程序对该寄存器进行读写操作 栈寄存器:存储栈区域的起始地址
  • 控制器:控制器负责把数据读出或者写入寄存器,并根据指令的结果来控制计算机。
  • 运算器:从名字就可以猜出来,运算器的主要工作就是运算,运算从内存读入寄存器的值
  • 时钟:它并不是我们见的钟表概念,它代表了你的CPU的工作频率,频率越高说明你的CPU处理的速度越快,但是越快就会带来另一个问题:散热。

简单!代码原来是这样被CPU跑起来的

综上所述,CPU的大致工作流程如下:在时钟信号到来的时候,就开始工作,通过控制器把内存的数据读到各个寄存器中,然后如果有计算相关的逻辑,就交给运算器。发现没有,CPU的工作其实挺简单的,本质就是不停的读指令、执行指令。但是CPU是如何读到我们的代码指令的,以及我们的代码里面的if else、函数调用都是如何执行分支判断、函数跳转的,我们来看个例子:

a = 1 #0x0010b = 2 #0x0011if a > b { #0x0012	printf("%s","a") #0x0013} else { 	add(a,b) #0x0014} printf("%s","end") #0x0017func add(int a,int b) { #0x0020  return a+b}复制代码

这是段非常简单的伪代码,有分支判断、有函数跳转。我们来从CPU的角度看看它是如何执行的:

简单!代码原来是这样被CPU跑起来的

  1. 首先每段程序都有个开始的地址0x0010,也就是CPU读取程序的入口
  2. 把a=1这个数字读入通用寄存器中,程序计数器(PC寄存器)自动加1,即指向下一条指令 0x0011
  3. 指令寄存器拿到程序计数器的指令地址,把b=2这个数字读入通用寄存器中,程序计数器(PC寄存器)自动加1,即指向下一条指令0x0012
  4. 指令寄存器发现此处是比较逻辑,会执行a-b,此时可能会有三个结果分别是大于0,等于0,小于0,然后把这个结果存到标志寄存器里,这里有个小知识,我们经常说的是CPU是64位或者32位,其实也表示了标志寄存器的长度

简单!代码原来是这样被CPU跑起来的

  1. 很明显,a是小于b的,CPU根据标志寄存器的状态值应该跳转到else里面,注意这时程序计数器的值不是加1,而是设置成else的地址 0x0014,当执行到0x0015的时候,需要发生函数跳转,程序计数器会被设置成 0x0020,但是这里并不是简单的函数跳转(专业术语叫做call),因为在函数执行完毕之后,还要返回,也就是程序计数器需要从0x0020再变成0x0017。call执行的时候会把后续要执行的指令地址0x0017存到中。
  2. 当我们的add函数执行完毕之后,会有个return,return的时候会把上一步骤存入栈中的地址0x0017写入程序计数器中
  3. 指令寄存器根据程序计数器当前的地址执行最后的打印(end),结束。

顺序执行的指令代码,程序计数器会自动累加(当然不一定累加的是1),然后找到下一条要执行的指令。

分支判断的时候,程序计数器不是简单的累加地址,需要地址的跳转。

函数调用不仅仅需要跳转地址,还要把函数执行完毕之后要执行的地址存下来,方便折回继续执行。

其实还有个循环执行,也就是我们代码中的for、while之类的,这时程序计数器会不停的在某些地址之间来回切换。

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/53591.html

(0)

相关推荐

  • 冷水浇花可以吗,浇一盆冷水

    近期美联储暂缓加息,中国央行则删除了“坚决不搞大水漫灌”等字眼,以上种种反映了全球前两大经济体对通胀和经济下行的共同担忧,而世界其他很多经济体实际已经进入了严酷的滞胀。养殖从业者务必高度重视经济大环境变化,否则明年养殖业将迎来一波破产高潮,蛋先生绝非危言耸听!

    生活 2021年11月24日
  • 好口福电话,有口福的人

    现在的农村,很多地方的生活都比城市好,休闲,没有压力。农活少了,渐渐的村里胖人多了,孩子也越来越高。城市的一些东西基本上都在农村。然而,农村的观念仍然跟不上城市,个人医疗保健意识很...

    生活 2021年10月27日
  • 适应性思维,什么叫适应度

    适应这个词我们听的很多,比如最开始从幼儿园,我们就要学会适应,适应什么呢?适应幼儿园的作息,还有其中的老师和同伴。

    生活 2021年12月9日
  • 悬着心终于放下了

    从上月唐筛18-三体综合征高风险,一直忐忑不安,昨天发信息让拿结果,今天拿无创DNA结果,全是低风险,安心养胎,等着做四维,希望宝宝检查一切顺利[呲牙]#关于产检大家有没有要吐槽的#

    生活 2021年9月28日
  • 从怀孕到生产的个人经历

    虽然儿子都已经8岁了,但是回想起来感觉还是历历在目。在这里给大家分享一下我从怀孕到生产的经历。

    生活 2021年9月28日
  • 早餐不要喝牛奶。10分钟内做好一锅。钙比牛奶好,营养比粥好。宝贝喜欢。

    为了提前为孩子预防缺钙引起的各种疾病,大多数宝妈都会在辅食阶段给宝宝添加富含钙的食物补充剂。比如奶制品、虾皮、蛋、豆制品等,都对孩子的骨骼健康生长有很大的帮助.虾皮富含矿物质、钙等...

    生活 2021年12月18日