存储器是计算机系统中的记忆设备,用来存放程序和数据
电脑断电后信息会全部丢失的存储器是随机访问存储器。
随机访问存储器是内存的一种。内存是电脑的记忆部件,用于存放电脑运行中的原始数据、中间结果以及指示电脑工作的程序。
内存可以分为随机访问存储器和只读存储器,前者允许数据的读取与写入,后者的信息只能读出,不能随意写入,即使断电也不会丢失。
ROM , 只读存储器,(顾名思义,只是读取调用,不能更改) 一旦储存资料就无法再将之改变或删除,也就是断电之后不会丢失。
RAM,随机存储器,存储单元的内容可按需随意取出或存入, 断电后数据就丢失。磁盘中的程序必须被调入内存后才能运行,中央处理器可直接访问内存,与内存交换数据。电脑断电后,随机访问存储器里的信息就会丢失。
①存取时间和存取单元位置无关(随机访问)
随机存储器(RAM)
只读存储器(ROM)
②存取时间和存取单元位置有关(串行访问)
③按照在计算机中的作用分类
计算机的主机由CPU和主存储器构成
CPU可以从主存中读取信息,也可以把信息存到主存中,但是主存的容量是有限的,如果程序足够大的话,主存是存不下的,需要辅助存储器帮忙存储,不过程序的运行还是得通过主存
主存由存储体(程序,指令,数据都是存储在存储体中),MAR,MDR构成
MAR当中保存了我们要访问的那个存储单元的地址,必须要进行译码器译码以后,我们才可以选定指定的存储单元
MDR中保存了我们读出或者写入的数据
这个数据是读出还是写入需要通过读写电路和控制电路来控制
如果是写入的话,则把数据从MDR送入指定的存储体的存储单元中
如果是读出的话,那么存储单元的内容就会被送到MDR中
方向的控制是由读写电路来控制的
数据总线完成CPU和主存的信息传输
地址总线给出要访问的内存单元的地址
假设存储字长为32位(对存储器的某一个单元进行读或写的话,一次最多读或写32位0,1),主存的编址单位是字节,每一个字节都有自己的地址。在这种情况下,一个存储字是32位,一个字节是八位,都有自己的地址。
那么12345678H这个数据怎么在主存储器中进行存储?
一种方法是高位字节地址作为存储器的地址(字地址),这种方式也叫大端方式
第二种方法是低位字节作为字地址,这种方式叫做小端方式
上面的计算我第一次学的时候,也是晕晕的,不知道什么意思,我找到了比较好的回答,大家一起学习。
简单来说, 如果是按字节寻址,那么字节的每一位都可以作为地址编号的一部分,如果是按字寻址,因为一个字由多个字节组成,就需要区分不同字节的位置,就会损失一定的位数。
几个常见单位换算来给大家说明一下
1Byte=8bit Byte简写为B,比特简写为b
1KB=2^10Byte
1MB=K*KB=2^20B
1GB=K*MB=2^30B
1TB=K*GB=2^40B
①存储容量 主存存放二进制代码的总位数
②存储速度
③存储器带宽
0,1代码放在存储矩阵中,里面存放每一个二进制位,存储矩阵由大量相同的位存储单元阵列构成。
地址线是输入的,CPU给出地址,外部设备给出地址,表示要存或者要取的数据在存储矩阵的哪一个存储单元中,通过译码驱动电路,选择指定的存储单元,完成读写操作
片选线是芯片选择信号,它指出了这次操作给出的地址是不是针对这个存储芯片的地址,被选择的存储单元是不是在这个存储芯片中。
片选线确定哪一个存储芯片被选中,可以用于容量扩充
16K × 1说明芯片的存储容量是16K,每一个存储单元保存1位信息。
如果我们用8个这样的芯片,对8个芯片同时进行读写,这8个芯片构成一组,这8个芯片就构成了16K × 8位的存储器
为了满足题目的需求,我们就应该布置4组这样的芯片。
每一组的8个芯片要同时进行工作
接下来对地址空间进行划分
第一组芯片: 0到16K-1
第二组芯片:16K到32K-1
第三组芯片:32K到48K-1
第四组芯片:48K到64K-1
如果我们要访问的地址是65535,也就是64K-1,按照我们划分的规则,它应该在第四组芯片,此8片的片选有效。片选信号看到这个地址后,就选择第四组芯片,其他三组芯片的片选信号是无效的,也就是高电平,最后一组对应的信号是低电平,也就是有效的。
片选信号的作用是让某个芯片或者某些芯片同时进行工作。
什么叫做译码驱动方式?
译码驱动方式就是说,给出存储单元的地址后,怎么找到指定的存储单元,可以有两种方式来找到指定的存储单元,这两种方法是:
①线选法
②重合法
线选法
给出A0到A3四位地址,说明有16个存储单元,每一个存储单元有多少位,就需要看数据线,数据线是从D0到D7,说明有8位,这个存储器是16×8
接下来看看工作过程
如果给出的地址是全0,被译码后的信号只有0的这根线是有效的,其他的线是无效的。
如果现在进行的是读操作,读信号会控制电路的通路打开,使数据可以从存储矩阵送到数据总线上,只有给定的单元才可以数据的输出
这种方法对容量稍微大一点的芯片来说是不合适的
重合法
线性法进行布局的时候,实际上是把它布局成线性数组,重合法进行布局的时候,实际上是把它布局成二维阵列
行地址和列地址都只能有一条线是有效的
信息重写的过程叫做刷新
存储器就应该要有存储元件,存储元件要能保存0,1,学习静态RAM我们需要考虑下面的几个问题:
T1~T4触发器是双稳态的触发器,一端是触发器的Q端,另一端是触发器的非Q端。 T1~T4解决了用什么样的电路来存储0,1
T5,T6是行开关,用来解决我们对存储元件进行读或写,是由行地址选择来控制的,一旦行地址选择有效,这两个管子就会有效
T7,T8是一列共用
静态RAM的读操作
静态RAM的写操作
①Intel 2114外特性
WE是是读写控制线,当WE是低电平有效的时候,表示写操作。CS信号是片选信号,只有CS信号是低电平的时候,2114芯片才会被选中
A0~A9是地址线,一共有10条地址线,说明2114芯片有1K个存储单元。
I/O1~I/O4一共有4个数据线,每个存储单元被选中可以读出或写入4位信号,说明每个存储单元有4个基本电路
这个芯片的存储容量是1K × 4位,一共是4K个基本单元电路
②Intel 2114RAM矩阵(64×64) 读操作
③Intel 2114矩阵(64×64)写操作
需要注意下面的几个问题
动态RAM可以用电容来保存0和1,电容中如果存储电荷,我们认为它存储的信息就是1,如果电容没有被充电,也就是没有电荷,我们认为保存的信息就是0
信息保存在电容Cg
T1~T3是控制管,通过这三个控制管,进行读出和写入。
如果读选择线有效,那么T2这个管就会导通
如果写选择线有效,那么T3这个管就会导通
接下来看基本工作过程
T4是预充电管,如果预充电信号有效的话,T4就会打开,VDD通过T4对读数据线进行充电,使读数据线变成高电平。如果我们进行读出的话,读选择信号线有效,T2这个管子导通。假设Cg中保存的信息是0,Cg这个电容没有进行充电,T1不会导通,读数据线就会保持高电平。
读出与原存信息相反
写入与输入信息相同
①三管动态RAM芯片(Intel 1103)读
有10根地址线,说明芯片的存储容量是1K,每次读出或写入只有1位
行地址经过译码以后产生的信号,每一个每一行都对应两个控制信号,读选择信号和写选择信号,读和写用不同信号来控制。在行地址译码器中,参加译码的不仅有地址,还有读写控制信号。如果是读控制信号,则读选择线有效
来看看读操作
以上面的图为例,如果行地址是0,进行的是读操作,则第0行的读选择线有效,第0行的所有单元都被选中,要进行读操作。
列地址是5个0,则第0列被选中,那么第0行和第0列交叉的单元被选中,这个单元通过读数据线把数据送到读写控制电路中,同时可以向外进行输出,就完成了读操作
为什么需要使用刷新放大器?
因为我们是采用电容存储电荷的原理来存储信息的,电容会漏电,经过一段时间后,电容上的信号会消失
②三管动态RAM芯片(Intel 1103)写
③单管动态RAM 4116(16K ×1位)外特性
从容量上来看,16K我们需要14根地址线,但是4116芯片只有7根地址线,实际上它需要14个地址,这14个地址是分两次来进行传送的。
第一次7根地址线接收到的是行地址,然后存在行地址缓存器中,然后接收7位的列地址,行地址和列地址经过译码以后,选中指定的单元进行输入和输出。I/O缓冲器完成数据的输入和输出的缓冲
行地址和列地址分别存储在行地址缓存器和列地址缓冲器,经过译码以后,选择指定的存储单元,然后在读写信号的控制下,完成对存储单元的读和写操作
这个芯片有自己的小的控制器,就是最上面的那个时序与控制的图,有行选通信号,列宣统信号和读写控制信号作为输入,产生行时钟,列时钟和写时钟。行时钟,列时钟控制了内部的读和写操作
④4116(16×1位)芯片读原理
16K的基本单元电路放在128行,128列上,上面的图像中,竖的是行,横的是列。
读放大器的一端如果是1的话,那么另外一端就是0
在读放大器的左边,如果电容有电,那么传出来的数据就是0,如果读放大器的右边,电容有电,传出来的数据就是1
⑤4116(16×1位)芯片写原理
动态RAM是通过电容存储电荷的原理来存储信息,电容做得很小,容易漏电。如果一段时间内,我们不对电容的信息进行重写的话,那么信息就会丢失
刷新只和行地址有关
每次刷新操作都刷新动态RAM的一行所有的基本单元电路,每次刷新都是刷新一行的所有数据
如何刷新? —有硬件指出,读出一行的信息后重新写入,占用1个读/写周期。
接下来看看在什么时刻进行刷新
①集中刷新(假设存取周期是0.5μs)
动态RAM中的电容要刷新的话时间一般是2ms。以128×128矩阵为例
集中刷新是在规定的一个刷新周期内,对芯片存储单元集中一段时间逐行进行刷新,此刻必须停止读/写操作。
集中刷新就是把刷新时间集中在一起,在2ms内要求对所有的行进行刷新,动态RAM有128行,要求2ms内对这128行进行刷新
若存取周期为 0.5 μs,刷新周期为 2 ms(占 4 000 个存取周期),则对 128 行集中刷新共需 64 µs(占 128 个存取周期),其余 的 1936 µs(共 3 872 个存取周期)用来读/写或维持信息。由于在这 64 µs 时间内不能进行读/写操作,不管是CPU还是I/O都无法和动态RAM进行信息交换,所以这段时间是不能用的,称为“死时间”,又称访存“死区”。
如果在死区,CPU或者I/O需要进行时间的读出或写入,就必须进行等待
②分散刷新(存取周期位1μs)
分散刷新是指对每行存储单元的刷新分散到每个存取周期内完成。
其中,把机器的存取周期 tc 分成两段,前半段 tM 用来读/写或维持信息,后半段 tR 用来刷新,即 tc = tM + tR。
若读/写周 期为 0.5 μs,则存取周期为1μs。
仍以 128 x 128 矩阵的存储芯片为例,刷新按行进行,每隔 128 μs就可将存储芯片全部刷新一遍,2ms的话每行被刷新了15.6次,被过度刷新了,降低了性能
③分散刷新和集中刷新结合(异步刷新)
如果2ms要刷新128行,那么每经过15.6μs刷新一行就可以了,我们就把2ms分成128份,每一份15.6μs在每一段时间里面,对其中的某一行进行刷新
|
| |
---|---|---|
|
|
|
集成度 |
|
|
芯片引脚 |
|
|
功耗 |
|
|
|
|
|
速度 |
|
|
刷新 |
|
|
应用 |
|
|
只读存储器一般用来保存系统程序或者系统信息,开机后的一些信息,其他更详细的信息放在RAM中,ROM通常保存一些固定的信息
接下来看看ROM的发展历程
PROM (一次性编程)
EPROM(多次性编程)
N型沟道浮动栅 MOS电路(可用紫外线照射擦除,费时间)
CPU执行的指令需要的数据都保存在主存储器中,运行的结果也保存在主存储器中,所以CPU和存储器要进行正确的连接,才能实现他们之间信息的交换
一般来说,CPU的地址线比较多,寻址范围也比较大。要构成主存储器,需要多个存储芯片共同组成。
单片存储芯片的容量有限,需要将若干存储芯片连在一起组成具有足够容量的存储器
所需芯片数量的计算公式
位扩展:增加存储器的横向容量
字扩展:增加存储器的纵向容量
用2片1K×4位的存储芯片组成1K×8位的存储器
两个芯片要能同时工作,也就是要把两个芯片的片选用相同信号连接
增加存储字长
多个存储芯片的三组信号线关系
地址线和控制线公用
数据线单独分开
增加存储单元的数量
多个存储芯片的三组信号线关系
地址线和数据线公用
读写控制线公用
片选使能控制线独立,通过地址的高位字段进行译码决定
2个芯片不能同时工作
对第一个芯片来说,它用的地址线是A0~A9,如果A10为0,我们就选择第一个芯片,A10如果为1.我们就选择第二个芯片,A10就是我们的片选信号
从00000000000~01111111111 ,这1K的存储空间分配给第一个芯片
从10000000000~11111111111 ,这1K的存储空间分配给第二个芯片
通过A10,A11来判断我们要访问的芯片是哪一组
00选择第一组芯片
01选择第二组芯片
10选择第三组芯片
11选择第四组芯片
可以使用24译码器
①写出对应的二进制地址码
我们可以看成出A15到A11是固定的,A10到A0是连续的地址,从全0到全1,一共是2K×8位,这部分存放系统程序
我们可以看成出A15到A10是固定的,A9到A0是连续的地址,从全0到全1,一共是1K×8位,这部分存放用户程序,1K×8位我们可以用两个1K×4位的芯片
②芯片的选择
对应系统程序区,我们应该选择ROM,用1片2K×8
用户程序区要可读可写,选择RAM,用2片1K×4
③分配地址线
根据74138译码逻辑关系,必须保证控制端G1为高电平,G2A和G2B为低电平,译码器才能正常工作
A15始终为低、A14始终为高,分别接G2A和G1;而MREQ低电平有效,接G2B
剩下A13、A12、A11,分别接译码器的输入端C、B、A译码结果为4(Y4有效),选中ROM;译码结果为5(Y5有效),与A10一起通过与门,都为低电平有效时,选中2片RAM
例题
存储器里面存放的数据如果发生错误,就会导致我们运行的程序错误,所以要对存储器的信息进行检验
要解决的问题
编码的检测能力和纠错能力与任意两组合法代码之间二进制位的最少差异数有关
如果出错后的代码依然是合法代码,计算机压根检测不出出错的代码
编码的最小距离
编码的最小距离就是指任意的两组合法代码之间二进制位数的最少差异
编码的纠错,校错能力和编码的最小距离有关
相关的检验方法详细看本专栏的第二章
假设CPU是16位,存储器的存储字长是64位,CPU每一次访问存储器,都可以访问出4个机器字,这4个机器字,每一个都可以是一条机器指令,又或者是长度为16的数据。
CPU一次把这四个值取出放在数据寄存器中,下一次在用的时候,就可以直接把需要使用的指令或数据取走,用这种方法可以增加存储器的带宽。
但是这种方法也有问题,假设现在CPU要向存储器中某一共个存储单元写一共长度为16的字,它要先把字写到单字长寄存器中,然后再写入到4个字长的数据寄存器中,之后再写到存储器中。这样产生的问题就是,我们可能只需要写一个16位,但是其他的48位也会写到给定的存储单元中,这就会造成给定的存储字有48位被修改了,这个修改可能是错误的修改.
第二个问题,如果我们要取出的数据或指令不是连续的存放在相邻的指令中的,那么我们取出的指令可能就只有一条是有用的,其他的指令并没有用
出现这些问题的原因:虽然每一个存储单元包括四个机器字,但是这四个机器字存取的时候是以整体的方式进行存取的
为了解决这个问题,我们可以采用多体并行的方式
多体并行系统
(1)高位交叉 顺序编址
(2)低位交叉 各个体轮流编址
低位交叉的特点
在不改变存取周期的前提下,增加存储器的带宽
高性能存储芯片也可以提高访问速度
(1)SDRAM(同步DRAM)
在系统时钟的控制下进行读出和写入
CPU无需等待
(2)RDRAM
主要解决存储器带宽问题
(3)带Cache的DRAM
在DRAM的芯片内集成了一个由SRAM组成的Cache,有利于猝发式读取
Cache是为了避免CPU空等现象
CPU空等现象:IO设备与cpu都需要访问内存,IO设备优先级较高,速度较慢,因此cpu需要等待IO访问内存从而出现空等现象。将热点数据缓存在Cache中可以有效避免cpu空等现象,直接从缓存中访问数据.
CPU和主存(DRAM)的速度差异
程序访问的局部性原理
时间局部性原理:当前正在使用的数据或指令在不久的将来还会被使用,那么当前正在使用的指令或数据,我们应该放到Cache,将来在使用的时候,就直接从Cache中取出
空间局部性原理:当前正在使用的数据或指令在不久的将来,相邻的指令或数据可能被用到,我们就把当前正在使用的数据或指令从内存中放到Cache,同时还需要把相邻的指令和数据也放入到Cache中。
(1)主存和缓存的编址
我们把主存和Cache分成大小相等的块,主存有M块,Cache有C块。主存的容量远大于Cache的容量,即M>>C
如果我们把主存和Cache分成若干块,那么CPU给出的内存地址就可以分成两个部分,一部分是块内偏移地址,它的位数决定块的大小,比如说一个块包含16个字节,并且内存的编址单位是字节,那么块内地址部分就是4位,剩余部分就是主存块号。
一个块在内存和Cache之间传送的时候,是整体进行传送,块内字节顺序不会发生变化。
所以,内存的块内地址部分和Cache的块内地址部分的值是完全相同的。
Cache中的标记,标记了主存块和Cache块之间的关系。如果一个主存块调入Cache块中,我们就可以把主存块号写到标记当中。将来CPU给出一个内存地址,它希望在Cache中访问到这个数据,它要首先确认这个块是否已经送到了Cache中,它就需要拿给出地址的主存块号和Cache中的标记进行比较。如果和某一个标记刚好相等,并且这个Cache块是有效的,这个块里面就保存了在内存中要访问的信息,它就可以直接从Cache中获取这些信息,它的速度就会大大提高
主存和缓存是按照块来存储的,块的大小相同
命中和未命中
缓存有C块,主存有M块,M>>C,主存中只能有部分块被缓存到了Cache中。
在CPU访问主存时,如果要访问的主存块已经调入缓存中,它的缓存能取到相应的数据,就说命中
命中,就说明主存块和缓存块建立了对应关系,可以用标记记录与某缓存块建立了对应关系的主存块号
如果要访问的主存块没有调入缓存,那么就说未命中
Cache命中率
命中率: 就是在Cache中访问到CPU要访问的字块的概率。设Nc表示访问Cache的总命中次数,Nm未访问主存的总次数,即未命中次数。命中率h=Nc/(Nc+Nm)
命中率与Cache的容量和块长有关。
一般每块可以取4~8个字
块长取一个存取周期内从主存调出的信息长度
Cache-主存系统的效率
效率e和命中率有关
CPU要访问内存的话,它要给出地址,包括块号和块内地址,由于Cache和主存之间是以块为基本单位传输数据的,所以主存的块内地址可以直接送到Cache的块内地址,或者形成Cache的块内地址
我们利用块号在Cache的地址映射变换机构中,去确认是否发生命中。如果发生命中的话,需要给出当前的内存块保存在哪一个Cache块中。如果没有命中,就需要查一下,Cache中是否还有空间可以存入主存块,如果有的话,就访问主存,把主存块装到Cache块中;如果没有空间的话,那么主存块装入的那些Cache块都是满的,我们就要启用Cache替换机构,由Cache的替换机构根据替换算法,来算出哪一些块要从Cache中退出,写回到主存,或者直接作废,并且把主存中要用的块写入到Cache块中,这就是Cache替换机构要做的
地址映射:
主存中的一个块如果要放到Cache中,它可以被放到Cache的哪一个块或哪一些块中。
变换:
把主存的块号转变成相应的Cache块号,或者把主存的地址转变成相应的Cache的地址,然后在Cache中找到相应的主存块进行访问
在主存和Cache之间是有一条直接通路的,通过这条通路,可以完成主存和Cache之间的信息交换
我们的信息以块为基本单位保存在Cache存储体中
读操作
读操作是由CPU发出的,CPU发出这个访问地址,由Cache的地址映射和变换来确认是否发生命中。如果命中,就直接从Cache取出信息。若未命中,则需先判断,Cache是否已满,即是否可以直接将主存中对应的块装入Cache,若是,则访问主存,通过数据总线先将指令和数据传送给CPU,再通过直接通路,将指令和数据传送给Cache缓存。如果Cache已满,则需要通过Cache替换机构来访问主存并替换Cache中的某一个块。
写操作
读操作是不会对内存中信息进行修改的,但是写操作可能造成主存和Cache中的信息不一致。
写操作需要解决Cache和主存的一致性问题,可以采用写直达法和写回法
①增加Cache的级数
片载(片内)Cache
片外Cache
②统一缓存和分立缓存
有效位0用来代表Cache还没有存入数据,1表示里面有数据
直接映射就是说主存中任意给定的块只能映射在某一个指定的Cache块中,每一个Cache块可以和若干个主存块对应
根据主存储体和Cache存储体的大小,把主存储体划分成若干个和Cache存储体相等的区域,每一个区的大小和Cache存储体的大小相同,每个区包含的字块数和Cache存储体包含的字块数相同
主存储器中的字块也进行分区,每个区的大小和Cache中的组数相同,Cache被分成几组,主存储器的每一个区就包含多少块