关于CPU的12个硬核干货!

2023-05-16

作为一名程序员,与计算机打交道的日子不计其数,不管你玩硬件还是做软件,你的世界自然都少不了计算机最核心的 —— CPU。

01 CPU是什么?

CPU与计算机的关系就相当于大脑和人的关系,它是一种小型的计算机芯片,通常嵌入在电脑的主板上。

CPU的构建是通过在单个计算机芯片上放置数十亿个微型晶体管来实现。

这些晶体管使它能够执行运行存储在系统内存中的程序所需的计算,所以,也可以说CPU决定了你电脑的计算能力。

02 CPU实际做什么?

CPU的工作核心是从程序或应用程序中获取指令并且执行计算。

这个过程一共有三个关键阶段:提取,解码和执行。

CPU先从系统的RAM中提取指令,随后解码该指令的实际内容,最后再由CPU的相关部分执行该指令。

03 CPU的内部结构

刚才提到了很多CPU的重要性,那么CPU的内部结构是什么呢?又是由什么组成的呢?

下图展示了一般程序的运行流程(以C语言为例),一般来说,了解程序的运行流程是掌握程序运行机制的基础和前提。

在这个流程中,CPU负责解释和运行最终转换成机器语言的内容,CPU主要由两部分构成:控制单元和算数逻辑单元(ALU)。

  • 控制单元:从内存中提取指令并解码执行;

  • 算数逻辑单元(ALU):处理算数和逻辑运算。

CPU和内存都是由许多晶体管组成的电子部件,可以把它比作计算机的心脏和大脑。

它能够接收数据输入、执行指令并且处理相关信息,它与输入/输出(I/O)设备进行通信,这些设备向 CPU 发送数据和从 CPU 接收数据。

从功能上来看,CPU的内容是由寄存器、控制器、运算器和时钟四部分组成的,各个部分之间通电信号来连通。

接下来简单介绍一下内存,为什么说到CPU需要讲一下内存呢?

因为内存是与CPU进行沟通的桥梁,计算机中所有程序的运行都在内存中得到运行的。

内存一般又被称为主存,它的作用是存放CPU中的运算数据,以及与硬盘等外部存储设备交换的数据。

CPU会在计算机运转时,把需要运算的数据调到主存中进行运算。

在运算完成之后,CPU将结果传送出来,主存的运行也决定了计算机的稳定运行。

主存一般通过控制芯片与CPU相连,由可读写的元素构成,每个字节都有一个地址编号。

CPU通过地址从主存中读取数据和指令,也可以根据地址写入数据,注意一点:当计算机关机时,内存中的指令和数据也会被清除。

04 CPU是寄存器的集合体

在CPU的四个结构中,寄存器的重要性远远高于其余三个,为什么这么说?因为程序通常是把寄存器作为对象来进行描述的。

而说到寄存器,就不得不说到汇编语言,说到汇编语言,就不得不说到高级语言,说起高级语言也就不得不提及语言的概念。

05 计算机语言

人和人之间最古老和直接的沟通媒介是语言,但是和计算机沟通,就必须按照计算机指令来交换,其中就涉及到语言的问题。

最早,为了解决计算机和人类的交流的问题,出现了汇编语言。

但是汇编语言晦涩难懂,所以又出现了像是C、C++、Java的这种高级语言,因此计算机语言一般分为低级语言和高级语言。

使用高级语言编写的程序,经过编译转换成机器语言后才能运行,而汇编语言经过汇编器才能转换为机器语言。

06 汇编语言

我们先来看一段采用汇编语言表示的代码清单:

这是采用汇编语言编写程序的一部分,汇编语言采用助记符来编写程序,每个原本是电信号的机器语言指令会有一个与其对应的助记符。

比如,mov,add分别是数据的存储(move)和相加(addition)的简写。

汇编语言和机器语言一一对应,这点和高级语言不同,我们通常把汇编语言编写的程序转换为机器语言的这个过程,称之为汇编。

与之相反,将机器语言转化为汇编语言的过程称之为反汇编。

汇编语言可以帮助你理解计算机做了什么工作,机器语言级别的程序通过寄存器来处理,上面代码中的eax,ebp都是表示的寄存器,它们是CPU内部寄存器的名称。

因此,可以说 CPU 是一系列寄存器的集合体。

一般,在内存中的存储通过地址编号来表示,寄存器的种类是通过名字来区分。

那些不同类型的CPU,其内部寄存器的种类、数量以及寄存器存储的数值范围也都是不同的。

不过,根据功能的不同,我们可以将寄存器划分为下面几类:

其中,程序计数器、标志寄存器、累加寄存器、指令寄存器和栈寄存器只有一个,其他寄存器一般有好几个。

07 程序计数器

程序计数器是用来存储下一条指令所在单元的地址。

程序在执行时,PC的初值作为程序第一条指令的地址,在顺序执行程序时,控制器先按照程序计数器所指出的指令地址,从内存中取出一条指令,随后分析和执行该指令,并同时将PC的值加1指向下一条要执行的指令。

我们可以通过一个事例来仔细看一下程序计数器的执行过程:

这是一段进行相加的操作,程序启动,在经过编译解析后,会经由操作系统把硬盘中的程序复制到内存中。

以上示例程序,就是将123和456执行相加的操作,随后将结果输出到显示器上,因为使用机器语言很难描述,所以这些都是经过翻译后的结果。

事实上,每个指令和数据都有可能分布在不同的地址上,但是为了更好的说明,就把组成一条指令的内存和数据放在了一个内存地址上。

地址0100是程序运行的起始位置,Windows等操作系统把程序从硬盘复制到内存以后,就会将程序计数器作为设定为起始位置0100,然后再执行程序,每次执行一条指令后,程序计数器的数值就会增加1,或者是直接指向下一条指令的地址。

随后,CPU会根据程序计数器的数值,从内存中读取命令并且执行,换言之,程序计数器控制着程序的流程。

08 条件分支和循环机制

小伙伴们都学过高级语言,高级语言汇总的条件控制流程主要分为顺序执行、条件分支、循环判断三种。

  • 顺序执行是按照地址的内容顺序的执行命令。

  • 条件分支是根据条件执行任意地址的指令。

  • 循环是重复执行同一地址的指令。

一般情况下,顺序执行的情况较简单,每次执行一条指令程序计数器的值就是+1。

条件和循环分支会使得程序计数器的值指向任意的地址,这样一来,程序就可以返回到上一个地址来重复执行同一个指令,或者跳转到其它任意指令。

下面,我们就以条件分支举例来说明程序的执行过程:

程序的开始过程和顺序流程是一样的,程序的顺序流程和开始过程相同。

CPU从0100处就开始执行命令,在0100和0101中都是顺序执行,PC的值顺序+1,执行到0102地址的指令时,判断0106寄存器的数值大于0,跳转到0104地址的指令,再将数值输到显示器中,随后结束程序,0103的指令就被跳过了。

这和我们程序中的if()判断相同,在不满足条件的情况下,指令一般会直接跳过。

因此,PC的执行过程没有直接+1,而是下一条指令的地址。

09 标志寄存器

条件和循环分支会使用到 jump(跳转指令),会根据当前的指令来判断是否跳转,上面我们提到了标志寄存器,无论当前累加寄存器的运算结果是正数、负数还是零,标志寄存器都会将其保存。

CPU在进行运算时,标志寄存器的数值会根据当前运算的结果自动设定,运算结果的正、负和零三种状态由标志寄存器的三个位表示。

标志寄存器的第一个字节位、第二个字节位、第三个字节位各自的结果都为1时,分别代表着正数、零和负数。

CPU的执行机制比较有意思,假设累加寄存器中存储的XXX和通用寄存器中存储的YYY做比较,执行比较的背后,CPU的运算机制就会做减法运算。

而无论减法运算的结果是正数、零还是负数,都会保存到标志寄存器中。

结果为正表示 XXX 比 YYY 大,结果为零表示 XXX 和 YYY 相等,结果为负表示 XXX 比 YYY 小,程序比较的指令,实际上是在 CPU 内部做减法运算。

10 函数调用机制

函数的调用和条件分支,循环机制有所不同,单纯的跳转指令无法实现函数的调用。

函数的调用需要在函数内部处理后,处理流程在返回到函数调用点(函数调用指令的下一个地址)。

函数的调用处理是通过把程序计数器的值设定成函数的存储地址来实现的。

11 通过地址和索引实现数组

接下来是基址寄存器和变址寄存器,通过这两个寄存器,可以对主存上的特定区域进行划分,以此实现类似数组的操作。

首先,可以用十六进制数将计算机内存上的 00000000 - FFFFFFFF 的地址划分出来。

这样,凡是该范围的内存地址,只要有一个 32 位的寄存器,就可以查看全部地址。

但是,要是想像数组那样,分割特定的内存区域以达到连续查看的目的的话,使用两个寄存器会更方便一些,比如,我们用两个寄存器来表示内存的值。

这种表示方式很像数组的构造,数组是指同样长度的数据,在内存中进行连续排列的数据构造。

用数组名表示数组全部的值,通过索引来区分数组的各个数据元素,例如: a[0] - a[4],[]内的 0 - 4 就是数组的下标。

12 CPU指令执行过程

那说了这么多,CPU到底是怎么一条条的执行指令的呢?几乎全部的冯·诺伊曼型计算机的CPU,工作都可以分为5个阶段:取指令、指令译码、执行指令、访存取数、结果写回。

取指令阶段就是将内存中的指令读取到CPU中寄存器的过程,程序寄存器用于存储下一条指令所在的地址;

  • 在取指令完成后,立马进入指令译码阶段,在指令译码阶段,指令编码器按照预先的指令格式,对取回的指令进行拆分和解释,识别区分出不同的指令类别和各种获取操作数的方法;

  • 执行指令阶段的任务是完成指令所规定的各种操作,具体实现指令的功能;

  • 访问取数阶段的任务是:根据指令地址码,得到操作数在主存中的地址,并从主存中读取该操作数用于运算;

  • 结果写回阶段作为最后一个阶段,把执行指令阶段的运行结果数据“写回”到某种存储形式:结果数据经常被写到CPU的内部寄存器中,以便被后续的指令快速地存取。

免责声明:转载文章为传播相关技术,版权归原作者所有,如有侵权,请联系删除 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于CPU的12个硬核干货! 的相关文章

  • Linux 中以百分比形式准确计算 CPU 使用率?

    这是一个已经被问过很多次的问题 但是我找不到得到充分支持的答案 许多人建议使用 top 命令 但如果您运行 top 一次 因为您有一个脚本 例如每 1 秒收集一次 Cpu 使用情况 它将始终给出相同的 Cpu 使用结果 示例1 https
  • 如何为Python 3子进程分配CPU亲和力?

    我在 Python 方面还是个新手 我在 Windows 7 和 Windows 10 上运行 Tkinter GUI 我有一个子进程以 1 KHz 运行数据记录器例程 我想为子进程设置 cpu 亲和力 我正在使用 Python 3 8 进
  • 上下文切换线程等待

    我已经寻找这个问题的答案一天了 但找不到直接的答案 我正在阅读上下文切换等待队列之类的内容 确实很好地掌握了所有内容 在阅读一篇文章时 写到当发生车队情况时 将会有大量的上下文切换 那么让我直接说一下 假设一个线程处于等待互斥体解锁的队列中
  • 获取CPU温度

    我想知道CPU的温度 以下是我使用 C 和 WMI 所做的工作 我正在读取 MSAcpi ThermalZoneTemperature 但它始终相同 而且根本不是 CPU 温度 有没有办法不用写驱动就能获取CPU的真实温度 或者有什么我可以
  • Python CPU 计数在一台 Windows 服务器上工作但在另一台服务器上不起作用?

    我编写的代码可以在 Windows XP 和 Windows Server 2008 64 位上运行 但是 我刚刚启动了 Amazon Windows 64 位实例 代码失败 非常简单 看起来像这样 import multiprocessi
  • 运行 Android Studio gradle 构建时如何使用所有 CPU 核心/线程?

    我正在 Android Studio 中寻找参数或配置 Gradle 它可以设置构建 以便在构建期间使用我的所有 CPU 核心 即 如果我有一个四核 CPU 并且每个核心运行 8 个线程 我如何优化构建 以便它将使用它可以获得的所有资源 当
  • 您的CPU不支持VT-x

    我已经创建了 AVD 但是当我尝试运行 android 程序时 它显示 错误 您的CPU不支持VT x 我在 BIOS 中启用了虚拟化技术 但当我尝试运行 Android 程序时仍然出现此错误 有两种情况 使用VMware 进入 WM gt
  • 尝试在 Windows PC 上禁用处理器空闲状态(C 状态)

    我需要防止处理器进入空闲状态 非C0 C状态 诚然 我对处理器 C 和 P 状态了解不多 所以请耐心等待 我们使用来自第三方供应商的相机 该相机偶尔会提供损坏的帧 供应商已确定 当 CPU 进入空闲状态时 它会干扰通过火线传输帧 为了确认这
  • C linux相当于windows QueryPerformanceCounter

    Linux 中是否有等效的 C 函数用于读取 CPU 计数器及其频率 我正在寻找类似于 QueryPerformanceCounter 函数的东西 该函数读取现代 CPU 中的 64 位计数器 clock gettime 2 http li
  • 如何在 C# 中获取每个核心的 CPU 负载?

    如何在 C 中获取每个核心 四核 cpu 的 CPU 负载 谢谢 您可以使用 WMI 或 System Diagnostics 命名空间 从那里您可以获取任何您想要的性能计数器 但是需要一秒钟 1 1 5秒 来初始化这些计数器 读取值是可以
  • 单核上的多线程有什么意义?

    我最近一直在研究 Linux 内核 并回顾了大学操作系统课程的时代 就像那时一样 我正在玩线程之类的东西 一直以来我一直假设线程是自动在多个核心上同时运行但我最近发现您实际上必须显式编写代码来处理多个核心 那么单核上的多线程有什么意义呢 我
  • CPU利用率和能耗之间有什么关系?

    描述 CPU 利用率和能源消耗 电 热方面 之间关系的函数是什么 我想知道它是否是线性 次线性 exp 等 我正在编写一个程序 可以降低其他程序的 CPU 利用率 负载 我主要关心的是我能在能源方面受益多少 此外 我的服务器主要用作数据中心
  • 为什么每个逻辑 CPU 在多线程情况下都有自己的 CR3 寄存器?

    当我们有一个支持某种形式的多线程的 CPU 时 每个逻辑 CPU 都有它自己的一组寄存器 至少 包括 CR3 寄存器 由于我们在执行不同线程时正在处理同一进程的虚拟地址空间 并且永远不会发生上下文切换 切换同一进程的线程时TLB缓存也不会失
  • 如何根据CPU能力实现渲染器

    我想知道在 JavaScript 中实现渲染器的最佳方法是什么 这里真正重要的并不是渲染的内容部分 我更想知道何时以及如何有效地运行渲染器代码 目前 我有window setInterval renderFunc 1000 20 每 50
  • 什么是微编码指令?

    我看过很多参考微编码指令的文献 这些是什么以及为什么使用它们 CPU 读取机器代码并将其解码为内部控制信号 将正确的数据发送到正确的执行单元 大多数指令映射到一个内部操作 并且可以直接解码 例如 在 x86 上 add eax edx只是将
  • python 进程占用 100% CPU

    我正在尝试运行 python 应用程序并根据指定的时间间隔执行操作 下面的代码持续消耗 100 的 CPU def action print print hello there interval 5 next run 0 while Tru
  • 通过 C 将线程固定到 cpuset 中的核心

    我有 cgroup cpuset set1 set1有2 5 8 我想将一个进程绑定到该 cpuset 然后将该进程中的一个线程固定到核心 4 cpuset 的名称 线程名称以及我应该将线程绑定到的核心位于 m 配置文件中 是否有任何 C
  • 普通的 x86 或 AMD PC 是直接从 ROM 运行启动/BIOS 代码,还是先将其复制到 RAM? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我知道现代计算机已经修改了哈佛架构 它们可以从保存数据的地方以外的地方读取指令 这一事实是否允许它们直接从 ROM 芯片获取指令 他们是先
  • CPU是如何做减法的?

    我有一些基本的疑问 但每次我坐下来尝试面试问题时 这些问题和我的疑问就会出现 假设 A 5 B 2 假设A和B都是4字节 那么CPU是怎么做的呢 A B添加 我知道 A 的符号位 MSB 为 0 表示正值 B 的符号位为 1 表示负整数 现
  • 获取总体 CPU 百分比使用率的可能性有哪些

    我有以下问题 在UWP中 我们如何获取总体CPU使用率 RAM使用率 可用RAM 正在运行的进程等 UWP 中的任务管理器需要它 您好 经过一番查看后 您似乎无法获得设备 CPU RAM 和可用 RAM 或正在运行的进程 您可以获得 CPU

随机推荐

  • SUMO文档:有关需求建模(Demand Modelling)

    Demand Introduction to demand modelling in SUMO 在生成了路网后 xff0c 我们可以在sumo gui上查看 xff0c 但是路网上并没有车辆运行 我们还需要一些有关车辆的描述 我们称之为 交
  • SUMO文档028:来源于观测点的路径

    Demand Routes from Observation Points 原文链接 xff1a http sumo dlr de wiki Demand Routes from Observation Points 自从0 9 5开始 x
  • 深度学习框架下群组行为识别算法综述

    源自 xff1a 电子学报 作者 xff1a 邓海刚 王传旭 李成伟 林晓萌 摘 要 群组行为识别目前是计算机视觉领域的一个研究热点 xff0c 在智能安防监控 社会角色理解和体育运动视频分析等方面具有广泛的应用价值 本文主要针对基于深度学
  • pci和pcie的区别

    原文地址 xff1a https blog csdn net u013253075 article details 80835489 最近在学习驱动开发过程中涉及到PCI相关知识 xff0c 在网上看了很多文章 xff0c 良莠不齐 xff
  • 一文道尽softmax loss及其变种

    1 softmax loss softmax loss是我们最熟悉的loss之一 xff0c 在图像分类和分割任务中都被广泛使用 Softmax loss是由softmax和交叉熵 cross entropy loss loss组合而成 x
  • 十大经典排序算法

    原文地址 xff1a 一文搞掂十大经典排序算法 不才伟才的博客 CSDN博客 一文搞掂十大经典排序算法 今天整理一下十大经典排序算法 1 冒泡排序 越小的元素会经由交换慢慢 浮 到数列的顶端 算法演示 算法步骤 比较相邻的元素 如果第一个比
  • ubuntu 更新阿里源

    原文地址 xff1a https www cnblogs com moyu557 p 10710689 html 查看新版本信息 lsb release c Ubuntu 12 04 LTS 代号为precise Ubuntu 14 04
  • 旋转编码器工作原理

    原文地址 xff1a https blog csdn net weixin 42562514 article details 89435902 一 旋转编码器的原理和特点 xff1a 旋转编码器是集光机电技术于一体的速度位移传感器 当旋转编
  • the read modes of FPGA FIFO —FWFT and Standard

    1 FWFT first word fall through 模式 xff1a 当rd en由低跳变到高电平时候 xff0c FIFO读出的数据FIFO dout 立即读出来 2 Standard 标准模式 xff1a 当rd en由低跳变
  • gdb x 命令详解

    gt examine命令 x xff1a 查看内存地址中的值 格式 xff1a x lt n f u gt lt addr gt n 是正整数 xff0c 表示需要显示的内存单元的个数 xff0c 即从当前地址向后显示n个内存单元的内容 x
  • 什么是奇偶校验

    校验依据 xff1a 判断传输的一组二进制数据中 34 1 34 的个数是奇数还是偶数 奇校验 xff1a 如果以二进制数据中1的个数是奇数为依据 xff0c 则是奇校验 偶校验 xff1a 如果以二进制数据中1的个数是偶数为依据 xff0
  • linux reboot,卡在“restarting system”

    原因 xff1a 产生这个bug的原因比较多 xff0c 百度一般不好找寻答案 xff0c 建议个位去谷歌 待研究 解决办法 xff1a 在谷歌上提交问题 xff0c 运气好有老外回答 本人就走了一次运 待研究 遇到同样问题的小伙伴可以私信
  • linux多线程调用同一个函数解析

    原文地址 xff1a http blog csdn net mq ydn3102 article details 8546722 问题背景 xff1a 在工作中遇到过一个问题 xff0c 就是在两个线程同时调用同一个函数的时候 xff0c
  • mac地址真的是全球是唯一的吗

    问题 xff1a mac地址真的是全球是唯一的吗 答 xff1a 不是 mac地址在百科中的描述如下 xff1a MAC xff08 Media Access Control xff0c 介质访问控制 xff09 地址 xff0c 也叫硬件
  • linux apt-get安装和卸载命令

    apt get update 更新安装列表 apt get upgrade 升级软件 apt get install software name 安装软件 apt get purge remove software name 卸载软件及其配
  • VMware12安装centOS8(vm虚拟机安装centos8教程)

    VMware12安装centOS8 xff08 vm虚拟机安装centos8教程 xff09 前几天Centos8发布了 xff0c 尽管他是8的第一个版本 xff0c 那么今天我们就在VM12上面安装centOS8吧 xff0c 8这个图
  • linux 7z压缩、解压命令

    原文地址 xff1a https blog csdn net jk110333 article details 7829879 支持 7Z ZIP Zip64 CAB RAR ARJ GZIP BZIP2 TAR CPIO RPM ISO
  • bat脚本中怎么注释命令行

    注释内容 按行注释REM 注释时 xff0c sh不执行后面的语句 xff0c 但是会显示 注释内容 按行注释 注意引用bat变量也是 xff0c 容易混淆 xff1a 注释内容 注意注释文本不能与已有标签重名 xff0c 因为 xff1a
  • C语言常见面试问题

    说一下 static 关键字的作用 static用于修改变量或函数的链接属性 xff0c 从外部链接属性变为内部链接属性 xff0c 变量或函数只能在当前文件访问 对于代码块内部的变量声明 xff0c static用于改变变量的存储属性 x
  • 关于CPU的12个硬核干货!

    作为一名程序员 xff0c 与计算机打交道的日子不计其数 xff0c 不管你玩硬件还是做软件 xff0c 你的世界自然都少不了计算机最核心的 CPU 01 CPU是什么 xff1f CPU与计算机的关系就相当于大脑和人的关系 xff0c 它