一 、CPU+内存 工作的流程
还是得先讲一下计算机组成原理的第一章: cpu+内存 工作的流程
NOTE:现代计算机CPU已经集成MAR、MDR
--------------------------------------------------------------
整个过程主要分为三个步骤:1.取指令,2.分析指令、3.执行指令
程序中的第一条指令位于PC(process count)程序计数器,根据pc取出第一条指令,经过移码,执行步骤等,控制计算机个功能部件协同运行,完成这条指令的功能,并计算下一条指令的地址。用得到的指令地址继续读出第二条指令并执行,知道程序结束为止。
===============================
1. 取指令:PC->MAR->M->MDR->IR
根据PC取到指令到IR。
(1)将PC中的送MAR
(2)MAR中的内容直接送地址线,同时控制器将读信号送读写信号线,
(主存的操作:主存根据地址线上的地址的读信号,从指定存储单元读出指令,送到数据线上)
(3)MDR从数据线接受指令信息
(4)并传送到IR中
2. 分析指令: OP(IR) ->CU
(5)指令译码并送出控制信号。控制器根据IR中指令的操作码,生成相应的控制信号,送到不同的执行部件。
3.执行指令:IR->MAR->M->MDR->ACC
取数操作。
(6)将IR中指令的地址码送MAR
(7)MAR中的内容送地址线,同时控制器将读信号送读/写信号线,从主存指定存储单元读出操作数
(8)存储通过数据线送至MDR
(9)再传送至ACC中。
over
========================
此外,每取完一条指令,还必须为取下一条指令做准备,形成一条指令的地址,即(PC) + 1 -> PC
二、CPU组件介绍
1. CPU(Central Processing Unit,中央处理器)
这是这台计算机的大脑,所有的设备都围绕它展开。包括三个部分,运算单元、数据单元和控制单元:
运算单元只管算,例如做加法、做位移等等。但是,它不知道应该算哪些数据,运算结果应该放在哪里。运算单元计算的数据如果每次都要经过总线,到内存里面现拿,这样就太慢了,所以就有了数据单元。
数据单元包括 CPU 内部的缓存和寄存器组,空间很小,但是速度飞快,可以暂时存放数据和运算结果。有了放数据的地方,也有了算的地方,还需要有个指挥到底做什么运算的地方,这就是控制单元。
控制单元是一个统一的指挥中心,它可以获得下一条指令,然后执行这条指令。这个指令会指导运算单元取出数据单元中的某几个数据,计算出个结果,然后放在数据单元的某个地方。
三、总线
总线分三种:地址总线、数据总线、控制总线
CPU 和其他设备连接,要靠一种叫作总线(Bus)的东西,其实就是主板上密密麻麻的集成电路,这些东西组成了 CPU 和其他设备的高速通道。
当然总线上还有一些其他设备,例如显卡会连接显示器、磁盘控制器会连接硬盘、USB 控制器会连接键盘和鼠标等等。
四、内存
在这些设备中,最重要的是内存(Memory)。因为单靠 CPU 是没办法完成计算任务的,很多复杂的计算任务都需要将中间结果保存下来,然后基于中间结果进行进一步的计算。CPU 本身没办法保存这么多中间结果,这就要依赖内存了。
架构图:
五、CPU处理详情:
我们将软件安装在硬盘上,是二进制的,里面就是一行行的指令,会操作一些数据。
程序中包含进程,进程一旦运行,比如图中两个进程 A 和 B,会有独立的内存空间,互相隔离,程序会分别加载到进程 A 和进程 B 的内存空间里面,形成各自的代码段。
当然真实情况要复杂的多,进程的内存虽然隔离但不连续,除了简单的区分代码段和数据段,还会分得更细。
程序运行的过程中要操作的数据和产生的计算结果,都会放在数据段里面。
==============================
1.执行过程:(参考第一节)
那 CPU 怎么执行这些程序,操作这些数据,产生一些结果,并写入回内存呢?
CPU 的控制单元里面,有一个指令指针寄存器,它里面存放的是下一条指令在内存中的地址。
控制单元会不停地将代码段的指令拿进来,先放入指令寄存器。
当前的指令分两部分,一部分是做什么操作,例如是加法还是位移;一部分是操作哪些数据。
要执行这条指令,就要把第一部分交给运算单元,第二部分交给数据单元。
数据单元根据数据的地址,从数据段里读到数据寄存器里,就可以参与运算了。
运算单元做完运算,产生的结果会暂存在数据单元的数据寄存器里。
最终,会有指令将数据写回内存中的数据段。
========================
2.进程切换相关概念
你可能会问,上面算来算去执行的都是进程 A 里的指令,那进程 B 呢?
CPU 里有两个寄存器,专门保存当前处理进程的代码段的起始地址,以及数据段的起始地址。
这里面写的都是进程 A,那当前执行的就是进程 A 的指令,等切换成进程 B,就会执行 B 的指令了,这个过程叫作进程切换(Process Switch)。
六、总线详细介绍
到这里,你会发现,CPU 和内存来来回回传数据,靠的都是总线。其实总线上主要有两类数据,一个是地址数据,也就是我想拿内存中哪个位置的数据,这类总线叫地址总线(Address Bus);另一类是真正的数据,这类总线叫数据总线(Data Bus)。
所以说,总线其实有点像连接 CPU 和内存这两个设备的高速公路,说总线到底是多少位,就类似说高速公路有几个车道。但是这两种总线的位数意义是不同的。地址总线的位数,决定了能访问的地址范围到底有多广。例如只有两位,那 CPU 就只能认 00,01,10,11 四个位置,超过四个位置,就区分不出来了。位数越多,能够访问的位置就越多,能管理的内存的
=======================
为什么32位操作系统只支持4GB的内存空间
因为32位操作系统的地址总线只有32根,能寻址的字节数位 2^30 * 2^2 = 4GB
-----------------
而MAR是寻址内存单元的,内存单元的大小 = 存储字长
内存的大小 = 内存管理单元的个数 * 存储字长
NOTE:图片中有一处错,“数据总线是以字节为单位传输的”, 这里的数据总线应为 “地址总线”!!!
====================
over