首页 今日头条正文

芝加哥,高档程序员的涵养,不得不知的硬核常识——CPU,惬意的意思

咱们都是程序员,咱们都是和核算机打交道的程序员,咱们都是和核算机中软件硬件打交道的程序员,咱们都是和CPU打交道的程序员,所以,不论你是玩儿硬件的仍是做软件的,你的国际都少不了核算机最中心的 - CPU

CPU是什么

CPU 的全称是 Central Processing Unit,它是你的电脑中最硬核的组件,这种说法一点不为过。CPU 是能够让你的核算机叫核算机的中心组件,可是它却不能代表你的电脑,CPU 与核算机的联系就相当于大脑和人的联系。它是一种小型的核算机芯片,它嵌入在台式机、笔记本电脑或许平板电脑的主板上。经过在单个核算机芯片上放置数十亿个微型晶体管来构建 CPU。 这些晶体管使它能够履行运转存储在体系内存中的程序所需的核算,也便是说 CPU 决议了你电脑的核算才干。

CPU 实践做什么

CPU 的中心是从程序或应用程序获取指令并履行核算。此进程能够分为三个要害阶段:提取,解码和履行。CPU从体系的 RAM 中提取指令,然后解码该指令的实践内容,然后再由 CPU 的相关部分履行该指令。

RAM : 随机存取存储器(英语:Random Access Memory,缩写:RAM),也叫主存,是与 CPU 直接沟通数据的内部存储器。它能够随时读写(改写时在外),并且速度很快,一般作为操作体系或其他正在运转中的程序的暂时数据存储介质

CPU 的内部结构

说了这么多 CPU 的重要性,那么 CPU 的内部结构是什么呢?又是由什么组成的呢?下图展现了一般程序的运转流程(以 C 言语为例)刑侦大唐,能够说了解程序的芝加哥,高档程序员的修养,不得不知的硬核知识——CPU,惬意的意思运转流程是把握程序运转机制的根底和条件。

在这个流程中,CPU 担任的便是解说和运转终究转换成机器言语的内容。

CPU 首要由两部分构成:操控单元 和 算术逻辑单元(ALU)

  • 操控单元:从内存中提取指令并解码履行
  • 管用逻辑单元(ALU):处理管用和逻辑运算

CPU 是核算机的心脏和大脑,它和内存都是由许多晶体管组成的电子部件。它接纳数据输入,履行指令并处理信息。它与输入/输出庞克莱门捷夫(I / O)设备进行通讯,这些设备向 CPU 发送数据和从 CPU 接纳数据。

从功用来看,CPU 的内部由寄存器、操控器、运算器和时钟四部分组成,各部分之间经过电信号连通。

  • 寄存器是中央处理器内的组成部分。它们能够用来暂存指令、数据和地址。能够将其看作是内存的一种。依据品种的不同,一个 CPU 内部会有 20 - 100个寄存器。
  • 操控器担任把内存上的指令、数据读入寄存器,并依据指令的成果操控核算机
  • 运算器担任运算从内存中读入寄存器的数据
  • 时钟 担任宣布 CPU 开端计时的时钟信号

接下来简略解说一下内存,为什么说 CPU 需求讲一下内存呢,因为内存是与 CPU 进行沟通的桥梁。核算机一切程序的运转都是在内存中运转的,内存又被称为主存,其作用是寄存 CPU 中的运管用据,以及与硬盘等外部存储设备沟通的数据。只需核算机在运转中,CPU 就会把需求运算的数据调到主存中进行运算,当运算完结后CPU再将成果传芝加哥,高档程序员的修养,不得不知的硬核知识——CPU,惬意的意思送出来,主存的运转也决议了核算机的安稳运转。

主存经过操控芯片与 CPU 进行相连,由可读写的元素构成,每个字节(1 byte = 8 bits)都带有一个地址编号,注k9606意是一个字节,而不是一个位。CPU孙道临为何不爱王文娟 芝加哥,高档程序员的修养,不得不知的硬核知识——CPU,惬意的意思经过地址从主存中读取数据和指令,也能够依据地址写入数据。留意一点:当核算机关机时,内存中的指令和数据也会被铲除。

CPU 是寄存器的集合体

在 CPU 的四个结构中,咱们程序员只需求了解寄存器就能够了,其他三个不必过多重视,为什么这么说?因为程序是把寄存器作为目标来描绘的。

提到寄存器,就不得不提到汇编言语,我大学是学信息管理与信息体系的,我就没有学过汇编这门课(就算有这门课也不会好好学hhhh),出来洗衣屋混总是要还的,要想作为一个硬核程序员,不能不了解这些概念。提到汇编言语,就不得不提到高档言语,提到高档言语就不得不牵扯出言语这个概念。

核算机言语

咱们生而为人最显着的一个特征是咱们能经过说话来完结互相的沟通,可是核算机听不懂你说的话,你要想和他沟通有必要依照核算机指令来沟通,这就涉及到言语的问题,核算机是由二进制构成的,它只能听的懂二进制也便是机器言语,可是普通人是无法看懂机器言语的,这个时分就需求一种电脑既能辨认,人又能了解的言语,最早呈现的便是汇编言语。可是汇编言语不流畅难明,所以又呈现了像是 C,C++,Java 的这种高档言语。

所以核算机言语一般分为两种:低级言语(机器言语,汇编言语)和高档言语。运用高档言语编写的程序,经过编芝加哥,高档程序员的修养,不得不知的硬核知识——CPU,惬意的意思译转换成机器言语后才干运转,而汇编言语经过汇编器才干转换为机器言语。

汇编言语

首要来看一段用汇编言语表明的代码清单

mov eax, dword ptr [ebp-8] /* 把数值从内存仿制仟校网到 eax */
add eax, dword ptr [ebp-0Ch] /* 把 eax 的数值和内存的数值相加 */
mov dword ptr [ebp-4], eax /* 把 eax 的数值(上一步的成果)存储在内存中*/

这是选用汇编言语(assembly)编写程序的一部分。汇编言语选用 助记符(memonic) 来编写程序,每一个原本是电信号的机器言语指令会有一个与其对应的助记符,例如 mov,add 别离是数据的存储(move)和相加(addition)的简写。汇编言语和机器言语是一一对应的。这一点和高档言语有很大的不同,一般咱们将汇编言语编写的程序转换为机器言语的进程绿茵球霸称为 汇编;反之,机器言语转化为汇编言语的进程称为 反汇编。

汇编言语能够协助你了解核算机做了什么作业,机器言语等级的程序是经过寄存器来处理的,上面代码中的 eax,ebp 都是表明的寄存器,是 CPU 内部寄存器的称号,所以能够说 CPU 是一系列寄存器的集合体。在内存中的存储经过地址编号来表明,而寄存器的品种则经过姓名来区别。

不同类型的 CPU ,其内部寄存器的品种,数量以及寄存器存储的数值规模都是不同的。不过,依据功用的不同,能够将寄存器区别为下面这几类

品种功用累加寄存器存储运转的数据和运算后的数据。标志寄存器用于反响处理器的状况和运算成果的某些特征以及操控指令的履行。程序计数器程序计数器是用于寄存下一条指令地点单元的地址的当地。基址寄存器存储数据内存的开端方位变址寄存器存储基址寄存器的相对豁拉子地址通用寄存器存储恣意数据指令寄存器贮存正在被运转的指令,CPU内部运用,程序员无法对该寄存器进行读写栈寄存器存储栈区域的开端方位

其间程序计数器、累加寄存器、标志寄存器、指令寄存器和栈寄存器都只需一个,其他寄存器一般有多个。

程序计数器

程序计数器(Program Counter)是用来存储下一条指令地点单元的地址。

程序履行时,PC的初值为程序第一条指令的地址,在次序履行程序时,操控器首要按程序计数器所指出的指令地址从内存中取出一条指令,然后剖析和履行该指令,一起将PC的值加1指向下一条要履行的指令。

咱们仍是以一个案例为准来详细的看一下程序计数器的履行进程

这是一段进行相加的操作,程序发动,在经过编译解析后会由操作体系把硬盘中的程序仿制到内存中,示例中的程序是将 123 和 456 履行相加操作,并将成果输出到显示器上。因为运用机器言语难以描绘,所以这是经过翻译后的成果,实践上每个指令和数据都或许散布在不同的地址上,但为了便利阐明,把组成一条指令的内存和数据放在了一个内存地址上。

地址 0100 是程序运转的开端方位。Windows 等操作体系把程序从硬盘仿制到内存后,会将程序计数器作为设定为开端方位 0100,然后履行程序,每履行一条指令后,程序计数器的数值会添加1(或许直接指向下一条指令的地址),然后,CPU 就会依据程序计数器的数值,从内存中读取指令并履行,也便是说,程序计数器操控着程序的流程

条件分支和循环机制

咱们都学过高档言语,高档言语中的条件操控流程首要分为三种:次序履行、条件分支、循环判别三种,次序履行是依照地址的内容次序的履行指令。条件分支是依据条件履行恣意地址的指令。循环是重复履行同一地址的指令。

  • 次序履行的状况比较简略,每履行一条指令程序计数器的值便是 + 1。
  • 条件和循环分支会使程序计数器的值指向恣意的地址,这样一来,程序便能够回来到上一个地址来重复履行同一个指令,或许跳转到恣意指令。

下面以条件分支为例来说齐欣云服明程序的履行苏玉珍进程(循环也很相似)

​ 条件循环的履行流程

程序的开端进程和次序流程是相同的,CPU 从0100处开端履行指令,在0100和0101都是次序履行,PC 的值次序+1,履行到0102地址的指令时,判别0106寄存器的数值大于0,跳转(jump)到0104地址的指令,将假面美妞数值输出到显示器中,然后完毕程序,0103 的指令被越过了,这就和咱们程序中的 if() 判别是相同的,在不满足条件的状况下,指令会直接越过。所以 PC 的履行进程也就没有直接+1,而是下一条指令的地址。

标志寄存器

条件和循环分支会运用到 jump(跳转指令),会依据当时的指令来判别是否跳转,上面咱们提到了标志寄存器,不管当时累加寄存器的运算成果是正数、负数仍是零,标志寄存器都会将其保存(也担任溢出和奇偶校验)

溢出(overflow):是指运算的成果超过了寄存器的长度规模

奇偶校验(parity check):是指检查运算成果的值是偶数仍是奇数

CPU 在进行运算时,标志寄存器的数值会依据当时运算的成果主动设定,运算成果的正、负和零三种状况由标志寄存器的三个位表明。标志寄存器的第轻轻汉语习气变声软件一个字节位、第二个字节位、第三个字节位各自的成果都为1时,别离代表着正数、零和负数。

CPU 的履行机制比较有意思,假定累加寄存器中存储的 XXX 和通用寄存器中存储的 YYY 做比较,履行比较的背面,CPU 的运算机制就会做减法运算。而不管减法运算的成果是正数、零仍是负数,都会保存到标志寄存器中。成果为正表明 XXX 比 YYY 大,成果为零表明 XXX 和 YYY 持平,成果为负表明 XXX 比 YYY 小。程序比较的指令,实践上是在 CPU 内部做减法运算。

函数调用机制

接下来,咱们持续介绍函数调用机制,哪怕是高档言语编写的程序,函数调用处理也是经过把程序计数器的值设定成函数的存储地址来完结的。函数履行跳转指令后,有必要进行回来处理,单纯的指令跳转没有意义,下面是一个完结函数跳转的比如

图中将变量 a 和 b 别离赋值为 123 和 456 ,调用 MyFun(a,b) 办法,进行指令跳转。图中的地址是将 C 言语编译成机器言语后运转时的地址,因为1行 C 程序在编译后一般会变为多行机器言语,所以图中的地址是涣散的。在执顾保裕行完 MyFun(a,b)指令后,程序会回来到 MyFun(a,b) 的下一条指令,CPU 持续履行下面的指令。

函数的调用和回来很重要的两个指令是 call 和 return 指令,再将函数的进口地址设定到程序计数器之前,call 指令会把调用函数后要履行的指令地址存储在名为栈的主存内。函数处理完毕后,再经过函数的出口来履行 return 指令。return 指令的功用是把保存在栈中的地址设定到程序计数器。MyFun 函数在被调用之前,0154 戈鸟地址保存在栈中,MyFun 函数处理完结后,会把0154的地址保存在程序计数器中。这个调用进程如下

在一些高档言语的条件或许循环语句中,函数调用的处芝加哥,高档程序员的修养,不得不知的硬核知识——CPU,惬意的意思理睬转换成 call 指令,函数完毕后的处理则会转换成 return 指令。

经过地址和索芝加哥,高档程序员的修养,不得不知的硬核知识——CPU,惬意的意思引完结数组

接下来咱们看一下基址寄存器和变址寄存器,经过这两个寄存器,咱们能够对主存上的特定区域进行区别,来完结相似数组的操作,首要,咱们用十六进制数将核算机内存上的 00000000 - FFFFFFFF 的地址区别出来。那么,但凡该规模的内芝加哥,高档程序员的修养,不得不知的硬核知识——CPU,惬意的意思存地址,只需有一个 32 位的寄存器,便可检查悉数地址。但假如想要想数组那样切割吕文鑫特定的内存区域以到达接连检查的意图的话,运用两个寄存器会愈加便利。

例如蔡钧毅新浪博客,咱们用两个寄存器(基址寄存器和变址寄存器)来表明内存的值

这种表明办法很相似数组的结构,数组是指相同长度的数据在内存中进行接连摆放的数据结构。用数组名表明数组悉数的值,经过索引来区别数组的各个数据元素,例如: a[0] - a[4],[]内的 0 - 4 便是数组的下标。

CPU 指令履行进程

那么 CPU 是怎么履行一条条张妍个人资料的指令的呢?

简直一切的冯诺伊曼型核算机的CPU,其作业都能够分为5个阶段:取指令、指令译码、履行指令、访存取数、成果写回

  • 取指令阶段是将内存中的指令读取到 CPU 中寄存器的进程,程序寄存器用于存储下一条指令地点的地址
  • 指令译码阶段,在取指令完结后,立马进入指令译码阶段,在指令译码阶段,指令译码器依照预订的指令格局,对取回的指令进行拆分和解说,辨认区别出不同的指令类别以及各种获取操作数的办法。
  • 履行指令阶段,译码完结后,就需求履行这一条指令了,此阶段的使命是完结指令所规则的各种操作,详细完结指令的功用。
  • 拜访取数阶段,依据指令的需求,有或许需求从内存中提取数据,此阶段的使命是:依据指令地址码,得到操作数在主存中的地址,并从主存中读取该操作数用于运算。
  • 成果写回阶段,作为最终一个阶段,成果写回(Write Back,WB)阶段把履行指令阶段的运转成果数据“写回”到某种存储方式:成果数据经常被写到CPU的内部寄存器中,以便被后续的指令快速地存取;

总结

本篇文章我3u8936们首要叙述了

  • CPU 是什么,CPU 的重要性,CPU 履行程序李振威营口的进程
  • 还叙述了 CPU 的内部结构,它的组成部分
  • 提到了汇编言语和高档言语
  • 提到了CPU 与 寄存器的联系
  • 提到了首要的寄存器的功用,程序计数器,标志寄存器,基址寄存器和变址寄存器
  • 还提到了函数调用机制是怎样的。
  • CPU 指令的履行进程

下面为自己做个宣扬,欢迎重视大众号 Java建设者,号主是Java技能栈,酷爱技能,喜爱阅览,热衷于共享和总结,期望能把每一篇好文章共享给生长道路上的你。我为你预备了百余种优质电子书和各种资源,相信你一定会喜爱并保藏的。

共享自:https://segmentfault.com/a/1190000020751429

版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。