图解计算机6大系统结构+主板拆解分析(思维导图+实物图)
依托于“计算电磁学”的发展,电磁CAE技术已经深刻的改变了硬件设计流程,但是仅仅依赖于CAE商用软件的仿真计算以及设计师的手动调参或者相对低层次的自动扫参功能,越来越难以支撑起卓越的硬件设计。学习和掌握最前沿的设计理念、优化策略,依靠扎实的数理基础将问题转化为数理模型,并依托坚实的编程素养将定性的设计理念数字化、程序化,深度嵌入硬件的设计阶段,会否给硬件设计带来更多可能?底层认知
一、什么是计算机系统
计算机是迄今为止最为复杂的一个系统之一,其作用在于按照确定的顺序完成认类预设好的指令,而这些预设好的指令就是我们所熟知的程序。
所谓复杂系统,一方面因为其构成元素的晶体管数量十分巨大,一颗指甲盖大小的CPU核心就包含数以亿级的晶体管,另一方面在于其功能十分强大,简单的堆数量并不能成就强大的系统,计算机系统的强大源于其将海量的晶体管进行互连、按照严密的组织规则让其分工、协作,从而实现了远超个体能力的复杂功能。这与细胞-器官-智慧生命的实现逻辑一致。”计算机系统“正是这个复杂系统的搭建过程以及工作机理:1)硬件层面,晶体管-计算机组件-功能完善的计算机;2)软件层面,0/1二进制-信息的表示与处理-指令系统。
二、计算机的基本组成
现在我们自顶而下开始简单认识一下计算机硬件系统的具体组成。计算机硬件系统的基本组成包括两个部分:1)主机(计算机核心部分);2)I/O设备(键盘、鼠标、显示器、光驱等)。其中主机由CPU和主存组成,CPU则主要包括运算器(执行逻辑、算术运算)和控制器(指挥程序的运行),主存用以存放程序和数据。
打开任意笔记本的销售页面,配置参数表均介绍了该计算机的主要性能参数,其中最主要的参数正是:1)CPU型号;2)内存(即主存)容量;3)硬盘容量(即辅存容量)。
CPU的主要功能就是执行指令,结构组成主要包括运算器和控制器,各组件的功能为:
运算器:就像是搬砖的,主要工作就是埋头执行各种算数运算和逻辑运算,主要组成有:1)算术逻辑单元:用以执行各种算术和逻辑运算;2)通用寄存器,用以存放待运算的操作数;3)累加器,用以存放操作数和运算结果;4)乘商寄存器,用以辅助乘商计算。
控制器:就像是工头,主要工作就是指挥运算器执行各种指令,主要组成有:1)控制单元:分析指令,给出控制信号;2)指令寄存器:用以存放待执行指令;3)程序计数器:用以存放下一条指令的地址。
主存储器就是一个临时货柜,用以存放待运行程序翻译而成的各种指令(数据),组成包括三个部分:1)存储体,其如同货柜一样存放着海量的程序或数据;2)MAR,地址寄存器,临时存放待取程序或数据的地址(如同取件码);3)MDR,数据寄存器,临时存放待取程序或数据(就如同待取包裹)。
三、计算机的组织形式
复杂、庞大的系统想要运行有序,就必须要一套科学合理的组织架构保驾护航,就如同大公司的组织架构,计算机各部组件相互之间分工协作需要通过计算机硬件架构来进行保障。计算机硬件的组织形式主要分为两种:1)冯-诺伊曼结构;2)现代计算机结构。
冯-诺伊曼结构
计算机科学家冯-诺依曼确立了现代计算的基本组成以及组织架构,即“冯-诺依曼结构”,结构组成包括运算器、控制器、存储器、输入设备以及输出设备五大部分,组织结构如下图所示,结构特点是以CPU为中心的组织形式,所有数据流动、程序运行以及结果输出均由CPU执行和居中协调。
如果将计算机比作一个公司的话,五大部件大抵可以做如下类比,运算器就如同生产部门,存储器就如同仓储部门,所有的采购原材料以及加工好产品的产品都需要经过生产部门,再送达仓储部门等相关部门,这显然让生产部门做了很多职责范围外的活,降低了生产效率。因此现代计算机结构对五大部件的组织形式进行了优化,那便是“现代计算机结构”。
现代计算机结构
现代计算机结构以存储器为核心,所有输入的数据/程序以及输出的计算结果,均先存入存储器,然后在被送往CPU进行执行或送至输出设备。现代计算机结构有效的为CPU减负,让CPU更加专注的进行指令执行,大幅提高了效率。
四、计算机的运行过程
以上,我们就基本完成了一个计算机硬件系统的搭建,那么这个系统是如何工作的,各部组件之间又是如何分工协作,确保预先设置的指令畅通无阻的运行的。
过程大致是这样的:当你打开手机上的某个APP时,后台其实是用高级语言编写的代码在运行,这些代码经过一个叫编译器的东西翻译成计算机硬件认识的机器语言(一行行二进制代码),然后经由I/O装入主存的存储体中。
当以机器语言表示的指令和数据装入主存后,CPU就开始访问主存提取指令并开始执行,具体过程如下所示:
step1:程序计数器PC指向当前指令地址#01,并将地址送至主存的地址寄存器MAR;
step2:存储体根据MAR的取件码,将对应位置的数据发给数据寄存器MDR;
step3:MDR将指令发给控制器的指令寄存器IR,进行指令分析;
step4:IR将指令的操作码发给控制单元CU,将地址码发MAR,CU依据操作码通知运算器要进行何种操作;
step5:存储体根据MAR的取件码,将#04地址对应的数据经由MDR传给运算器的ACC进行运算。
如此这般,就大致了解了计算机的各硬件是如何协作,确保程序顺利运行的。
深入理解
入门之后,该部分将从“软件”和“硬件”两个方面,正式深入计算机各分系统,介绍它们的结构组成、工作机理。
一、信息的表示与处理
二进制是信息科学的基础,就如同晶体管是计算机硬件系统的基础。现代计算机存储和处理以二值信号表示的信息。这些普通的二进制数字,或者位(bit),形成了数字革命的基础。
我们熟悉的数学理论是建立在关于十进制的信息表示和处理的理论基础之上的,但是十进制的每一个位状态包含10种(0~9),状态过多,不利于工程实现,然而二进制的一个位状态只包含两种(0,1),存储和处理信息的机器时,二进制值工作得更好。二值信号能够很容易地表示、存储和传输,例如,可以表示为穿孔卡片上有洞或无洞、导线上的高电压或低电压,或者磁场引起的顺时针或逆时针。
本章主要分为三部分内容:1)信息存储,主要介绍关于二进制理论基础的一些基本概念;2)整数的表示与计算,介绍利用无符号数和二进制补码对整数进行表示和运算的理论基础;3)浮点数的表示与运算,介绍利用二进制版本的科学记数法表示实数的方法及其相关运算性质。
1.信息存储1.1 进位计数制
我们生活的现实世界是建立在十进制基础之上的,而计算机硬件却只能读懂0/1二进制语言,两个世界要建立紧密的联系就离不开各种进制之间的转换。最常见的就是十进制、二进制、8进制以及16进制之间的相互转化。其中十进制、8进制以16进制与二进制之间相互转化方式如下,十进制、8进制以及16进制三者之间的相互转化可以通过二进制中转实现。
1.2 字
大多数计算机使用8位的块,或者叫做字节,来作为最小的可寻址的存储单位,而不是对存储器中的每一个位(bit)进行访问,存储器的存储体可以被视为一个非常大的字节数组,称之为虚拟存储器的每一个字都有一个“门牌号”,即为地址。所有地址组成的集合为虚拟内存地址空间,空间的大小就是计算机的字长,如32位计算机,虚拟地址的空间限制为4GB,64位就是8GB。
1.3 数据大小
常用的数据类型有这么几种,字符型、整数型以及浮点型,其中字符型一般用来存储字符串中的单个字符,整数型则用来存储各种长度的整数,浮点型则是用来存储不同精度的浮点数。
1.4 寻址和字节顺序
如果一个数据跨越多个存储字节,那么就必须要对数据的存放顺序进行规定,几乎所有机器,多字节对象都被储存在连续的字节序列中。对表示一个对象的字节序列排序,由两种通用的规则:1)大端模式;2)小端模式。
如图所示,在地址#1~#4所指向的内存中,存储16进制数据01234567H,其中“01”表示数据的高有效位(8bit),“67”表示数据的低有效位,则将高有效位放在前面为大端模式;将高有效位放在后面为小端模式。
1.5 字符串
字符串是由一个个字符组成的,而在计算机中,每一个字符与“0/1”建立联系是通过ASCII编码(8bit)的方式来实现的,其中ASCII值为16进制表示。
1.6 常见运算
位级运算
所谓位运算,即以二进制表示的数据的每一位可以作为一个个体进行相应的布尔运算,主要运算为与&、或|、非~以及异或^,可以参与位运算的数据类型为任意“整型”(如char、int、short int、long int和unsigned int)。
逻辑运算
逻辑运算(或||、与&&、非!)的运算性质与位级运算显著不同,功能也完全不同,逻辑运算认为所有的非零数据均为TRUE,而数据零为FALSE,运算的结果为1或0,代表TRUE或FALSE。
移位运算
移位运算,以向左或者向右移动位模式。左移表示为x<>k,但是右移的具体操作则份两种情况:1)逻辑右移为高位补0;2)算术右移为高位补最高有效位,具体操作如下图所示。对于无符号数据,右移必须为逻辑的,对于有符号数据,几乎所有的机器都默认算术移位。
2.整数的表示与运算
本节将介绍整数的两种表示方式,一种只能表示非负数,另一种则能够表示负数、零和正数。其数学属性与后续的机器级实现有很强的关联。2.1 整型数据类型
2.2 无符号数与二进制补码
所谓无符号数,就是没有“+/-”号的数,其只能表示非负数,其二进制编码表示与真值之间的映射关系为:
即w位的无符号二进制编码,其真值可以上述公式进行计算,其建立了二进制编码(类似w维向量)与真值(类似w维向量的模)的一一映射的关系,公式看似复杂,其实就是前面二进制转十进制所用到的幂乘求和法。
对于有符号数(即包含“+/-”号),则需要给符号位编码,以区分正负数。具体执行有两种方案:
原码(S)表示,将最高有效位作为符号位,其真值计算可表示为B2S,由下图可知,最高有效位(符号位)决定了真值的正负,其他位仅决定绝对值的大小;
补码(T)表示,将最高有效位定义为负权,其真值的计算可以表示为B2T,由下图可知,其真值结果表示为负数+正数,其中负数有无取决于最高有效位(负权位),而正数的大小则取决于其他位。
需要说明的是,原码在表示有符号数的时候存在一些先天缺陷,如下图所示:+5和-5的原码定义下的二进制表示相加后结果为-10,显然与实际不相符,而使用补码定义,则计算结果为0,与实际吻合。因此,有符号数的表示绝大部分情况下都是用补码方案。
不同类型的数据的二进制表示以及其真值的计算方法如下图所示,其中有符号数的反码定义为原码到补码转换的过渡形式,实际没什么作用。
2.3 有符号数与无符号数之间的转化
所谓有符号数和无符号数的转化,其实并没有改变二进制的位表示,只是因为二进制数每一个“位”的解释因为有符号数和无符号数的定义的不同而不同,从而导致二进制数所表示的真值发生变化。
从二进制补码到无符号数的转换,通过公式和图示,分别如下图所示:
从无符号数转换到二进制补码,则正好反过来,公式和图示分别如图所示:
2.4 数字的扩展与截断
常见的运算比如不同字长的整数之间进行转换,字长短的二进制数转换至字长长的二进制数,则需要扩展位,字长长的数转换至字长短的数,则需要进行截断。
二进制补码和无符号数的扩展的方式也有所不同:1)无符号数的扩展为高位补0;2)二进制补码的扩展则是高位补最高有效位。这种扩展规则的制定,是保证扩展前后的二进制所表示的真值没有发生变化。
截断会改变二进制所表示的真值,对于无符号数字x,截断它到k位的结果就相当于计算mod(即真值对取模),总之无符号数和二进制补码的截断结果可以分别表示为如下形式:2.5 整数运算
整数的运算主要围绕无符号数和二进制补码展开的,常用的运算主要有:1)加法运算;2)非运算;3)乘法运算;4)乘以2的幂运算;5)除以2的幂运算。
对于加法运算,我们通常关心计算结果有无溢出的情况,对于无符号数和二进制补码,其加法计算结果如下所示:
对于乘法运算,我们可以看到,无论是无符号数亦或是二进制补码运算,乘法运算都可等效的通过“位”截断来实现,无需添加专门的乘法器即可实现,体现出了极大的便利性。其中无符号数和二进制补码的乘法运算结果分别如下所示:
对于乘以2的幂和除以2的幂运算,计算过程可以通过移位运算来实现,从而大幅提高了运算便利性。其中:1)乘以,无论对于无符号数还是二进制补码,可以通过左移k位来等效实现;2)除以,对于无符号数还是二进制补码,则是通过算术右移k等效实现(其中无符号数高位补0,二进制补码高位补最高位)。
3.浮点数的表示和运算3.1 浮点数表示
浮点数表示形式为-的有理数进行编码。其中s为符号位(1位,只有两种状态0/1,表示+/-),M为有效数(n位,),E为指数(k位,--),对于二进制表示,仅需要对这三个数进行编码即可。对于单精度浮点格式(float,32位),k=8,n=23;对于双精度格式(double,64位),k=11,n=52。已知浮点数的二进制编码表示,求解浮点数的真值,计算结果如下。
需要说明的是:针对指数的编码是否为全0/1,浮点数编码对应的真值存在两种计算方法:
指数编码既不是全0也不是全1时,此时浮点数为规格化值,其中指数域-,e为无符号数,位表示为--,--;小数域,其中--;
当指数编码全为0时,浮点数为非规格化值,此时-,;
当指数编码全为1时,浮点数为特殊值,当小数域为全为0时,表示无穷,s=0,为;s=1,为-;当小数域非0时,为NaN。
3.2 浮点数运算
浮点数的加法运算,不同于整数的加法运算性质,缺失了很多属性(比如不满足结合律和分配律),这里就不再赘述。4.小结
“十进制”是现代所有和“数字”相关理论的基础,其是我们表征世界最熟悉的一种“方式”,而作为信息世界的基础,“二进制”则提供了另外一种“方式”,因此建立两种“方式”的联系必不可少(进制转化),同时需要基于“二进制”,来表征各种数字(无符号数、有符号数、定点数、浮点数等)并阐明各类数学运算的性质,而这些就是第一章所要介绍的全部。
二、存储系统
存储系统就如同计算机系统中的“仓库”,用于存放程序、指令、数据等各类信息,将分为三个部分展开:1)什么是“存储系统”,介绍存储器的抽象模型以及基于存取速度梯度而成的层次结构;2)为什么称之为“系统”,介绍纷繁多样的存储技术,并基于“局部性原理”的存储系统的金字塔结构;3)“存储系统”如何运行,重点介绍存储系统结构组成以及其中最为重要的“主存”和“高速缓存”,阐述它们是如何与CPU协调共事,顺利完成数据存取。
1.什么是“存储系统”
1.1 抽象层面的认识
如上图所示,到目前为止,在我们对计算机系统的研究中,我们依赖于一个简单的计算机系统模型,CPU执行指令,而存储器为CPU存放指令和数据。在这个简单模型中,存储器系统是一个线性的字节数组,而CPU能够在一个常数时间内访问每个存储器位置。再具体一点,就如下图所示,其包含一个存储体(用以存放数据),然后就是两个接口(地址接口,数据接口),虽然至今为止这都是一个有效的具体模型,但是它没有反映现代系统实际工作的方式。
1.2 层次结构
实际上,存储器系统(memory system)是一个具有不同容量、成本和访问时间的存储(storage)设备的层次结构。CPU寄存器保存着最常用的数据。靠近CPU的小的、快速的高速缓存存储器(cache)的缓冲区域。主存暂时存放存储在较大的慢速磁盘上的数据,而这些磁盘常常又作为存储在通过网络连接的其他机器的磁盘或磁带上的数据的缓冲区域。2.为什么称之为“系统”2.1 存储技术的多样性
信息技术发展至今,存储技术日新月异,如何存储二进制信息,方式也十分丰富。
按照存储介质的类型,存储器可以分为:1)半导体存储器(主要用于主存和Cache);2)磁表面存储器(主要有磁盘和磁带);3)光存储器(主要有光盘等)。
其中,半导体存储器发展迅速,也有很多分类:
SRAM为静态随机访问存储器:其存储单位为一个双稳态电路,每个单元用用6个晶体管电路实现,只要有电,其可以无限期的保持两个电压配置或稳定状态,电路复杂度相对较高,因此成本相对较高,一般用于高速缓存和CPU中的寄存器;
DRAM为动态随机防蚊存储器:其每一个位的存储元器件位电容,通过电容的充放电来表征二进制0/1状态,DRAM的存储单元对对干扰非常敏感,成本较SRAM便宜很多,一般用于主存(内存条)。
ROM(read only memory)只读存储器,只能读,不能写。不同于RAM(断电之后,DRAM和SRAM存储的信息就会丢失),ROM属于非易失性存储器,即使关掉电源,其存储的信息也不会丢失。存储在ROM设备中的程序通常被称为固件(firmware),当计算机通电后,它会运行存储在ROM中固件。一些系统在固件中提供了少量最基本的输入输出函数(如BIOS例程),复杂设备,如图形卡和磁盘驱动器,也依赖固件翻译来自CPU的I/O请求。
磁盘:结构组成包括盘片(存储数据)、主轴(带动盘片旋转)以及读写头(读取盘片上的信息)。盘片位磁盘的核心部件,上面划分为了许多同心圆(磁道),磁道上交替分布了许多扇区(扇区之间使用间隙进行分割),磁盘以扇区位为单位进行数据存储。
2.2 存储器的搭建原则
以上,我们知道二进制0/1信息的存储方式由许多种,在计算机系统的搭建时,我们该如何去选择这些存储器呢?
诚如上面所介绍的那样,虽然以上的设备都可以存储信息,但是它们的性能和成本却相去甚远。
正因如此,为了兼顾计算机系统的成本、容量(存储字数*字长)以及速度(数据宽度/存储周期),计算机存储设备不是简单的选择哪一种技术体制,而是
依据存储设备距离计算机大脑(CPU)的远近,按照传输速度的由快至慢来布局存储系统。从而形成了“金字塔结构”的存储系统布局设计。
如图所示,以我的笔记本电脑的存储系统为例,其基本组成为:1)CPU中配备了三级高速缓存(L1/L2/L3),容量分别为256KB、1.0MB和 6.0MB,依次增大;2)电脑主存为7.9GB的DRAM;3)辅存磁盘为239GB的SSD(固态硬盘)。可以看出,存储设备越远离CPU,存储容量越大。
2.3 局部性原理(可行性基础)
如上文所说,为了平衡容量、成本和传输速度,我们设计了一个“金字塔形式”的存储系统层次结构,这样的结构能否实现数据在存储系统各存储设备之间顺畅的“上上下下”,保证计算机系统的畅通运行?
“局部性原理”为这个结构的合理性提供了理论基础。所谓局部性原理,即一个编写良好的计算机程序倾向于引用的数据项临近于其他最近引用过的数据项,或是临近于自我引用的数据项。这一原理对软件系统和硬件系统的设计都有着极大的影响。局部性通常由两种形式:1)时间局部性,即被引用过一次的存储器位置可能在不远的将来被多次引用;2)空间局部性,即一个存储器位置被引用了一次,那么程序可能在不远的将来引用附近的存储器位置。
局部性原理在工程中有着现实的需求,比如说硬件层面,计算机通过引入高速缓存,提前将主存中位置相邻的数据集拷贝至高速缓存,从而利用高速缓存的速度优势,提高数据传输速度。
3.“存储系统”如何运行3.1 系统结构组成
上面,我们知道了存储系统中的各设备是按照其与CPU的“远近亲疏”,层次渐进的构成了一个“金字塔结构”布局。本节,我们将深入了解这些存储设备相互之间以及与CPU 之间究竟是如何连接以及分工写作的。
如上图所示,数据在存储系统的运行过程大致是这样的:1)各种应用APP都被安装在计算机的C盘/D盘(ROM)中,由于ROM的非易失性,即使断电,安装在里面的APP也不会被删除;2)当你打开电脑,启动APP时,相关运行程序就会被拷贝到主存中,开始运行;3)高速缓存载从主存中拷贝数据/程序子集,以备CPU及时调用;4)CPU从高速缓存中取指令、数据进行处理,输出预期的结果给使用者。3.2 主存
以上的叙述,我们还是将主存作为一个抽象的黑匣子进行分析,现在我们将要深入主存内部,去一探主存的组成和运行机理。
主存的基本组成
由上文可知,主存的基本组成包括三部分:1)存放数据的存储体,其类似于货柜,一个个数据如同包裹;2)地址寄存器,用以存放CPU待取数据的地址,就如同取包裹时的取件码;3)数据寄存器,用以临时存放CPU待取数据,就如同待取的包裹。三者之间的有序开展有赖于时序控制逻辑协调。
继续深入存储体的结构细节,就是密密麻麻的集成电路组成,其基本组成如下图所示:存储体被绿色纵线和红色横线划分成很多小方块(构成存储矩阵),每个小方块就是一个存储“位”,它由一个MOS管和一个电容构成,其中电容就相当于“蓄水池”,可以存水,亦可以放水,有水就是“1”,没水就是“0”;MOS管则相当于水管阀门,控制是否存水或防水,对应的就是是否“写入”或“读出”电容里的数据。因此连接水管出水口的“绿线”就是写入或者读出存储单元里面的数据,将8个存储“位”就构成一个存储“字”,而连接开关阀门G的“红线”就决定是否允许相应的单元被写入或读出数据,将红线统一连接到地址寄存器,就可以通过地址寄存器的数据控制哪个位置的数据被选通。
其实将“红线”直接连接地址寄存器(MAR)是相当浪费的,因位红色控制线终究只有一根线导通(对应“1”),而其他线均关闭(对应“0”),所以n条地址线仅仅确定了n个状态,这远低于
个状态,资源浪费,通过桥接一个译码器,就可以通过n位地址线控制
个状态,从而充分利用资源。通过读写控制线确定当前存储器的读写状态。
忽略电路细节,主存就是一个包含着一组地址线引脚和数据线引脚的封装芯片,外加读写控制线引脚,以及片选线引脚(由于主存芯片由多个芯片并行而成,片选线控制使用哪一个存储芯片)。
存储器的总容量=存储单元数*存储字长(存储单元包含的位数),如8KB,其中1B(字)=8bit(位),所以8KB=8K*1B=
*8bit,即地址线有13位,数据线8位。
主存与CPU的连接
以上,我们算是把主存剖析清楚了,那么主存又是如何与CPU进行连接的,实现CPU自由读取贮存在中的数据呢。其实很简单,数据线连数据线,地址线连地址线即可。
如果主存的容量无法满足CPU的需求,可以通过存储器扩展来解决,扩展的方式有两种:
主存的位数不够(相当于快递柜的尺寸太小,放不下大包裹),则可以通过位扩展的方式(快递柜扩容)实现;
主存的字数不够(存储单元的数目不够,相当于快递柜数目太少,放不了太多包裹),则可以通过字扩展的方式实现。
3.3 高速缓存
高速缓存的产生的背景是计算机技术的快速发展致使主存传输数据的速度越来越无法匹配CPU的运算速度,从而严重影响了计算机的运行速度。
解决方法就是,CPU和主存之间增加一个传输速度更快的高速缓存,用以拷贝主存中即将执行的程序,以备CPU运算调用。这一策略就如同京东快递和其他快递的区别,京东快递通过在每个城市自建仓储,用以提前存放商品,买家下单后,商品通常是直接从仓储发货,而不是产地发货,从而实现了“当天达”这样的高效。
高速缓存与主存的映射关系
计算机主存相当于一个大蓄水池,而高速缓存就相当于一个小蓄水池,主存事先将数据拷贝至高速缓存,如果将主存看作为一个数据集合的话,高速缓存就是这个集合的子集,因此必须要明确子集与原集合的映射关系,如此,CPU在从高速缓存中数据的时候才不至于混乱。
既然高速缓存Cache相当于主存的一个子集,那就必须要先明确子集与原集合之间的映射关系,高速缓存与主存之间的映射关系主要分为三种:
全相联映射:1)映射方式,主存和缓存之间的数据传递是以块为单位的,每个块包含多个字的数据,全相联映射中,如下图所示:Cache中#0~#7行均可以接收主存#0块,即主存中块可以存放在Cache中的任意位置,没有限制;2)访存方式,如下图所示,假设内存容量为16*4B,主存的地址包括4位块号以及2位块内陆址,CPU带着待取数据的主存地址(如001110)去问Cache要数据,Cache于是对着主存地址去挨个块核对标记和有效位,发现#2行标记和主存块号一致,且标记位为1(说明块内有数据),则通知CPU“我有你想要的东西”,即为命中;
直接映射:1)映射方式,主存中块只能按照一定的次序排队放入放到Cache中的某一行,因此,Cache块号=主存块号%(取余)Cache总块数;2)访存方式,CPU带着地址码001110去找Cache要数据,Cache用主存块号对行数8取余结果为#3,于是就去#3行核对标记和有效位,发现有效位虽然为1,但标记却是1011,与主存块号不一致,于是通知CPU“我没有你想要的东西”,即为不命中;
组相联映射,1)映射方式,介于1)和2)映射方式之间,Cache中的块可以事先分组,主存中的块必须要按照一定次序放入Cache中的某一组,但是在组内可以随意放;2)访存方式,CPU带着地址码001110去找Cache要数据,Cache用主存块号对组数4取余结果为#3组(即块号后两位),于是就去#3组(#6行,#7行)核对标记和有效位,发现#7行标记为0011一致,且有效位为1,于是通知CPU“我有你想要的东西”,即为命中;
三种映射方式总结和优缺点对比如下:
高速缓存的替换策略
前面,介绍了高速缓存与主存的映射方式以及不同映射方式下,CPU的访存方式,访存结果根据CPU是否获得“想要的数据”而分为命中和不命中两种情况,命中就皆大欢喜,这里介绍一下不命中会怎么样。不命中也分两种情况:
有空位置存放数据,直此时接将内存块地址对应数据Copy至此即可;
没有空位置存放数据(即待放入位置被原数据块占据了),此时就需要对两个块进行位置替换,确保计算机的正常运行,三种不同的映射方式的替换前提有所不同,区别如下:1) 全相联不挑食,除非Cache全满,否则就可以见缝插针;2)直接映射最专一,必须对应行非空,否则就替换;2)组相联比较中庸,介于二者之间,对应的组满了,才替换。
实际替换时,也有着不同的策略,主要有四种:1)随机算法(RAND),在满足要求的块中,随机选一个块进行替换,效果较差;2)先进先出算法(FIFO),优先替换最新被调入Cache的主存块;3)近期最少用(LRU),将最久没有被使用的主存块替换掉,基于“局部性原理”,命中率较高;4)最近不常用(LFU),将被访问次数最少的主存块替换掉。
高速缓存的写策略
以上介绍了CPU从高速缓存中读数据时的一些策略,但同时CPU的运算结果也要同时写回高速缓存以及主存,以备后续使用,这时候也有着不同的策略,针对写命中和写不命中两种情况,处理策略也不尽相同。
写命中时:1)全写法,即写命中后需要将结果同时写入高速缓存和主存;2)写回法,即写命中后,只是将结果写入高速缓存,当高速缓存中相应位置的数据要被替换时,才将结果写回主存;
写不命中:1)写分配法,当CPU对高速缓存写不命中时,把主存中的块调入高速缓存,在高速缓存中修改,通常搭配写回法使用;2)非写分配法,当CPU对高速缓存写不命中时,只写入主存,不调入高速缓存,通常搭配全写法使用。
4.小结
本章更加深入的介绍了存储系统,相继介绍了丰富多样的存储技术、不同存储方式因速度和成本的区别分别司职于计算机的不同部位,从而形成了“金字塔”形式的层次结构、以及详细介绍了层次结构的中主存和高速缓存Cache的结构组成、运行机理以及与CPU之间协调机制。
三、指令系统
如下图所示,我们知道计算机系统构成层次结构是这样的:晶体管是构成计算机系统的基本元素,其通过高/低电平的切换实现自己的价值;大量晶体管通过不断套娃构成了超大规模的集成电路,这些集成电路由于功能的不同可以分饰不同的角色(存储器、CPU、输入/输出等),把这些不同功能的集成电路组合起来就构成了计算机硬件系统,然而这个硬件系统只认识0和1组成的机器语言,其与程序员所编写的程序(高级语言)有着天壤之别,它们之间需要经过编译器的翻译才能互通。这些0和1构成的数据串就指令,其为计算机运行的最小功能单位,而这些可以实现各种功能的指令所组成的集合就是指令系统。
经过编译器编译的指令序列被放入主存的存储体中,CPU在程序计数器PC的控制下,一条条的从主存中取出指令,由CPU的控制器进行指令分析,并指挥CPU运算器按照指令要求完成相应的运算处理,具体的运行过程可以参考前文所述。
指令系统一章将从三个方面展开:1)指令格式,介绍一条指令的基本组成以及按照不同标准的分类;2)指令/数据寻址,指令运行前需要总主存中提取出来,这就需要寻址,分别介绍指令寻址以及数据(指令的被操作数)寻址的各种方式;3)CISC与RISC,介绍两种主流的指令系统(复杂指令集与精简指令集),简单阐明二者的本质区别、优缺点以及典型应用。
1.指令格式
指令的格式如下图所示,由操作码和地址码构成,其中操作码规定了对操作对象的操作类型(求和、移位等),而地址吗则指明了操作对象的位置。
由于操作任务的种类不同,指令地址吗的数目也有所不同,主要分为:1)零地址指令;2)一地址指令;2)二地址指令;3)三地址指令;4)四地址指令。
零地址指令
一种情况是不需要操作数,如空操作、停机、关中断等指令;另一种情况是堆栈计算机,两个操作数隐含存放在栈顶和次栈顶,计算结果亚辉栈顶。
一地址指令
一种情况是只需要单操作数,如加1、减1、取反、求补等操作;另一种是需要两个操作数,但是有一个操作数隐含在某个寄存器(如ACC)。
二地址指令
常用于需要两个操作数的算术运算、逻辑运算相关指令。
三地址指令
常用于需要两个操作数的算术运算、逻辑运算相关指令,并将计算结果写入A3。
四地址指令
常用于需要两个操作数的算术运算、逻辑运算相关指令,并将计算结果写入A3,同时告知下个执行指令的地址。
指令的分类还可以按照长度和类型进行区分:1)定长指令字结构,即指令系统中所有指令的长度都是一样的;2)变长指令字结构,即指令系统中的各种指令的长度不等。
按照操作类型进行分类:1)数据传送类,进行主存和CPU之间的数据传递(如LOAD:把存储器中的数据放到寄存器中;STORE:把寄存器中的数据放入到存储器);2)算术/逻辑操作,其中算术操作包括加、减、乘、除、增1、减1、求补、浮点运算、十进制运算等,逻辑运算包括与、或、非、异或、位操作、位测试、位清除、位求反等;3)移位操作,包括算术移位、逻辑移位、循环移位等;4)转移操作,包括无条件转移JMP、条件转移(JZ:结果为0;JO:结果溢出;JC:结果有进位)、调用和返回(CALL和RETURN)、陷阱(Trap)与陷阱指令;5)输入/输出操作,CPU寄存器与IO端口之间的数据传递(端口即IO接口中的寄存器)。
2.指令/数据寻址
指令寻址的目的在于如何确定下一条指令的存放位置,主要有两种类型:1)顺序寻址,通过程序计数器PC不断加1,顺序执行存储器中的指令;2)跳跃寻址,由转移指令(JMP)指出。两种指令寻址的运行过程如下图所示。
相较于指令寻址,数据寻址的种类则要丰富很多。数据寻址的主要任务是确定本条指令的地址码指明的真实地址。
以一地址指令为例,地址码的构成包括两个部分(寻址特征+形式地址),操作数的的有效地址EA(真实地址)需要通过形式地址按照寻址特征规定的操作进行处理才能获得。寻址特征规定了数据寻址的方式,种类繁多,如下图所示。
立即寻址
无需寻址,形式地址即为操作数(一般用补码形式表示)。
优点为无需访存,速度快,缺点为形式地址的位数限制了操作数的范围。
直接寻址
指令中的形式地址A就是操作数的真实地址,即EA=A。
优点是指令结构简单,指令执行仅一次访存,缺点是A的位数决定了寻址的范围,操作数地址不易修改。
间接寻址
指令的地址字段给出的形式地址不是操作数的真正地址,而是操作数有效地址所在存储单元的地址,即EA=(A)。
优点是可以扩大寻址范围(有效地址EA的位数大于形式地址A的位数),缺点为指令执行过程中需要多次寻址。
隐含寻址
不是明显的给出操作数的地址,而是在指令中隐含着操作数的地址。
优点是有利于缩短指令字长,缺点为需要增加存储操作数或隐含地址的硬件。
寄存器寻址
在指令字中直接给出操作数所在的寄存器编号,即EA=Ri,其操作数在有Ri所指的寄存器内。
优点为指令在执行阶段不用访问主存,只访问寄存器,指令字短且执行速度快,支持向量/矩阵运算,缺点为寄存器价格昂贵,计算器中寄存器个数有限。
寄存器间接选址
寄存器Ri中给出的不是一个操作数,而是操作数所在主存单元的地址,EA=(Ri)。
特点是比一般的间接寻址速度更快,但指令的执行阶段需要访问主存(因为操作数在主存中)。
基址寻址
将CPU中的基址寄存器(BA)的内容加上指令格式中的形式地址A,而形成操作数的有效地址,即为EA=(BR)+A。
优点是便于程序“浮动”,方便实现多道程序并发运行。
变址寻址
有效地址EA等于指令字中的形式地址A与变址寄存器IX的内容相加之和,即EA=(IX)+A,其中IX可谓编制寄存器(专用),也可用通用寄存器作为变址寄存器。与基址寻址的方式的区别在于IX可以被用户修改。
优点:在数组处理过程中,可设定A为数组的首地址,不断改变编制寄存器IX的内容,便可以很容易形成数组中任一数据的地址,特别适合编制循环程序。
相对寻址
把程序计数器PC的内容加上指令格式中的形式地址A而形成操作数的有效地址,即EA=(PC)+A,其中A为相对于PC所指地址的位移量,可证可负,补码表示。
优点:操作数的地址不是固定的,它随着PC值的变化而变化,并且于指令地址之间总是相差一个固定值,便于程序浮动。
堆栈寻址
操作数存放在堆栈中,隐含使用堆栈指针(SP)作为操作数地址。其中的堆栈是存储器中一块特定的按“后进先出(LIFO)”原则管理的存储区,该存储区中被读/写单元的地址使用一个特定的寄存器给出的,该寄存器称为堆栈指针(SP)(类似于程序计数器PC)。
基于堆栈寻址,下图所示为一个加法运算的过程:
step1:堆栈指针SP指向R0,对应数据0001出栈进入ACC,SP指向R1;
step2:SP对应数据1001出栈进入寄存器X,SP指向R2;
step3:ALU计算ACC与X的和(为1010),送至寄存器Y;
step4:计算结果入栈,SP指向R1,将Y(1010)送至堆栈寄存器R1。
依据堆栈数据存放位置可分为硬堆栈和软堆栈,硬堆栈使用寄存器存放操作数,成本较高,但速度快;软堆栈使用主存存放操作数,成本低,但速度相对较慢。
不同寻址方式的有效地址的计算方法以及访存次数汇总如下表:
3.CISC与RISC
指令集的设计,有两个主流的方向,一个是以X86架构为代表的CISC(Complex Instruction Set Computer),即复杂指令集,另一个则是以ARM架构为代表的RISC(Reduced Instruction Set Computer),即精简指令集。两者的设计思路向左。
CISC:设计思路为一条指令完成一个复杂的基本功能,一条指令可以由一个专门的电路完成,比较复杂的指令则通过“存储程序”(微程序)的设计思路,由一个比较通用的电路配合存储部件完成。典型应用为X86架构,主要应用于笔记本、台式电脑等;
RISC:设计思路为一条指令至完成一个基本“动作”多条指令组合完成复杂的基本功能。典型应用为ARM架构,主要应用于手机、平板等。
如果说“指令”就是计算机硬件系统的语言的话,那么CISC和RISC就是两种语言系统规范,其中CISC以“单词”为元素构建语言系统,每一个单词就可以表达一个意思,而表达复杂的意思,就可以将单词组合,优点在于简单,缺点就是单词可能会很多;而RISC则是以“字母”为元素构建语言系统,每个字母无法表达确切的含义,需要将很多字母组合起来,才能表达丰富多样含义,其优点在于“元素”的数目较少,只有26个,缺点在于表达任何一个含义,都需要将很多字母组合起来方可。
两种指令集的对比如下图所示:
4.小结
本章详细介绍了指令系统的相关内容,相继介绍了什么事指令系统以及其在计算机系统中的作用、一条指令的构成(指令格式)、指令以及数据是如何寻址的(寻址方式)以及两种典型指令系统(CISC和RISC)。
来源:多物理场仿真技术
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/91696.html