本文转载自inter官方网址:https://software.intel.com/zh-cn/articles/book-Processor-Architecture_CPU_work_process

CPU的工作过程

CPU的基本工作是执行存储的指令序列,即程序。程序的执行过程实际上是不断地取出指令、分析指令、执行指令的过程。

CPU从存放程序的主存储器里取出一条指令,译码并执行这条指令,保存执行结果,紧接着又去取指令,译码,执行指令……,如此周而复始,反复循环,使得计算机能够自动地工作。除非遇到停机指令,否则这个循环将一直进行下去。其过程如图3-3所示

图3-3 程序的执行过程

3.2.1 指令的执行过程

几乎所有的冯•诺伊曼型计算机的CPU,其工作都可以分为5个阶段:取指令、指令译码、执行指令、访存取数和结果写回。如图3-4所示。

图3-4 指令的执行过程

1.取指令阶段

取指令(Instruction Fetch,IF)阶段是将一条指令从主存中取到指令寄存器的过程。

程序计数器PC中的数值,用来指示当前指令在主存中的位置。当一条指令被取出后,PC中的数值将根据指令字长度而自动递增。若为单字长指令,则(PC)+1PC,若为双字长指令,则(PC)+2PC,依此类推。

2.指令译码阶段

取出指令后,计算机立即进入指令译码(Instruction Decode,ID)阶段。

在指令译码阶段,指令译码器按照预定的指令格式,对取回的指令进行拆分和解释,识别和区分出不同的指令类别及各种获取操作数的方法。

在组合逻辑控制的计算机中,指令译码器对不同的指令操作码产生不同的控制电位,以形成不同的微操作序列;在微程序控制的计算机中,指令译码器用指令操作码找到执行该指令的微程序的入口,并从此入口开始执行。

在传统的设计里,CPU中负责指令译码的部分是无法改变的硬件。不过,在众多运用微程序控制技术的新型CPU中,微程序有时是可重写的,可以通过修改成品CPU来改变CPU的译码方式。

3.执行指令阶段

在取指令和指令译码阶段之后,接着进入执行指令(Execute,EX)阶段。

此阶段的任务是完成指令所规定的各种操作,具体实现指令的功能。为此,CPU的不同部分被连接起来,以执行所需的操作。

例如,如果要求完成一个加法运算,算术逻辑单元(ALU)将被连接到一组输入和一组输出,输入端提供需要相加的数值,而输出端将含有最后的运算结果。

4.访存取数阶段

根据指令需要,有可能要访问主存,读取操作数,这样就进入了访存取数(Memory,MEM)阶段。

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

5.结果写回阶段

作为最后一个阶段,结果写回(Writeback,WB)阶段把执行指令阶段的运行结果数据“写回”到某种存储形式。结果数据经常被写到CPU的内部寄存器中,以便被后续的指令快速地存取。在有些情况下,结果数据也可被写入相对较慢、但较廉价且容量较大的主存。许多指令还会改变程序状态字寄存器中标志位的状态,这些标志位标识着不同的操作结果,可被用来影响程序的动作。

在指令执行完毕、结果数据写回之后,若无意外事件(如结果溢出等)发生,计算机就接着从程序计数器PC中取得下一条指令地址,开始新一轮的循环,下一个指令周期将正常地顺序取出下一条指令。

许多新型CPU可以同时取出、译码和执行多条指令,体现出并行处理的特性。

3.2.2 指令周期

1.指令周期的基本概念

(1)指令周期

CPU取出一条指令并执行该指令所需的时间称为指令周期。
指令周期的长短与指令的复杂程度有关。

(2)CPU周期

指令周期常常用若干个CPU周期数来表示。
由于CPU内部的操作速度较快,而CPU访问一次主存所花的时间较长,因此通常用从主存读取一条指令的最短时间来规定CPU周期。
CPU周期也称为机器周期。

(3)时钟周期

一个CPU周期包含有若干个时钟周期。
时钟周期是处理操作的最基本时间单位,由机器的主频决定。
一个CPU周期的时间宽度由若干个时钟周期的总和决定。

图3-5为采用定长CPU周期的指令周期示意图。

图3-5 指令周期

(4)取出和执行任何一条指令所需的最短时间为两个CPU周期。

任何一条指令,它的指令周期至少需要两个CPU周期,而复杂指令的指令周期则需要更多的CPU周期。这是因为,一条指令的取出阶段需要一个CPU周期时间,而一条指令的执行阶段则需要至少一个CPU周期时间。由于不同复杂度指令的执行周期所需的CPU周期数不尽相等,因此,各种指令的指令周期也是不尽相同的。

例题3-1:现有一个由5条典型指令组成的程序(如表3-1所示),请分析每一条指令的指令周期。

表3-1 一个由5条典型指令组成的程序

主存储器
操作说明
地址
指令或数据内容
 
020
CLA
0→AC,累加器AC清零
021
ADD 30
(AC)+(30)AC,累加器AC的值与主存地址30中的数据相加,结果存入累加器AC
022
STA 40
(AC)40,把累加器AC的值存入主存地址40
023
NOP
空操作,没有任何功能
024
JMP 21
无条件转移到主存地址21处开始执行
 
030
 
操作数
 
040
 
存放运算结果
 

【解】

①CLA指令

CLA指令是一条不访问主存的清零指令,它需要2个CPU周期,其中取指令阶段需要1个CPU周期,执行指令阶段需要1个CPU周期。

图3-6 CLA指令周期

在第1个CPU周期,即取指令阶段,CPU从主存取出指令,对程序计数器PC加1,并对指令操作码进行译码,以确定执行何种操作;

在第2个CPU周期,即执行指令阶段,CPU完成指令所要求的操作。

②ADD 30指令

ADD 30指令是一条访问主存取数并执行加法的指令,其指令周期由3个CPU周期组成,其中取指令阶段需要1个CPU周期,执行指令阶段需要2个CPU周期。

图3-7 ADD 30指令周期

在第1个CPU周期,即取指令阶段,CPU从主存取出指令并译码,以确定执行何种操作;

执行指令阶段由2个CPU周期组成,其中在第2个CPU周期,CPU将指令的地址码(操作数地址)部分(30)送往地址寄存器,并完成地址译码,而在第3个CPU周期,CPU从主存取出操作数,并执行加法操作。

③STA 40指令

STA 40指令是一条访问主存的存数指令,其指令周期由3个CPU周期组成,其中取指令阶段需要1个CPU周期,执行指令阶段需要2个CPU周期。

图3-8 STA 40指令周期

在第1个CPU周期,即取指令阶段,CPU从主存取出指令并译码,以确定执行何种操作;

执行指令阶段由2个CPU周期组成,其中在第2个CPU周期,CPU将指令的地址码(操作数地址)部分(40)送往地址寄存器,并完成地址译码,而在第3个CPU周期,CPU把累加寄存器的内容写入主存单元(40)中。

④NOP指令

NOP指令是一条空操作指令,没有任何功能,相当于CPU空转,但仍需要2个CPU周期,其中取指令阶段需要1个CPU周期,执行指令阶段需要1个CPU周期。(指令周期图与图3-6 CLA指令相同)

在第1个CPU周期,即取指令阶段,CPU从主存取出指令并译码,以确定执行何种操作;

在第2个CPU周期,即执行指令阶段,操作控制器不发出任何控制信号,CPU不做任何操作。

⑤JMP 21指令

JMP 21指令是一条直接寻址的程序控制(转移)指令,由2个CPU周期组成,其中取指令阶段需要1个CPU周期,执行指令阶段需要1个CPU周期。

图3-9 JMP 21指令周期

在第1个CPU周期,即取指令阶段,CPU从主存取出指令并译码,以确定执行何种操作;

在第2个CPU周期,即执行指令阶段,CPU把指令的地址码(转移地址)部分(21)送到程序计数器PC中,从而改变程序的执行顺序,实现程序的无条件转移。

2.用指令流程图表示指令周期

在进行计算机设计时,可以像画程序流程图那样,采用指令流程图来表示一条指令的指令周期。

在指令流程图中,

方框:代表一个操作步骤,方框中的内容表示数据通路的操作或某种控制操作。

菱形框:通常用来表示某种判别或测试,其动作依附于它前面的一个方框。

公操作符号“~”:表示一条指令已经执行完毕,转入公操作。所谓公操作,就是一条指令执行完毕后,CPU所开始进行的一些操作,这些操作主要是CPU对外设请求的处理。如果外设没有向CPU请求交换数据,那么CPU又转向主存取下一条指令。

例题3-2:对于例题3-1中由5条典型指令组成的程序,请用指令流程图表示其指令周期。

【解】

图3-10 用指令流程图表示指令周期

由图3-10可见,所有指令的取指阶段是完全相同的,而且是一个CPU周期。

但是指令的执行阶段,由于各条指令的功能不同,所用的CPU周期是各不相同的。其中,CLA、NOP、JMP指令是一个CPU周期,ADD、STA指令是两个CPU周期。

一般指令流程图有一个公共的流程段和许多并列的分支。公共流程段是取指令操作的流程序列。取指令操作是每条指令共同的操作步骤,而且所有的指令读取步骤是相同的,所以所有读指令的操作流程是相同的。执行指令阶段的操作是各指令互不相同的操作,所以在取指令阶段之后,流程就根据指令分成许多分支,通常为每种指令都安排一个分支流程。

例题3-3:如图3-11所示为双总线结构机器的数据通路,IR为指令寄存器,PC为程序计数器(具有自增功能),M为主存(受R/W信号控制),AR为主存地址寄存器,DR为数据寄存器,ALU由+、-控制信号决定完成何种操作,控制信号G控制的是一个门电路。另外,线上标注有控制信号,例如Yi表示Y寄存器的输入控制信号,R1o为寄存器R1的输出控制信号,未标字符的线为直通线,不受控制。

“ADD R2,R0”指令完成(R0)+(R2)→R0的功能操作,试画出其指令周期流程图(假设该指令的地址已放入PC中),并列出相应的微操作控制信号序列。

图3-11 双总线结构机器的数据通路

【解】

“ADD R2,R0”指令是一条加法指令,参与运算的两个数放在寄存器R2和R0中,指令周期流程图包括取指令阶段和执行指令阶段两部分。根据给定的数据通路图,“ADD R2,R0”指令的详细指令周期流程图如图3-12所示,图的右边部分标注了每一个机器周期中用到的微操作控制信号序列。

图3-12 “ADD R2,R0”指令的详细指令周期流程图

3.2.3 时序发生器

1.时序信号

在计算机高速运行的过程中,计算机内各部件的每一个动作都必须严格遵守时间规定,不能有任何差错。

计算机内各部件的协调动作需要时间标志,而时间标志则是用时序信号来体现的。

计算机各部分工作所需的时序信号,在CPU中统一由时序发生器来产生。

例题3-4:用二进制码表示的指令和数据都放在主存里,那么CPU是怎样识别出它们是数据还是指令呢?

【解】

从时间上来说,取指令事件发生在指令周期的第一个CPU周期中,即发生在“取指令”阶段,而取数据事件发生在指令周期的后面几个CPU周期中,即发生在“执行指令”阶段。

从空间上来说,如果取出的代码是指令,那么一定送往指令寄存器,如果取出的代码是数据,那么一定送往运算器。

2.时序发生器

CPU中的时序信号发生器,其功能是用逻辑电路来发出时序信号,实现时序控制,使计算机可以准确、迅速、有条不紊地工作。

时序信号发生器是产生指令周期控制时序信号的部件,当CPU开始取指令并执行指令时,操作控制器利用时序信号发生器产生的定时脉冲的顺序和不同的脉冲间隔,提供计算机各部分工作时所需的各种微操作定时控制信号,有条理、有节奏地指挥机器各个部件按规定时间动作。

从操作控制器设计方法而言,组合逻辑控制器的时序电路比较复杂,而微程序控制器的时序电路则比较简单。

3.2.4 控制方式

控制器控制一条指令运行的过程是依次执行一个确定的操作序列的过程。

为了使机器能够正确执行指令,控制器必须能够按正确的时序产生操作控制信号。

控制不同操作序列的时序信号的方法,称为控制器的控制方式。

控制方式通常分为三种:同步控制方式、异步控制方式、联合控制方式,其实质反映了时序信号的定时方式。

1.同步控制方式

同步控制方式是指操作序列中每一步操作的执行,都由确定的具有基准时标的时序信号来控制,其特点是系统有一个统一的时钟,所有的控制信号均来自这个统一的时钟信号。

在同步控制方式中,在任何情况下,给定的指令在执行时所需的CPU周期数和时钟周期数都是固定不变的。

同步控制方式有时又称为固定时序控制方式或无应答控制方式。

根据不同情况,同步控制方式可选取以下几种方案:

  1. 采用完全统一的机器周期执行各种不同的指令。显然,对简单指令和简单的操作而言,这将造成时间上的浪费。
  2. 采用不定长机器周期。将大多数操作安排在一个较短的机器周期内完成,而对于某些时间紧张的操作,则采取延长机器周期的办法来加以解决。
  3. 中央控制与局部控制结合。将大部分指令安排在固定的机器周期完成(称为中央控制),而对于少数复杂指令(乘、除、浮点运算)则采用另外的时序进行定时(称为局部控制)。

同步控制方式设计简单,操作控制容易实现。

2.异步控制方式

异步控制方式是一种按每条指令、每个操作的实际需要而占用时间的控制方式,不同指令所占用的时间完全根据需要来决定。

在异步控制方式中,每条指令的指令周期既可由数量不等的机器周期数组成,也可由执行部件完成CPU要求的操作后发回控制器的应答信号来决定。也就是说,CPU访问的每个操作控制信号的时间由其需要占用的时间来决定,每条指令、每个操作控制信号需要多少时间就占用多少时间。

显然,用这种方式形成的操作控制序列没有固定的CPU周期数和严格的时钟周期与之同步,所以称为异步方式。

异步控制方式有时又称为可变时序控制方式或应答控制方式。

在异步控制方式下,指令的运行效率高,但控制线路的硬件实现比较复杂。

异步控制方式在计算机中得到了广泛的应用。例如CPU对主存的读写、I/O设备与主存的数据交换等一般都采用异步控制方式,以保证执行时的高速度。

3.联合控制方式

现代计算机系统中一般采用的方式是同步控制和异步控制相结合的方式,即联合控制方式。

联合控制方式的设计思想是:在功能部件内部采用同步控制方式,而在功能部件之间采用异步控制方式,并且在硬件实现允许的情况下,尽可能多地采用异步控制方式。

联合控制方式通常选取以下两种方案:

    1. 大部分操作序列安排在固定的机器周期中,对某些时间难以确定的操作则以执行部件的应答信号作为本次操作的结束;
    2. 机器周期的时钟周期数固定,但是各条指令周期的机器周期数不固定。

《CPU的工作过程》的更多相关文章

  1. 简单物联网:外网访问内网路由器下树莓派Flask服务器

    最近做一个小东西,大概过程就是想在教室,宿舍控制实验室的一些设备. 已经在树莓上搭了一个轻量的flask服务器,在实验室的路由器下,任何设备都是可以访问的:但是有一些限制条件,比如我想在宿舍控制我种花 ...

  2. 利用ssh反向代理以及autossh实现从外网连接内网服务器

    前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后平时在实验室这边直接连接是没有问题的,都是内网嘛.但是回到宿舍问题出来了,使用校园网的童鞋还是能连接上,使 ...

  3. 外网访问内网Docker容器

    外网访问内网Docker容器 本地安装了Docker容器,只能在局域网内访问,怎样从外网也能访问本地Docker容器? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Docker容器 ...

  4. 外网访问内网SpringBoot

    外网访问内网SpringBoot 本地安装了SpringBoot,只能在局域网内访问,怎样从外网也能访问本地SpringBoot? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装Java 1 ...

  5. 外网访问内网Elasticsearch WEB

    外网访问内网Elasticsearch WEB 本地安装了Elasticsearch,只能在局域网内访问其WEB,怎样从外网也能访问本地Elasticsearch? 本文将介绍具体的实现步骤. 1. ...

  6. 怎样从外网访问内网Rails

    外网访问内网Rails 本地安装了Rails,只能在局域网内访问,怎样从外网也能访问本地Rails? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Rails 默认安装的Rails端口 ...

  7. 怎样从外网访问内网Memcached数据库

    外网访问内网Memcached数据库 本地安装了Memcached数据库,只能在局域网内访问,怎样从外网也能访问本地Memcached数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装 ...

  8. 怎样从外网访问内网CouchDB数据库

    外网访问内网CouchDB数据库 本地安装了CouchDB数据库,只能在局域网内访问,怎样从外网也能访问本地CouchDB数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Cou ...

  9. 怎样从外网访问内网DB2数据库

    外网访问内网DB2数据库 本地安装了DB2数据库,只能在局域网内访问,怎样从外网也能访问本地DB2数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动DB2数据库 默认安装的DB2 ...

  10. 怎样从外网访问内网OpenLDAP数据库

    外网访问内网OpenLDAP数据库 本地安装了OpenLDAP数据库,只能在局域网内访问,怎样从外网也能访问本地OpenLDAP数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动 ...

随机推荐

  1. Linux CentOS 配置Tomcat环境

    一.下载Tomcat 下载Tomcat方式也有两种,可以参考我的前一篇博文Linux CentOS配置JDK环境,这边就不再赘述. 二.在Linux处理Tomcat包 1.创建tomcat文件夹 mk ...

  2. Kotlin的Lambda表达式以及它们怎样简化Android开发(KAD 07)

    作者:Antonio Leiva 时间:Jan 5, 2017 原文链接:https://antonioleiva.com/lambdas-kotlin/ 由于Lambda表达式允许更简单的方式建模式 ...

  3. nodejs进阶(5)—接收请求参数

    1. get请求参数接收 我们简单举一个需要接收参数的例子 如果有个查找功能,查找关键词需要从url里接收,http://localhost:8000/search?keyword=地球.通过前面的进 ...

  4. 窥探Vue.js 2.0 - Virtual DOM到底是个什么鬼?

    引言 你可能听说在Vue.js 2.0已经发布,并且在其中新添加如了一些新功能.其中一个功能就是"Virtual DOM". Virtual DOM是什么 在之前,React和Em ...

  5. ASP.NET Core框架揭秘(持续更新中…)

    之前写了一系列关于.NET Core/ASP.NET Core的文章,但是大都是针对RC版本.到了正式的RTM,很多地方都发生了改变,所以我会将之前发布的文章针对正式版本的.NET Core 1.0进 ...

  6. 前端开发:面向对象与javascript中的面向对象实现(二)构造函数与原型

    前端开发:面向对象与javascript中的面向对象实现(二)构造函数与原型 前言(题外话): 有人说拖延症是一个绝症,哎呀治不好了.先不说这是一个每个人都多多少少会有的,也不管它究竟对生活有多么大的 ...

  7. SQLServer如何添加try catch

    在.net中我们经常用到try catch.不过在sqlserver中我们也可以使用try catch捕捉错误,在这里把语法记录下来和大家分享一下, --构建存储过程CREATE PROCEDURE ...

  8. Linux监控工具介绍系列——vmstat

      说来惭愧,玩Linux这么久了,居然没有玩转vmstat这个命令,对很多指标的具体意义都有点模糊不清,花了点时间好好学习.整理一下这个命令的相关资料.因为这个命令确实比较重要,而且频繁用到. 命令 ...

  9. linux下配置matlab运行环境(MCR)

    在安装好的matlab下有MCR(MatlabCompilerRuntime)在matlab2011/toolbox/compiler/deploy/glnxa64下找到MCRInstaller.zi ...

  10. Harmonic Number(调和级数+欧拉常数)

    题意:求f(n)=1/1+1/2+1/3+1/4-1/n   (1 ≤ n ≤ 108).,精确到10-8    (原题在文末) 知识点:      调和级数(即f(n))至今没有一个完全正确的公式, ...