计算机组成原理
学习视频为bilibili@湖科大教书匠,文内图片来自于老师视频,如侵权烦请联系后删除,如有错误欢迎指正。
文章目录
- 计算机组成原理
- 计算机系统的组成
- 计算机中的数据表示
- 运算方法和运算器
- 逻辑移位
- 算数移位
- 循环移位
- 定点数的运算
- 补码加减法
- 无符号数的乘法[视频参考(12:11)](https://www.bilibili.com/video/BV1qG41197E4?spm_id_from=333.788.player.switch&vd_source=fed3dd0c9bbe2f26fbca65be59357baa&p=31)
- 原码一位乘法运算的硬件逻辑实现
- 补码乘法运算的硬件逻辑实现[视频参考(16:53)](https://www.bilibili.com/video/BV1qG41197E4?spm_id_from=333.788.player.switch&vd_source=fed3dd0c9bbe2f26fbca65be59357baa&p=33)
- 无符号阵列乘法器
- 补码阵列乘法器
- 原码除法运算
- 补码除法运算
- 浮点数的运算
- 运算器
- 存储器
- 其他知识点
计算机系统的组成
计算机的发展
冯·诺依曼计算机的特点:
- 运算器、控制器、存储器、输入输出设备;
- 指令和数据以同等地位存储于存储器,用地址访问;
- 指令和数据用二进制表示;
- 指令由操作码的地址码;
- 组成存储程序;
- 以运算器为中心
存储器的基本组成(单位参考):
- 存储单元 存放一串二进制代码
- 存储字 存储单元中二进制代码的组合
- 存储字长 存储单元中二进制代码的位数
- MAR 存储器地址寄存器,反应存储单元个
- MDR 存储器数据寄存器,反应存储字长
运算器的基本组成及操作过程:
- X(操作数寄存器)(加减除数、被乘数)→ALU(算术逻辑单元)↔ACC(累加器)(被加减除数)(和差余数、乘积高位)↔MQ(乘商寄存器)(乘数、商、乘积低位)
控制器的基本组成(取指→分析→执行):
- 控制单元CU 分析当前指令所需完成的操作,并发出各种微操作命令序列
- 程序计数器PC 存储当前预执行指令的地址;与MAR之间有一条直接通路;自动形成下一条指令的地址
- 指令寄存器IR 存放当前的指令,内容来自MDR;操作码(OP(IR))会送至CU,用来分析指令;地址码(Ad(IR))作为操作数的地址送至MAR,用于取操作数
操作步骤:
初始化时,(pc)=0对第一条取指,将数值送至内存的MAR中((pc)→MAR),此时所寻址的存储内容送至MDR中,再将MDR的内容送至控制器的IR((MDR)→IR),将IR中保存的指令送至CU进行分析(OP(IR)→CU),此时PC自增加一;①若其为取数指令,将IR中保存的指令地址码送至MAR(Ad(IR)→MAR)对内存进行寻址,将其对应的存储单元的内容送入MDR内,再将MDR的内容送至ACC((MDR)→ACC);②若其为运算指令,将IR中保存的指令地址码送至MAR(Ad(IR)→MAR)对内存进行寻址,将其对应的存储单元的内容送入MDR内,再将MDR的内容送至运算器的X或MQ((MDR)→X/MQ),CU向ALU发送对应的操作命令,并将运算的结果存放在相应的位置;③若其为存数指令,将IR中保存的指令地址码送至MAR(Ad(IR)→MAR)对内存进行寻址,将ACC中的内容送至MDR((ACC)→MDR),MDR将内容根据地址写入
计算机硬件组成的细化
计算机性能指标
基本性能指标
- 机器字长:CPU一次能够处理的二进制数据的位数,与整数运算的ALU位数和通用寄存器的宽度相等;字长越长,数的表示范围更大、精度更高、计算精度更高影响计算速度
- 主存容量:主存储器(内存)能够存储的最大信息容量 ;减少对于外存的访问,提高程序的执行速度,进而提高计算机性能;MAR决定存储单元的数量为2MARMDR的位数决定存储字长
- 吞吐量:计算机系统在单位时间内能够处理的信息量
- 响应时间:从像计算机系统提交作业开始,到系统完成作业为止所需的时间
与运算速度相关的性能指标
-
CPU时钟频率和时钟周期:CPU时钟信号是一个基本定时信号,是一种固定频率的脉冲信号,其频率被称为CPU时钟频率,倒数为CPU时钟周期
-
CPI:执行一条指令所需要的时钟周期的数量;每条指令执行所需的时钟周期数量可能不同
-
一条指令的CPI:该指令执行所需的时钟周期的数量
-
一类指令的CPI:构成该类指令的所有指令执行所需的时钟周期的平均值
-
一个程序的CPI:构成该程序的所有指令执行所需的时钟周期数量的平均值;CPI=程序执行所需的时钟周期数量÷程序所包含的指令数量
-
若某个程序总共有n类不同类型的指令,每类指令的CPI(CPIi表示),每类指令的数量在程序所包含的指令中所占的比例(Pi表示),则该程序的CPI=∑(CPIi×Pi)
-
-
CPU执行时间:真正用于用户程序的执行时间;CPU执行时间=(CPI\×程序所包含的指令数量)\×时钟周期或者(CPI\×程序所包含的指令数量)÷时钟频率
-
IPC:每个时钟周期能够执行的指令数量;就是CPI的倒数
-
MIPS:每秒执行百万条指令的数量;MIPS=(程序所包含的指令数量÷CPU时间)÷106或MIPS=(时钟频率÷CPI)÷106
-
MFLOPS:每秒执行百万次浮点运算的数量;MFLOPS=(浮点运算次数÷测试程序的执行时间)×106
计算机中的数据表示
数据表示的基本概念
定点数的编码
原码
符号位为0表示正数,为1表示负数,数值位为真值的绝对值,符号位和数值位是逗号或者小数点表示整数或者小数
优点:表示方法简单直观
缺点:真值0在原码有两种不同的表示,符号位不能直接参与运算
补码
(可以确定好符号位后,将数值位取反后加一)(互为负数的两个数补码是全部按位取反,末位加一)正数的补码符号位为0,数值位就是其本身,负数的补码等于模数加上负数本身,模数就是最高位进位的位权值
优点:可以将减法转换成加法运算,真值0只有一种表示,符号位可以直接参与运算
缺点:相对于原码更加复杂
反码
正数的反码符号位为0,数值位就是它本身,负数的反码符号位为1,数值位就是真值数值按位取反
优点:符号位可用参与运算,但是要循环进位(即最高位进位要加到最低位)
缺点:真值0有两种表示
移码
(和补码的区别仅在于符号位)真值加上一个常数2n,只用于定点整数的表示
优点:真值0只有一种表示,保持原有的大小顺序
表示范围
类型 | 负整数 | 正整数 | 负小数 | 正小数 |
---|---|---|---|---|
原码 | -(2n-1-1)~0 | 0~2n-1-1 | -(1-2-(n-1))~0 | 0~1−2−(n−1) |
补码 | -2n-1~0 | 0~2n-1-1 | -1~1-2-(n-1) | 0~1-2-(n-1) |
反码 | -(2n-1-1)~0 | 0~2n-1-1 | -(1-2-(n-1))~0 | 0~1-2-(n-1) |
移码 | -2n-1~0 | 0~2n-1-1 | 无 | 无 |
浮点数的编码
任意一个二进制数N可表示成N=rE×M(r为基数通常为2,故无需记录;E为阶码(定点整数);M为尾数(定点小数));如:0,0110;1.111000000表示-56
故其在机器中的表示形式为阶符(阶码正负)+阶码数值(小数点位置)+数符(数的正负)+数码数值;阶码的位数决定数据的表示范围,尾数的位数决定了数据的精度
基数r越大,可表示的浮点数的范围越大,可表示的数个数越多,但精度反而下降
浮点数的表示范围
规格化后最大正数和最小负数没有变化,但是最小正数和最大负数中乘的2-n或-2-n变为2-1或-2-1
规格化
尾数的数值部分最高位为1:r=2时,尾数数值部分最高位为1;==(后续请注意,数值部分移动2,3,4时,阶码减1)==r=4时,尾数数值部分最高2位不全为0;r=8时,尾数数值部分最高3位不全为0;r=16时,尾数数值部分最高4位不全为0
IEEE 754协议
32位单精度浮点数:对应c语言中的float,符号1位,阶码8位,尾数23位
64位双精度浮点数:对应c语言中的double,符号1位,阶码11位,尾数52位
符号位(0正1负);阶码(移码表示,偏移常量为127);尾数(原码表示,符号由最高位给出,同时尾数的最高位隐含一个不存储的1)
阶码:在IEEE754中偏移常数不是常用的27=128而是27-1=127(作用:阶码全1或全0有特殊用途,防溢出)
数值的分类 | 符号S | 阶码E | 尾数M | 真值 |
---|---|---|---|---|
正零 | 0 | 0 | 0 | +0 |
负零 | 1 | 0 | 0 | -0 |
非规格化正数 | 0 | 0 | M≠0 | (-1)1+2-126×0.M |
非规格化负数 | 1 | 0 | M≠0 | (-1)1+2-126×0.M |
正无穷大 | 0 | 255 | 0 | +∞ |
负无穷大 | 1 | 255 | 0 | -∞ |
无定义数 | 0或1 | 255 | ≠0 | NaN |
规格化正数 | 0 | 1≤E≤254 | M | (-1)0+2×1.M |
规格化负数 | 1 | 1≤E≤254 | M | (-1)1+2E-127×1.M |
- 一般情况下+0和-0等效
- 非规格化数可以用于处理阶码下溢,表示比最小规格化数还小的数
- 引入无穷大叔可使计算过程中出现异常情况时程序能继续执行,并提供错误检测功能
- NaN用于表示0÷0、∞÷∞、0×∞、负数的平方根等,部分非数NaN运算结果会产生异常
C语言中的数据类型转换
相同字长之间的转换
若需转换的数在两类型表示范围的交集内,则不变
若需转换的数不在两类型表示范围的交集内,则+或-其表示范围(例如char类型+或-28=256)
小字长转大字长
原数据为无符号类型,进行0扩展:在原数据内容的前面用0补全
原数据为有符号类型,进行符号扩展:在原数据内容的前面用其符号位的内容补全(若转为负数转换成无符号类型,则转换后的值为大字长的表示范围和原数值相加)
大字长转小字长
只保留大字长中后小字长的部分,即前面多出的部分直接损失掉,会导致差错
运算方法和运算器
逻辑移位
对于无符号数
逻辑左移:高位移除,低位补0
逻辑右移:低位移除,高位补零
算数移位
对于有符号数(定点数)
不论正数还是负数,符号位保持不变,仅对数值位进行移位,对真值的远吗、反码和补码进行算数移位后,他们各自所对应的真值应保持一致
对于正数:原码反码补码都相同,所以移位出现的空位补0
对于负数: 左移:反码补1,补码补0 或者 反码均补1,补码前面同反码,后面同原码(即右移前补1,左移后补0)
右移:反码补码均补1 对于补码来说,还可以:==(符号位参与移位)==左移后补0,符号位边则溢出,右移前补符号位内容
对于精度缺失和出错情况总结如下:高位丢失均出错,低位丢失均精度缺失,对于丢失的内容与补位的数相反
C语言中的移位运算符
左移运算符<<对应汇编语言中的逻辑左移,即高位移除,低位补0
右移运算符>>根据是无符号数或有符号数分别对应逻辑右移和算数右移
循环移位
对于无符号数
被移出的位会出现在另一端;在很对处理器架构中,循环移位会影响状态寄存器中的进位标志CF,根据CF标志是否加入循环移位过程,分为四类,其中不带CF标志位的循环移位称为小循环,反之为大循环
不带CF标志位的循环位移:位移后将位移的位存入CF标志位,CF标志位不参与位移
带CF标志位的循环位移:移出的位进入CF标志位,CF标志位进入空位,相当于多一位CF标志位
定点数的运算
补码加减法
加法正常运算,减法将其作为加上一个负数处理,溢出的位直接丢弃
溢出检测:
- 根据操作数的符号位与运算结果符号位是否相同:符号位相同才可能溢出,若运算结果和操作数符号位不同,则说明溢出
- 运算过程中最高数值位的进位和符号位的进位是否一致,不同则说明溢出
- 利用变形补码(具有两个符号位,双符号位为00时表示正数,11为负数,01表示正溢出,10表示负溢出)
无符号数的乘法视频参考(12:11)
将被乘数先存储在X寄存器中,乘数存在MQ中,若当MQ前的值为1,则将ACC中的值加X的值赋值给ACC,若产生进位,则Cout置为1,然后将Cout、ACC、MQ中的内容进行算数右移一位,若MQ当前的值为0,则仅将Cout、ACC、MQ中的内容进行算数右移一位
原码一位乘法运算的硬件逻辑实现
符号位进行异或运算,数值位乘法参考无符号数乘法的硬件逻辑实现
补码乘法运算的硬件逻辑实现视频参考(16:53)
被乘数符号任意,乘数的符号为正时,[X×Y]补=[X补×Y补]
被乘数符号任意,乘数的符号位负时,[X×Y]补=[X]补×0.Y1Y2……Yn-[X]补
总结为[X×Y]补=[X]补×0.Y1Y2……Yn-[X]补×Y0
即先将乘数额外拓展一位(值为0,在最低位之后)从原最低位开始,每一位的后一位减去这一位,若为0,则部分积加0,逻辑右移一位,若为1,则部分积加X的补码,并逻辑右移一位,若为-1则部分积加-X的补码,并逻辑右移一位
在ACC和X寄存器中,使用双符号位存储,译码器取出MQ中的两位数进行相减,并将结果发送给选择器(如相减为0,1,-1其三线输出从上往下为001,010,100),选择器根据其值选择将0或X或-X的补码发送给ALU运算器
无符号阵列乘法器
通过实际电路模拟笔算过程
补码阵列乘法器
将其数值位部分转化为原码形式,通过无符号阵列乘法器求出乘积的值,在将符号位异或后得到符号位结果,再根据符号位结果将其转换成补码
原码除法运算
条件:除数不为0;定点小数:|被除数|<|除数|;定点整数:|被除数|≥|除数|
商的符号位由被除数和除数的符号位异或得到;|商|=|被除数|÷|除数|
恢复余数法
类似笔算除法,但是计算机因为无法判断两个数的大小,故先将被除数减去除数,若值为负数则再将这个负数加上除数,并记商为0,若值为正数,则计商为1
不恢复余数法
通过复盘恢复余数法的运算过程,我们可以将其看作若当前余数≥0,则商1,下一余数等于当前余数左移1位后减去除数;若当前余数<0,则商0,下一余数等于当前余数左移1位后加上除数
补码除法运算
补码的除法运算类似于原码的除法运算,因为不恢复余数法明显优于恢复除数法,故只考虑补码的不恢复余数法的除法运算
总结:最开始中间余数(即被除数)若和除数同号则减除数,若异号的加除数,求得下一级中间余数,若和除数同号则商1,异号则商0,然后将中间除数和商左移一位,再次和除数运算
确定商值
- 补码除法不能像原码除法那样判断是否够减,所以补码除法判断是否够减的方法是:中间余数(初始为被除数)与除数之间富豪的异同及相应做减法或加法后结果的符号(中间余数与除号异号时做加法,求得的余数与出号异号则够减;中间余数与除号同号时做减法,求得的余数与出号同号则够减)
- 若中间余数和除数同号,则商为正,够减时商1,不够减时商0;若中间余数和除数异号,则商为负,够减时商0,不够减时商1
确定商的符号位
补码除法的符号位和数值位同样参与运算,故商的符号位是在求商的过程中自然形成的,在定点小数的除法中,被除数的绝对值必须小于除数的绝对值,否则商会大于1而产生溢出
得到新余数
若中间余数和除数同号,则新余数为原余数的补码左移1位后加上负除数的补码
若中间余数和除数异号,则新余数为原余数的补码左移1位后加上除数的补码
浮点数的运算
浮点数的加减运算
- 对阶:小阶先大阶对齐,尾数右移相应位数(两个阶的差的绝对值)移出位暂时保留,称为保留附加位,参与中间运算以提高精度
- 尾数运算:将对阶后的尾数进行加减运算
- 结果规格化:根据尾数的结果,因为采用的是双符号位,若符号位为00.0b或11.1b,则左规(尾数每左移一位,阶码减1),还需判断是否下溢(符号位10),若下溢可认为结果为0;若符号位为10.bb或01.bb,则右规(尾数右移1位,阶码加1),还需判断是否上溢(符号位01),若上溢可认为结果为∞
- 舍入处理:
- 截断法:直接丢弃出熬出机器长度的尾数低位(误差积累)
- 末位恒置1法:机器长度内的尾数的最低位恒置为1(损失1位精度,但误差积累较小)
- 0舍1入法:类似四舍五入,需要丢弃的最高位为1时,则机器码内最低位加1(误差最小,但难以操作,可能需要再次规格化)
IEE 754浮点数的加减运算([IEEE 754](#IEEE 754协议))
和浮点数加减运算的区别:
- 对阶和结果规格化过程中,阶码的加减运算采用移码加减运算规则
- 尾数运算采用原码运算规则,且隐藏位要参与运算
- 隐藏位参与尾数规格化判断和规格化过程
- 若尾数形式为1.……,则为规格化尾数
- 若尾数形式为0.……,则需要进行左规(尾数左移,阶码减),直到尾数为格式化为止
- 若尾数形式为1b.……,则需要进行右规(尾数右移,阶码加)
- 舍入处理:
- 就近舍入:舍入为可表示的最近的数,若处于中间,则向偶数舍入
- 朝正∞舍入:总是取右侧可表示的最近的数
- 朝负∞舍入:总是取左侧可表示的最近的数
- 截断处理:直接丢弃多余位,朝0方向舍入
- 溢出判断:右规使阶码全1时发生规格化上溢,左规使阶码全0时发生规格化下溢
浮点数的乘法运算
阶码相加(溢出判断),尾数相乘,规格化和舍入
注意IEEE 754浮点数乘法运算中不存在左规操作
浮点数的除法运算
尾数调整(若被除数的尾数的绝对值大于除数的尾数的绝对值,则将被除数的尾数右移一位,阶码加1),阶码相减(溢出判断),尾数相除,规格化和舍入
注意IEEE 754浮点数除法运算中不存在右规操作
运算器
分为定点运算器和浮点运算器
定点运算器:ALU由与门、或门、一位全加器并行将结果交由译码器选择输出;常见的状态位有ZF(为1表示运算结果为0)OF(为1表示有符号运算溢出)SF(为1表示运算结果为负数)CF(表示加法进位输出、减法借位输出或逻辑左移操作的溢出位)很多计算机将这些暂存在一个状态寄存器中
存储器
以PC为你,BIOS芯片常采用NOR型闪存或EEPROM,外存SSD多采用NAND型闪存,这些都属于非易失性存储器,CPU内部的cache使用SRAM,内存条使用DDR4的SDRAM,这些属于易失性存储器
存储器概述
现代计算机以存储器为中心,是计算机中存放指令和数据的主要部件;分为主存储器(运行内存)和辅助存储器(存储内存)
可以按照存储介质、存储方式、可改写性、可保存性、功能和存储速度分类
存储系统的层次结构从上到下,分别为寄存器、高速缓存、内存、机械硬盘、磁带光盘
存储器的性能指标
存储器的性能指标有存储容量和存取速度,其中存取速度又有存取时间:移动一次存储器操作到该操作完成所经历的的时间,分为读出时间和写入时间,二者可能不同;存取周期:连续两次访问存储器操作之间所需的最短时间间隔;存储器带宽:单位时间内存储器所能传输的信息量(单位b/s或B/s),它是衡量数据传输速率的重要指标
主存中的地址译码器
主存是机器指令直接操作的存储器,需要基于主存地址对其进行随机访问,通过第一章的学习,我们知道MAR和MDR是读写主存的重要寄存器,其中存储在MAR的地址码通过地址译码器输出地址信号选择主存中对应位置的存储单元,其中地址译码器分为单译码结构和双移译码结构(之所以会有双译码结构,是因为译码器的输出要和地址数相同,对于存储单元多的主存,这是十分不合适的)双移码结构是将存储单元按照二阶矩阵的形式排列,使用n/2条的行地址译码器和n/2条的列地址译码器可以用于拥有2n个存储单元的主存
主存中数据的存放
主存通常按字节进行编址,而存储字长是字节的二整次幂倍,对主存的访问可以通过字节、16位半字(2个字节)、32位字(4个字节)访问,其关系为逻辑右移1位后可以得到下一个类型访问的地址
大端和小端:小端:将数据的低字节保存在主存的低地址中,高字节保存在高地址中,这样可以将主存地址的高地与数据的维权有效的结合起来只是字节的位置改变,而字节内的内容还是正常顺序(例如:原本是03 12 56 76,小端方式存储就是76 56 12 03);大端:将数据的低字节保存在主存的高地址中,高字节保存在低地址中,这样符合人的思维
边界对齐:边界未对齐对存储空间的利用率最高,但存在访问性能问题,而边界对齐有效提升了访问性能;边界对齐要求:字节数据不存在边界对齐问题;半字(2字节)数据起始字节地址最低1位为0;单字(4字节)数据起始字节地址最低2位为00;双字(8字节)数据起始字节地址最低3位为000
静态随机存储器SRAM
静态:是指这种RAM只要保持通电,其内部数据就可以保持不变,不需要周期性刷新,和动态随机存储器DRAM相反如果断电,数据还是会消失
其中的存储元是MOS管;特点:上电之后的初始状态随机;读操作不会破坏原本的内容;功耗大,晶体管数量多
存储元扩展:将存储元的行和列选通线串联,行列选通线均为n条,存储元为n2个,同一时刻只能有一条行和列选通线
存储阵列扩展:将存储阵列的行和列选通线并联
对于存储容量为n*m位的SRAM存储芯片,其除电源和接地引脚外,引脚数量最低为log2n+m+2(CS和WE)
动态随机存取存储器DRAM
存储元是一个MOSS管和电容,读操作会破坏原本的数据,需要动态刷新
读操作步骤:将每一条列线预充电到1/2VCC,行选通线接通,检测列线上的电压变化,得到此行中每一列存储的信号,再根据信号对这一行的数据进行恢复,最后根据列选通线输出需要的数据
写操作步骤:前期同读操作相同,但是最后一步为数据输入
读写操作共同进行的部分是为了进行行刷新功能,动态刷新中刷新周期:是DRAM实际完成两次完整刷新之间的时间间隔,最大刷新周期是数据存入DRAM开始导数据丢失的时间周期;刷新存储元数量:按行刷新,由内存控制器负责,为缩短刷新周期,可通过减少存储阵列的行数,增加列数;刷新和读操作的区别:刷新无需给出列地址,仅需给出行地址
动态刷新方式:集中刷新:在一个刷新周期内选择一段时隙专门用于刷新(死区时间),其他时隙用于读写或保持,这种刷新方式在读写时间内读写速度快;分散刷新:一读写一刷新(交错执行),将存取周期加上刷新一行的时间作为新的存取周期,因此不存在死区时间,但是刷新过于频繁,严重影响系统速度;异步刷新:将刷新时间根据存储阵列的行数分为一定的时间段,每段时间的最后一部分时间用于刷新某一行,即将集中刷新和分散刷新结合起来
由于DRAM存储器的行列线选择数据不需同时给出,所以可以将其分时复用,仅需行/列选通线,其其他引脚还有RAS行地址选通,CAS列地址选通,WE写使能信号
SDRAM(同步动态随机存取存储器)中的tRCD是从行地址选通到列地址选通之间的延迟时间,CL是从列地址选通到数据传输的延迟时间
只读存储器ROM
只能从其读出信息,而不能向其随意写入信息的存储器称为只读存储器
- 掩膜式只读存储器MROM:由生产厂家根据需求写入,不能修改
- 可编程只读存储器PROM:仅能改写一次
- 可擦除可编程只读存储器EPROM:可多次写入,需要用紫外线照射来擦除所有存储元状态,需要先擦除后写入
- 电可擦除可编程只读存储器EEPROM或E2PROM:可多次写入,采用电可擦除方式(根据命令自动完成)可以精准的擦除某一个存储元
- 闪存:逻辑结构和EEPROM相似,但是存储单元结构和工艺不同,以块为单位擦写(先擦后写,读快写慢)更适合存储大量数
主存的扩展及其与CPU的连接
CPU最少应当有和主存相同数量的地址引脚和数据引脚,读写引脚R/W(低电平有效,同主存芯片的WE引脚连接)存储器请求控制引脚MREQ(低电平有效,同主存芯片的CS引脚连接)
位扩展
当存储芯片的数据总线位宽小于CPU数据总线位宽时,采用位扩展的方式进行扩展(存储芯片的数据引脚数小于CPU数据引脚数);又被称为数据总线扩展或字长扩展
CPU数据总线有很多位,但是一个存储芯片的数据总线的位宽不能将CPU的数据总线位宽占完,所以添加多个存储芯片,并将其数据总线分别和CPU数据总线上的某些位相连,即将每一个存储芯片中同一位置的数据的宽度“扩宽”了
存储芯片的地址引脚、写使能引脚WE以及片选引脚CS分别并联后和CPU的地址引脚和R/W引脚以及MREQ引脚相连接;数据引脚依次与CPU数据引脚相应连接;
初始状态时,CPU的MREQ和R/W输出高电平,各存储芯片无反应,读操作时,地址总线传输需要获取的数据的地址,MREQ输出低电平,各存储芯片将此地址的数据输出至数据总线传输给CPU;写操作时,CPU数据总线将要写入的数据输出,经数据总线传输到存储芯片的数据总线,地址总线传输需要获取的数据的地址,R/W和MREQ输出低电平,各存储芯片将数据总线中的数据存储到对应地址总线中获得的地址
字扩展
当存储芯片的存储容量不能满足存储器对存储容量的需求时 采用字扩展的方式进行扩展(存储芯片地址引脚数小于CPU地址引脚数量);和计算机网络中IP协议中子网地址划分很相似;又被称为容量扩展或地址总线扩展
将CPU的地址引脚低存储芯片地址引脚数引脚连接到存储芯片的地址引脚,多出的部分连接到对应的译码器(如3-8译码器),再将译码器的信号传输给各存储芯片的写使能引脚CS,并且CPU的MREQ引脚连接译码器的输出使能引脚OE
存储芯片的数据引脚、地址引脚、写使能引脚各自并联后再分别与CPU的数据引脚、地址引脚、读写控制引脚连接;片选引脚可以由CPU高位地址引脚通过译码器产生
读写操作同位扩展
字位同时扩展
当存储芯片的数据位宽和存储容量均不能满足存储器的数据位宽和存储总容量要求时, 采用字位同时扩展。
首先通过位扩展满足数据位宽的要求,再通过字扩展满足存储容量的要求
主存系统的优化
双端口存储器
一个存储器拥有两个端口(每个端口有完整的地址、数据、控制总线)如果是双核CPU可以将每个核控制一个端口进行读写操作,如果两个端口要控制的是同一个地址的数据产生冲突,有判断逻辑判断由哪个端口优先进行读写操作,将另一个端口的BUSY(低电平有效)输出为低电平,延迟该端口对存储器的访问。因此双端口存储器不能达到单端口存储器速率的一倍
单体多字存储器
与位扩展防止完全相同,多个存储模块共享地址总线,按地址并行访问不同存储模块的同一单元;实现了一个存取周期内访问多个存储字,若有n个存储模块并发工作,则主存带宽提升n倍;多通道内存技术就是此技术。
多体交叉存储器
也由多个存储模块构成,模块的容量和存取速度相同
-
高位多体交叉(顺序编址模式):模块地址在前,块内地址在后;地址是将一个存储单元排满后再排下个存储单元,和存储字扩展完全相同,主要目的是扩充存储器的容量
-
低位多体交叉(交叉编址模式):块内地址在前,模块地址在后;地址是从第一个存储单元的第一个地址到第二个存储单元的第一个地址……;为提高顺序访问时个存储模块的并行性,各存储模块均有独立的地址、数据寄存器和控制电路,顺序访问时,各存储模块一般按流水线方式轮流存取(要实现流水线方式存取,应满足访问一个模块的存储周期T应当是其他延时τ的交叉模块数量m倍)在一次流水线存取中,每个模块仅被访问一次,总耗时为T+(m-1)τ,n次连续流水线读取总耗时为nT+(m-1)τ
高速缓冲存储器cache
为了提升CPU访问主存的性能,通常会在CPU与主存之间添加一个SRAM作为高速缓冲存储器cache。将主存中经常访问或即将访问的数据,复制一份 (调度)到cache中,使得大部分数据访问都可以 在cache中进行,从而提升系统性能。
程序局部性:在一段时间内,整个程序的执行仅限于一个较小的局部范围内
- 时间局部性:若程序在某个时刻访问了一个存储位置,该位置在未来可能会被多次访问
- 空间局部性:若程序访问了某个存储位置 则其附近的存储位置也可能被访问。
cache系统的性能评价:某程序运行期间命中cache的次数记为nc,从主存中访问信息的次数记为nm 命中率记为h:h=nc/(nc+nm),1-h称为缺失率,命中访问时间为tc,未命中的缺失补偿tm,则cache/主存系统的平均访问时间ta=htc+(1-h)tm,访问效率e=tc/ta=1/(h+(1-h)(tm/tc)),称tm/tc=r,r越大越好,但通常为5~10
cache的读写流程
-
cache的读操作:
CPU通过主存地址从cache中查找数据,若找到(称为命中),则CPU读取cache中的数据,若未命中,则cache从主存中载入缺失数据,再由CPU读取cache中的数据
-
cache的写操作
CPu通过快速查找判断要修改的数据是否在cache中,若命中,则CPU将数据写入cache,此时cache和主存中的数据产生不一致性,若使用写回策略,则此时操作结束,响应速度最快,若使用写穿策略,则再将主存中的数据同样修改,这会增加写操作写操作的时间,但不会产生脏数据;若未命中,采用非写分配策略,则CPU直接将数据写入主存,写的部分不经过cache,若采用写分配策略,则将数据从主存读入到cache中,在按照命中的情况进行数据写入
地址映射
主存被划分为若干个数据块,每个数据块包含若干个字,cache被划分为若干个等长的区域,称为行或槽,我们假设主存有m×n个数据块,cache有n行。每个cache行都可以存储一个数据块副本(后续省略副本一词)。为了标明每个cache行内的数据是否有效,每行还有一个有效位用来标识,将有效位置0,则可以淘汰对应的数据块,称为冲刷,;每次载入一个新数据块后,需将有效位置1。除此之外,cache行还有一些空余空间,用于记录一些相关信息
直接映射(模映射)
主存数据块x只能载入cache的第x%n行
主存地址采用==|主存分区号|cache行号|块内偏移|==的形式保存,可以得到cache行数量为2cache行号的位数,主存数据块数量为2驻村分区号和cache行号总共的位数,主存中一个数据块的大小为2块内地址的位数,一般来说cache行内的数据除了数据块副本还有一位有效位valid,主存分区号位tag(位长同主存地址表示中主存分区号位长)需注意,若明确表示有如写回操作之类的操作,应当在cache中有对应的标志位
主存中的数据块按照cache的行数进行分区,各个分区的首个数据块号从0开始,依次加一,区内数据块号和cache行号相同
快速查找方式为根据要求数据的区内数据块号找对应的cache行,并有效位为1且主存分区号为要求数据的分区号
特点:对于cache的利用率不高,命中率低,冲突率高,成本较低,适合大容量cache,替换算法简单
全相联映射
每一个主存中一个数据块都可以映射到cache中的任何一个cache行
主存地址采用==|主存数据块地址|块内偏移|==的形式保存,cache行的内容为1位有效位valid,主存数据块地址位tag和数据块副本
快速查找方式为将要求数据的主存数据块地址和cache中各行的主存数据块地址经过n路并发比较器比较,并将各cache行有效位同1经过n路并发比较器比较
组相联映射
将cache中的所有行划分成固定大小的组,每组包含k行,称为k路组相联,主存数据块采用直接映方式对应到cache中固定的组,主存数据块在相应的组内,采用全相联映射,可对应到组内任何一行
主存地址采用==|主存分区号|区内块号|块内偏移|==的形式保存
快速查找方法首先基于信息的主存地址的区内块号(组索引index)索引到相应的cache组。之后,将信息的主存地址的主存分区号部分与所选cache组内所有行的标记tag、1与所选cache组内所有行的有效位,进行全相联并发比较,如果匹配,则数据命中,否则数据缺失。
cache中比较器的数量就是每个cache组包含的cache行数,位数就是主存分区号的位数
三种地址映射方式的比较
- 一个主存数据块对应的cache行的数量,称为“关联度”
- 直接映射方式的关联度为1
- 全相联映射方式的关联度为cache的总行数
- k路组相联映射方式的关联度为k
- 关联度与命中率、命中时间、cache行中标记tag所占空间(额外开销)的关系如下。(cache容量相同,主存数据块大小相同时)
- 关联度越低,命中率越低。因此,直接映射方式的命中率最低,全相联映射方式的命中率最高。
- 关联度越低,判断是否命中的开销越小,命中时间越短。因此,直接映射方式的命中时间最短,全相联映射的命中时间最长。
- 关联度越低,cache行中标记tag所占空间(额外开销)越少。因此,直接映射方式的额外空间开销最少全相联映射方式的额外空间开销最大。
虚拟存储器
将主存和更大容量的辅存整体看成一个可供CPU直接访问的大容量主存技术是虚拟存储器,程序员编程时是面向虚拟存储器的使用的是虚拟地址VA,为了实现虚拟存储器,还需要操作系统OS和存储器管理单元MMU。CPU通过MMU将指令中的虚拟地址VA转换为主存的物理地址PA,在此过程中MMU会检查是否发生数据缺失或地址越界、访问越权或越级等存储保护错误。若数据缺失则由操作系统将数据从辅存调入主存,若出现存储保护性错误,则由操作系统进行处理。利用程序的局部性原理,从辅存调入程序到主存时,并不是将程序的全部代码和相关数据调入主存,通常只是加载很小的一部分,这与cache相关技术很相似
页式虚拟存储器
虚拟存储器的地址空间被划分为若干个固定大小的页面,简称页,主存和辅存按页交换信息,虚拟地址空间中的页称为虚拟页VP(逻辑页),主存空间中的页称为物理页PP(页框、页帧)
采用请求分页的思想,将进程中活跃的页面从辅存调入主存中,不活跃的保留在辅存中,当访问的信息所在的页不在主存中时发生缺页异常,从辅存将缺失的页调入主存,由于cache、主存和辅存运行速度的区别,缺页处理的代价要远大于数据未命中,所以一般将页大小设置的比较大,主存和辅存之间使用全相联映射方式,写操作使用写回法
地址映射和页表
页式虚拟存储器采用全相联映射,即每个训觉可以存放到主存中任何一个空闲的物理页
对于每个进程都需要建立进程中各个虚拟页与所存放的物理页或磁盘存储位置之间的关系,通常采用页表来记录这种关系
页表中一般包含==|有效位|脏位|替换控制位|访问权限位|禁止缓存为|存放位置|,物理地址(主存地址)的组成部分是|物理页号|页内偏移|,同理,虚拟地址也是|虚拟页号|页内偏移|==,MMU通过页表和虚拟地址找到其对应的物理地址
访问流程
- 不包含cache的访问流程:CPU给出虚拟地址,MMU将虚拟地址转换成物理地址,主存根据物理地址给CPU返回数据,由MMU检测页表有效位为0和页表已满以及缺页处理:
- 若页表项中的“有效位”为0,则表明所访问的页面不在主存中,MMU触发一次异常,调用操作系统内核中的缺页异常处理程序。
- 若主存中相应的页表已满,则需要根据替换算法确定哪个页面被替换。如果该页面的脏位为1,则把该页面调出到磁盘否则直接丢弃。
- 缺页处理程序从磁盘调入新的页面到主存,并更新相应的页表项。
- 缺页处理程序返回到原来的进程,该进程中之前引起缺页的指令会重新启动
- 包含cache的访问流程:CPU给出虚拟地址,MMU将虚拟地址生成页表项地址,若cache页表项命中,则cache将页表项返回给MMU,再由MMU生成物理地址,若cache数据块命中,则cache将数据返回给CPU;若cache页表项未命中,则到主存中获取页表项块,并载入到cache;若cache数据块未命中,则通过物理地址到主存中获取数据并载入cache
- 使用快表TLB加速地址转换:处理器内部有一个专门用于缓存经常访问的页表项,即快表,常采用全相联或组相联方式,TLB缺失时常采用随机替换算法
段式虚拟存储器
段式虚拟存储器
见操作系统课
段页式虚拟存储器
见操作系统课
其他知识点
符号标志
在一个引脚名称上加下划线(或者应该叫上划线?)或者在其后加上#表示低电平有效