一、多模块存储器
因为双端口RAM不考,那老子学408的直接不学!!!节省时间只学【多模块存储器】
为什么要有多模块存储器?他要解决什么问题?(会考概念)
所以记住,【多模块存储器】主要是为了:
1、单体多字存储器
非重点,了解一下即可
总结一下人话:
- 只有【1个存储体】
- 每个存储单元存储m个字(在原本1个存储单元1个字的基础上,把m个小存储单元合并成1个大存储单元)
- 数据总线宽度也为m个字,能1次并行读出m个字
- 每次只能同时取m个字,不能单独取其中某个字
注意缺点:
只有【指令】和【数据】在主存中连续存放时,这种方法才能有效提升存取速度;
一旦遇到转移指令、或操作数不能连续存放时,这种方法的提升效果就不明显
(因为每次只能同时取m个字,不能单独取一个字)
然后记一下,跟【位扩展】方式完全相同
2、多体并行存储器
多体交叉存储器由多个存储模块(可理解成多个内存条)构成
- 这些模块的容量和存取速度相同
- 各模块都有独立的读写控制电路、地址寄存器和数据寄存器
- 它们既能并行工作,又能交叉工作
根据对多个模块编址方式的不同又分为以下两种:
- 高位多体交叉
- 低位多体交叉
在这之前我们需要知道一个事情:
- 程序指令通常都是在存储体中【连续存放】的(大部分情况)
- 多体并行存储器的【主存地址】分为【体号(模块地址)】+【体内地址(块内地址)】
- 【体号(模块地址)】就是代表是哪一个存储模块,【体内地址(块内地址)】就是这个模块内一个存储单元的地址(谁在高位、谁在低位,取决于不同的编制方式)
(1)高位多体交叉编址
概念考点
记住考点:
- 【体号(模块地址)】在主存地址的【高位(也就是左边)】!!!!
- 高位多体交叉编址是【顺序存取存储器】,存储方式是【串行访问中的“顺序存取”】:
- 可以发现一个模块存满了之后,【该模块最后的存储单元的主存地址】加1就是【下1个模块的第1个块存储单元的主存地址】,可以看出每个模块都是按顺序连贯着读写的,而不是并行
缺点(原因)
顺序存取的效率很慢,存取周期长。为什么:
- 1、因为【存取周期T】分为【存取时间】+【恢复时间】,假设T=4r,读写花了r,恢复时间花3r,但是因为只有一个再生电路能恢复存储单元,在恢复时间里其他单元也必须干等着上一个存储单元的恢复时间结束才能开始读取
- 2、一个程序的【指令】和【数据】基本分布在同一个主存模块,那么当一直频繁访问一个主存模块时,别的模块处于空闲状态,就没法实现多模块并行工作
由于这种顺序连续访问,导致效率不高,所以这种多模块存储器实际上只是起到了【扩容】的作用(注意:因为扩展多个存储体,因此是按【字扩展】)
耗时计算
访问n个存储字的耗时:【nT】(T是一个存储周期)
(2)低位多体交叉编址
概念考点
记住考点:
- 反过来【体内地址(块内地址)】在主存地址的【高位(也就是左边)】!!!!
- 低位多体交叉编址允许在【1个模块的恢复时间内】不用等,直接访问【下一个模块】(高位多体交叉编址只允许【一个模块按顺序访问完,再访问下一个模块】)
- 可以发现,整个地址的顺序是【从左往右递增】的
- 采用低位多体交叉编址方式的存储器叫【交叉存储器】
是属于【随机存储器】- 【宏观上】每个存储周期内所有模块被【并行访问】
【微观上】m个模块被【串行访问】
为提高顺序访问时各存储模块的并行性,低位多体交叉(交叉编址模式)中各存储模块均有独立的:地址寄存器、数据寄存器、读写控制电路
耗时计算
简单来说就是记公式:
- 访问n个存储字的耗时:【T + (n-1)r】
- T 是一个【存储周期】
- r 是一个【总线周期】,你可以理解是【读写时隙】
- 注意:
;
至于为什么自己看吧:
【低位交叉编址】的访存冲突
首先注意:
- 【4体交叉编址存储器】意思就是1个多体并行存储器,有【4个存储体】
- 虽然它既可以是【高位交叉编址】也可以是【低位交叉编址】,但是题目一般都是指【低位交叉编址】(因为高位交叉编址没有好讨论的意义,看下去你就知道了)
;
【访存冲突】是啥?
我们前面说过不管是【高位交叉编址】还是【低位交叉编址】,在微观上都“串行”
- 高位交叉编址:必须连续纵向地访问一个存储体的单元,而且一个单元必须等上一个单元刷新完才可以访问
- 低位交叉编址:则允许横向访问不同存储体的单元,但是也是有两个条件
- 第一:上一个单元要进入【刷新时隙】的时候才可以访问下一个
- 第二:但是也绝对绝对不能在一个存储体内纵向连续访问!!!宏观的“并行”也只是在不同模块横向访问可以
;
综上所述,总结
- 高位交叉编址不考【访存冲突】,因为【不适合连续访问】的情况!!!横向、纵向都会导致冲突(就像你拉屎不能连这一坨接一坨拉,要拉一坨休息半天,然后再拉一坨......)
- 低位交叉编址才考虑【访存冲突】,因为【适合连续访问】,那么很简单:
- 先看整个地址的二进制形式,然后【低位(log2M)】才是【存储体体号】
注意:2进制1位能表示2种情况、2位能表示4种情况、3位表示8种情况......所以有M个存储体,就用log2M表示【体号地址位数】
- 只要是横向连续访问就没事,纵向连续访问必冲突!!也就是在【一个模块内】连续访问就出事!!!
【轮流启动】和【同时启动】
最后还有这么一个考点
- 【轮流启动】:就是我们前面一直说的,读一个单元接着一个单元的连续读
- “宏观相当于并行、微观实际是串行”
- 轮流启动形式下,假设4个存储体,读4个存储单元就是【T + (4 - 1)*r = T + 3r = 2T】(假设一个存储周期4r,一个总线周期1r,然后 “3r” 没满一个存取周期T,也要算一个存取周期T)
- 【同时启动】:当【数据总线宽度(位数)】等于【所有存储体(模块)的同一行单元大小总和】时,可以同时把这几个存储体的这一行同时读走
- 不再是“宏观并行、微观串行”了,是【真正的并行】访问所有存储体的同一行
- 那么假设4个存储体,读4个存储单元就是【1个存取周期(读一行)】
不过还要注意,还是上面这个例子,现在假设【读取时隙是1r】,【存取周期T=4r】
- 就算同时启动时【1r】内能同时读完【4个存储单元(1行)】,也不能在【2r】马上开始读下一行
- 要记得,【一个存储周期4r】里,每个存储体的存储单元都还剩【3r】的【恢复/刷新时隙】,所以还至少要等【3r】才可以开始下一轮读取(一个存储体内不可以在一个单元的刷新时隙内读别的单元!!)
(3)应该要几个模块?(几个内存条)
结论:
为啥?自己看:
注意一个模块内【要读一个存储单元】必须等【上一个存储单元恢复时间结束】