CPU的介绍

CPU 也称为微处理器,是计算机的心脏和/或大脑。

深入研究计算机的核心,可以帮助我们有效地编写计算机程序。

CPU 是计算机的心脏和大脑,它执行提供给他们的指令。它的主要工作是执行算术和逻辑运算并将指令编排在一起。

我们先来看一下CPU的主要组件是什么以及它们的作用:

处理器两个主要组件

  • 控制单元 CU
  • 算术和逻辑单元 ALU

1.控制单元 CU

控制单元CU是CPU的一部分,它可以帮助CPU协调指令的执行,它告诉CPU该怎么办。

并根据说明,它有助于激活将CPU连接到计算机的其他各个部分(包括ALU)。控制单元是CPU接收处理指令的第一个组件。

控制单元也有两种类型:

  • 硬连线 控制单元。
  • 微型可编程(微型) 控制单元。

硬连线 控制单元是指硬件,需要对硬件进行更改以添加修改以使其正常工作,而可以对微可编程控制单元进行编程以更改其行为。硬接线CU处理指令的速度更快,而微编程的灵活性更高。

2.算术和逻辑单元 ALU

算术和逻辑单元ALU进行所有算术和逻辑计算。ALU执行加减运算。ALU由执行这些操作的逻辑电路或逻辑门组成。

大多数逻辑门接受两个输入并产生一个输出,下面是一个半加法器电路的示例,该电路采用两个输入并输出结果。这里A和B是输入,S是输出,C是进位。

存储—寄存器和内存

CPU的主要工作是执行提供给它的指令,而要在大多数时间处理这些指令,它需要数据。一些数据是中间数据,其中一些是输入,其他是输出。这些数据和说明一起存储在以下存储器中:

寄存器

寄存器是一小组可以存储数据的地方。寄存器是锁存器的组合 。

锁存器 也称为 触发器, 是存储1位信息的逻辑门的组合 。

锁存器有两根输入线,写和输入线,以及一根输出线。我们可以启用写入线来更改存储的数据。禁用写线时,输出始终保持不变。

CPU具有用于存储输出数据的寄存器,由于它是中间数据,因此发送到主存储器(RAM)会很慢。

该数据被发送到通过BUS连接的其他寄存器 。寄存器可以存储指令,输出数据,存储地址或任何类型的数据。

内存(RAM)

RAM是寄存器的集合,这些寄存器以优化的方式排列并压缩在一起,以便可以存储更多数据。

RAM(随机存取存储器)易失,当我们关闭电源时,数据会丢失。

由于RAM是用于读取/写入数据的寄存器的集合,因此RAM接受8位地址的输入,输入要存储的实际数据的数据,最后读取和写入使能器,其对锁存器的作用相同。

什么是指令

指令是计算机可执行的粒度计算,CPU可以处理各种指令。

包括:

  • 算术,例如 加法 和 减法
  • 逻辑指令,例如 和, 或,而 不是
  • 数据指令,例如 移动, 输入, 输出, 加载和 存储
  • 控制流指令,例如 goto, 如果... goto,则 调用并 返回
  • 通知程序已经结束CPU 暂停

使用汇编语言将指令提供给计算机,或者由编译器生成指令,或者以某些高级语言解释指令。

这些指令被硬件连线到CPU内部,ALU包含算术和逻辑,而控制流由CU管理。

CPU时钟

时钟周期

计算机的速度取决于其时钟周期。它是计算机每秒工作的 时钟周期 数。单时钟周期非常小,大约为250 * 10 * -12秒。时钟周期越高,处理器速度就越快。

一个CPU时钟循环以GHz(测量吉赫兹)。1GHz等于10⁹Hz(赫兹)。赫兹表示一秒钟执行的次数。因此1 GHz意味着每秒10⁹个周期。

时钟周期越快,CPU 可执行的指令越多 。时钟周期= 1 / CPU时钟频率时间 = 时钟周期数/时钟频率

这意味着可以通过优化提供给CPU的指令来缩短CPU时间,从而提高时钟频率或减少时钟周期数。某些处理器可以增加时钟周期,但由于是物理变化,因此可能会过热甚至冒烟/起火。

在一个 时钟周期内, 计算机可以执行一条指令,但是现代计算机可以执行多条指令。

计算机可以执行的一组指令称为 指令集。

总线

CPU,寄存器,存储器和IO设备之间的所有数据都通过总线传输。

为了将数据加载到刚刚添加的存储器中,CPU将存储器地址放入地址总线,并将总和结果放入数据总线,并在控制总线中启用正确的信号。

这样,数据将在总线的帮助下加载到内存中。

接下来来解释指令如何执行

指令按顺序存储在 RAM 中。对于一个假设的CPU,指令由 OP 代码(操作代码)和 存储器或寄存器地址组成。

在控制单元指令寄存器(IR)中 有两个寄存器 ,用于加载指令的OP代码;在 指令地址寄存器中 ,用于加载当前正在执行的指令的地址。CPU内还有其他寄存器,用于存储存储在指令后4位地址中的值。

以一组将两个数字相加的指令为例,以下是说明:

步骤1 — LOAD_A 8:

最初将指令保存在RAM中,例如<1100 1000>。前4位是操作码,它确定了指令。该指令被提取到控制单元的IR 中。指令被解码为d_load_A,这意味着它需要将数据加载到地址1000中,该地址是指令A的最后4位。

步骤2 — LOAD_B 2

与上面类似,这会将内存地址2(0010)中的数据加载到CPU寄存器B。

第3 步-添加BA

现在,下一条指令是将这两个数字相加。此处,CU告诉ALU执行加法运算并将结果保存回寄存器A。

步骤4 — STORE_A 23

这是一组非常简单的说明,有助于将两个数字相加。

现在我们已经成功地添加了两个数字! (๑❛ᴗ❛๑) (๑❛ᴗ❛๑)

下面介绍一些计算机术语

快取

CPU还具有一种将指令预取到其缓存的机制。

众所周知,处理器可以在一秒钟内完成数百万条指令。这意味着从RAM提取的指令要比执行指令花费更多的时间。因此,CPU高速缓存会预取一些指令以及数据,以便快速执行。

如果高速缓存和操作存储器中的数据不同,则将数据标记为脏位。

指令流水线

现代CPU使用指令流水线来并行执行指令,把 提取,解码,执行 当一条指令执行,当处于解码阶段时,CPU可以在提取阶段处理另一条指令。

但是当一条指令依赖于另一条指令时,这将产生一个问题。因此,处理器以不相同的顺序执行不相关的指令。

多核计算机

它基本上是不同的CPU,但是有一些共享资源,例如缓存。

性能

CPU的性能取决于其执行时间,性能= 1 /执行时间

假设一个程序执行需要20毫秒。CPU的性能为1/20 = 0.05ms,相对性能=执行时间1 /执行时间2

CPU性能要考虑的因素是指令执行时间CPU时钟速度。因此,要提高程序的性能,我们要么需要提高时钟速度,要么需要减少程序中的指令数量。处理器速度有限,具有多核功能的现代计算机每秒可支持数百万条指令。但是,如果我们编写的程序有很多指令,则会降低整体性能。

大O表示法 使用给定的输入确定如何影响性能。

CPU中进行了许多优化,以使其更快,性能尽可能高。在编写任何程序时,我们需要考虑减少提供给CPU的指令数量将如何提高计算机程序的性能。

CPU 是如何认识和执行代码的的更多相关文章

  1. java动态编译 (java在线执行代码后端实现原理)(二)

    在上一篇java动态编译 (java在线执行代码后端实现原理(一))文章中实现了 字符串编译成字节码,然后通过反射来运行代码的demo.这一篇文章提供一个如何防止死循环的代码占用cpu的问题. 思路: ...

  2. 面试官:如何写出让 CPU 跑得更快的代码?

    前言 代码都是由 CPU 跑起来的,我们代码写的好与坏就决定了 CPU 的执行效率,特别是在编写计算密集型的程序,更要注重 CPU 的执行效率,否则将会大大影响系统性能. CPU 内部嵌入了 CPU ...

  3. 【.net 深呼吸】限制执行代码的权限

    前面好几篇文章,老周都跟大伙伴们聊了跟应用程序域有关的话题,干脆咱们一聊到底吧,做学问就应该这样,有恒心. App Domain的创建新应用程序域的方法中,有一个特殊的重载: public stati ...

  4. 【转】C# 将字符串或表达式直接转为可执行代码的办法

    C# 将字符串或表达式直接转为可执行代码的办法 反射类 using System; using System.Data; using System.Configuration; using Syste ...

  5. [转载]基于TFS实践敏捷-修复Bug和执行代码评审

    本主题阐释了这些功能,以继续这一关注虚拟敏捷团队成员的一天的教程. Peter 忙于编写一些代码以完成积压工作 (backlog) 项任务.但是,他的同事发现了一个阻碍他们工作的 Bug,他想立即修复 ...

  6. 在VC环境下执行代码出现错误

    这是在执行代码过程中出现的错误,源代码在别的电脑上能运行,在自己的VC里运行就出现错误,在网上也搜过解决办法,但还是有点不太理解,是编程环境的问题h还是代码本身也存在问题???

  7. C#实现每隔一段时间执行代码(多线程)

    总结以下三种方法,实现c#每隔一段时间执行代码: 方法一:调用线程执行方法,在方法中实现死循环,每个循环Sleep设定时间: 方法二:使用System.Timers.Timer类: 方法三:使用Sys ...

  8. C#动态编译、执行代码

    在开始之前,先熟悉几个类及部分属性.方法:CSharpCodeProvider.ICodeCompiler.CompilerParameters.CompilerResults.Assembly. 一 ...

  9. python顶级执行代码

    只有主程序中由大量顶级执行代码(即没有被缩进的代码行),所有其他被导入的模块只应该又很少的顶级执行代码. 如果模块是被导入,__name__就是模块名. 如果模块是被直接执行,__name__就是__ ...

随机推荐

  1. DeWeb进阶 :控件开发 --- 1 完成一个纯html的demo

    最近随着DeWeb(以下简称DW)的完善,和群友的应用的深入,已经有网友开始尝试做DeWeb支持控件的开发了! 这太令人兴奋了! 作为DeWeb的开发者,感觉DeWeb的优势之一就是简洁的第三方控件扩 ...

  2. Swift-技巧(三)使用元组(tuple)

    最近看 iOS 的官方功能的 Demo 时,发现代码中使用元组的地方很多,所以兴趣上来,查了下元组的出处. 在苹果的文档中就只有简短的两句,使用元组创建一个组合的值,从函数中返回多个值.元组中的可以使 ...

  3. 浅谈对typora的使用

    内容概要 - 什么是typora - typora的具体使用 目录 内容概要 - 什么是typora - typora的具体使用 1. 什么是typora 2.typora的具体使用 1.标题级别 2 ...

  4. centos安装pm2报错

    报错信息: /usr/lib/node_modules/pm2/node_modules/chalk/source/index.js:103 ...styles, 这个问题其实很简单,就是npm和no ...

  5. dart系列之:dart语言中的内置类型

    目录 简介 Null 数字 字符串 布尔值 列表 set和map 简介 和所有的编程语言一样,dart有他内置的语言类型,这些内置类型都继承自Object,当然这些内置类型是dart语言的基础,只有掌 ...

  6. Mysql教程:(五)多表查询

    多表查询 select name,student.class,student.number,maths,chinese,english from student,score where student ...

  7. Cannot find ./catalina.sh The file is absent or does not have execute permission This file is needed to run this program(问题解决)

    web项目没有打成包,直接放在了linux服务器上. 进入tomcat/bin目录,执行启动的时候出现如下错误: 解决方法: 在tomcat 的bin目录下 执行这条命令chmod +x *.sh   ...

  8. 2019年java大型项目技术选型

    学习一下 1,公司使用的架构是:SpringCloud + K8S 这一套主流技术,但是还是入门级别的. 还包含apollo  ,xxlJob ,SkyWalking,Cat,GrayLog等 2,G ...

  9. java eclipse调试提示Source not found 或 一闪而过 解决方法

    Web工程Eclipse  debug方式启动,在断点的位置被成功拦截,但是没有跳转到工程的代码处,提示如下: 当然这个时候如果我继续按F5的话呢,程序又会接着正常运行了.到这里那就是说程序本身是没有 ...

  10. 第一周PTA笔记 德州扑克题解

    德州扑克 最近,阿夸迷于德州扑克.所以她找到了很多人和她一起玩.由于人数众多,阿夸必须更改游戏规则: 所有扑克牌均只看数字,不计花色. 每张卡的值为1.2.3.4.5.6.7.8.9.10.11.12 ...