专栏首页Java技术栈面试官:CPU 是如何工作的?我一脸懵逼。。

面试官:CPU 是如何工作的?我一脸懵逼。。

你有木有被问过?有一次我就被问到一脸懵逼。。

CPU(中央处理器),也被称为微处理器,是计算机的心脏和/或大脑。本文让我们一起深入了解计算机的核心,以帮助我们高效地编写计算机程序。

以下为译文:

“工具通常比机器简单,通常用手来使用,而机器通常由动物或蒸汽动力驱动。”

——查尔斯·巴贝奇

计算机是一种机器,主要由电力驱动,但其灵活性和可编程性帮助实现了其作为一种工具的简单性。

CPU是计算机的心脏和/或大脑。负责执行提供给它们的指令。它的主要任务是执行算术和逻辑运算,并将指令协调在一起。在深入到本文的主要部分之前,让我们先看看CPU的主要组成部分,以及它们的作用分别是什么。

1、CPU的两个主要组成部分

控制单元 — CU

控制单元(CU)是CPU的一部分,它帮助协调指令的执行。它告诉CPU应该做什么。它的主要职责是根据指令,帮助激活连接CPU和计算机其他不同部件(包括ALU)的线路。控制单元是CPU的第一个接收处理指令的部件。

控制单元有两种类型:

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

硬接线控制单元是一种硬件,它需要在硬件上进行更改以实现对其工作方式的修改,而微型可编程控制单元则可以进行编程以更改其工作方式。硬接线控制单元在处理指令方面更快,而微型可编程控制单元则更灵活。

算术逻辑单元 —  ALU

算术逻辑单元(ALU),顾名思义,就是负责所有的算术和逻辑运算。算术逻辑单元执行加法运算,减法运算等操作。算术逻辑单元是由执行这些操作的逻辑电路或逻辑门组成。

大多数逻辑门接受两个输入并产生一个输出。

下面是一个半加法器电路的例子,它接受两个输入并输出结果。这里A和B是输入,S是输出,C是进位。

半加法器电路图

2、存储 - 寄存器和存储器

CPU的主要任务是执行提供给它的指令。在大多数情况下,为了处理这些指令,它需要数据。有些数据是中间数据,有些是输入,另一些是输出。这些数据连同指令一起存储在下列存储器中:

寄存器

寄存器是一组可以存储数据的小地方。寄存器是锁存器(Latches)的组合。锁存器也称为触发器(flip-flops),是存储1位信息的逻辑门的组合。

锁存器有一条输入线,一条写入和输入线,和一条输出线。我们可以启用写入线对存储的数据进行更改。当写入线被禁用时,输出始终保持不变。

SR锁存器,由一对交叉耦合的或非门(NOR Gates)构成。

CPU由寄存器来存储输出数据。由于是中间数据,它们被发送到主存储器(RAM)的速度会慢。这些数据被发送到由总线连接的其它寄存器。寄存器可以存储指令、输出数据、存储地址或任何类型的数据。

存储器(RAM)

RAM - 随机存取存储器是寄存器的集合,它们以优化的方式排列和压缩在一起,以便存储更多的数据。随机存取存储器(RAM)是易失性的,当我们关闭电源时,它存储的数据会丢失。由于RAM是用于读/写数据的寄存器的集合,因此RAM可以用于存储8位地址的输入、用于存储实际数据的数据输入,和用于储存最后的和锁存器一样工作的读写启用码。

3、什么是指令

指令是计算机可以执行的最小粒度运算。CPU可以处理各种类型的指令

指令类型包括:

指令通过以下方式提供给计算机:使用汇编语言直接提供,或由编译器生成,或用某些高级语言解释给出。

这些指令在CPU内部是硬连线的。算术和逻辑运算指令包括在ALU(算术逻辑单元)中,而程序控制指令由CU(控制单元)管理。

通常在一个时钟周期(clock cycle)内,计算机可以执行一个指令,但是现代的计算机可以同时执行多个指令。

计算机可以执行的一组指令称为指令集。另外,Java 系列面试题和答案全部整理好了,微信搜索Java技术栈,在后台发送:面试,可以在线阅读。

4、CPU时钟

时钟周期

计算机的速度由其时钟周期(Clock cycle)衡量。它是指计算机每秒工作的时钟周期数。单个时钟周期非常小,大约250*10^(-12)秒。每秒时钟周期数越高,处理器速度越快。

CPU时钟频率(clock rate)的测量单位为GHz(千兆赫兹)。1Ghz等于10 ⁹Hz(赫兹)。一赫兹意味着一秒钟。所以一千兆赫兹意味着每秒10 ⁹个时钟周期。

时钟周期越小,CPU可以执行的指令数量越多。时钟周期等于时钟频率的倒数,而CPU时间=时钟周期数/时钟频率。分享:Spring Boot 学习笔记

这意味着为了改进(减少)CPU时间,我们可以通过提高时钟频率,或优化我们提供给CPU的指令来减少指令需要的时钟周期的数量。一些处理器提供了提高时钟频率的能力,但由于这是一个物理变化,可能会出现过热,甚至冒烟/起火。

5、指令是如何执行的

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

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

让我们以一组实现两个数字相加操作的指令为例。下面是这些指令及其说明:

第一步 - LOAD_A 8:

该指令最初保存在RAM中,比如说指令<1100 1000>。它的前4位是操作码。这决定了这个指令要做什么。然后该指令被读取到控制单元的指令寄存器(IR)中。指令被译码为load_A,这意味着它需要加载地址1000中的数据,地址1000是存储在寄存器A中的指令的后4位。

第二步 - LOAD_B 2:

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

第三步 – ADD B A

接下来的这条指令是把这两个数字相加。在这里,控制单元(CU)告诉算术逻辑单元(ALU)执行加法操作并将结果保存回寄存器A中。

第4步 – STORE_A 23

将结果保存回寄存器A中。

这是一组非常简单的指令,实现了两个数字的相加操作。

现在,我们成功地得到了两个数字相加的和值!最新 Java 教程和示例源码:https://github.com/javastacks/javastack

总线

CPU,寄存器,存储器和IO设备之间的所有数据都通过总线传输。要将刚才两数相加得到的和数保存到存储器中,CPU将存储器地址放入地址总线,将得到的结果(和数)放入数据总线,然后在控制总线中启用正确的信号。这样,数据在总线的帮助下被保存到存储器中。

计算机系统总线

缓存

CPU还具有将指令预取到其缓存中的机制。我们知道,一个处理器可以在一秒钟内完成数百万条指令。这意味着从存储器(RAM)中获取指令所花费的时间比执行指令所花费的时间要多。所以CPU会预取一些指令和数据到其缓存中,以加快执行速度。

如果缓存中的数据和操作内存中的数据不同,则将数据标记为脏位(dirty bit)。分享:2021 最新 Java 面试题出炉!(带全部答案)

指令流水线

现代CPU在指令执行中采用指令流水线技术实现取指(FI)、译码(DI)、执行(EI)的并行化。当一条指令完成“取指”后进入“译码”的同时,下一条指令就可以进行“取指”了,这样就提高了指令的执行效率。

指令流水线技术

然而,当一条指令和另一条指令有依赖关系时,这种技术会产生问题。所以,指令流水线技术只能够让处理器以不同的顺序执行相互之间没有依赖关系的指令。

多核计算机

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

6、性能

CPU的性能取决于它的执行时间。性能=1/执行时间

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

影响CPU性能的因素是指令执行时间和CPU的时钟速度(时钟频率)。因此,为了提高程序的性能,我们要么提高CPU的时钟速度(时钟频率),要么减少程序中的指令数量。处理器的速度有限,现代多核计算机每秒可以支持数百万条指令。但是,如果我们编写的程序有太多的指令,就将导致整体性能的降低。

大O符号(Big O notation)计算方法可以用来确定在给定输入的情况下CPU的性能将如何受到影响。

为了尽可能地提高CPU的速度,很多优化工作已经在CPU中进行。而我们在编写任何程序时,都需要考虑如何尽可能地减少我们提供给CPU的指令数量,以提高计算机程序的性能。

本文分享自微信公众号 - Java技术栈(javastack),作者:点击关注 ????

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-07-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 几个面试官常问的垃圾回收器,下次面试就拿这篇文章怼回去!

    先瞎比比一下,上一篇文章已经过去2个多月了,你大概会问我这段时间干什么去了,怎么没有更新文章,那我告诉你,当然是面试去了,经过了一个多月的面试,身经百战,已经拿...

    好好学java
  • 面试问你Spring如何解决循环依赖的时候,不要一脸懵逼了

    在关于Spring的面试中,我们经常会被问到一个问题,就是Spring是如何解决循环依赖的问题的。这个问题算是关于Spring的一个高频面试题,因为如果不刻意研...

    IT大咖说
  • 编辑器之神?神的编辑器?对不起给我来打IDE

    程序员的圈子里面,永远有几个话题是经久不衰的,其中随随便便一个话题不论在哪个地方都能轻而易举的引起一场圣战:

    MCU起航
  • 南京渣硕求职路(网易美团头条百度面经)+Java学习路线(拙见)

    首先自我介绍一下,楼主南京渣硕一枚,秋招主要投递JAVA后台岗位,面过以下公司:网易+美团+头条+百度+华为+中兴,拿下了网易和中兴提前批offer,华为依旧泡...

    Java架构技术
  • 腾讯 Web 前端实习面经

    牛客网
  • JDBC这个问题,问的小伙伴一脸懵逼

    他顿时一脸懵逼,因为大部分人只知道JDBC的几个步骤,至于底层到底是怎么连接数据库的,还真不知道。

    田维常
  • 紫涵的Python小课堂---第二讲。python的安装

    其实很多想要学习人工智能方面的小伙伴可以顺道把TensorFlow下了,毕竟TensorFlow是目前很热门的框架了,要是做机器学习的话选择这个框架可以省去你的...

    紫涵
  • 第一次面试且失败的经历

    bgZyy
  • 该如何正确的使用SVG sprites?

        大家好,这里是@IT·平头哥联盟,我是`首席填坑官`——苏南,今天要给大家分享的是SVG sprite(也叫雪碧图),所谓雪碧图,当然就不是我们常喝的雪...

    苏南
  • 由老同事学习SAP所想到的

    前段时间一位老同事在微信上跟我说他们公司正计划导SAP系统,但整个IT中心几乎无人使用过SAP,知道我在这行业干了多年了,所以想问我怎么开始学习。于是我约他今天...

    SAP梦心
  • 一个 1年工作经验的 PHPer是如何被面试官虐的?

    首先需要说明的一点,本人只是一个毕业一年,只有一年工作经验的普通PHPer,能力有限,这篇文章只是将我这几周来的感受和体验分享出来,希望能给许多像我一样,或者互...

    猿哥
  • Redis系列——3.使用Jedis连接Redis

    Hello,小哥哥小姐姐们,我们又见面了。上一篇说了在Linux中如何下载和安装redis,一脸懵逼者请移步,在Linux上下载和安装Redis,但是我们通常用...

    陈琛
  • 若你想入职面试阿里系公司,不妨看看这位资深Java的面试经

    上上周分享了占小狼面试阿里系的面经文章:《一位资深Java的阿里系公司实战面试经验,套路还是面试官的多》 ,蛮受大家欢迎的。看到大家在社群里的好评与点赞,占小狼...

    养码场
  • Android自动化测试+性能监控预警系统搭建

    我们把范围略微缩小点,放在移动端这个环境上,自动化测试是指在预设条件、路径下运行app,运行之后给出一个评估结果,通常会生成一份测试报告,有哪些用例通过,有哪些...

    brzhang
  • 突然就懵了!面试官问我:线程池中多余的线程是如何回收的?

    公众号改版后文章乱序推荐,希望你可以点击上方“Java进阶架构师”,点击右上角,将我们设为★“星标”!这样才不会错过每日进阶架构文章呀。

    java进阶架构师
  • 面试官:如何停止一个正在运行的线程?我一脸蒙蔽...

    停止一个线程意味着在任务处理完任务之前停掉正在做的操作,也就是放弃当前的操作。停止一个线程可以用Thread.stop()方法,但最好不要用它。虽然它确实可以停...

    后端码匠
  • 面试者说-第一篇

    作为一个面试者,我找过工作,也被别人面试过,作为一个面试者,我也面试过很多人,相信这两年开始,很多人都有这样的抱怨,移动端开发者越来越少,一个职位经常要招半年都...

    用户1907613
  • 头条后台面经

    牛客网
  • php为什么要用swoole?

    最近两个月一直在研究 Swoole,那么借助这篇文章,我希望能够把 Swoole 安利给更多人。虽然 Swoole 可能目前定位是一些高级 phper 的玩具,...

    叫我可儿呀

扫码关注云+社区

领取腾讯云代金券