存储器是计算机系统中的核心部件之一,用来存放程序和数据。有了存储器,计算机才具有记忆信息的功能,才能把计算机要执行的程序、要处理的数据以及处理的结果存储在计算机中
由半导体器件组成的存储器,当电源消失时,所存储信息随之消失,为一种易失性存储器
半导体存储器分类(按照组成材料不同)
双极型(TTL)半导体存储器:工作速度快,与CPU处在同一量级,但是集成度低、功耗大、价格偏高
MOS半导体存储器:高集成度,制造简单,价格低廉,功耗小,但是速度较双极型器件慢
在金属或塑料基体的表面涂上一层磁性材料作为记录介质,工作时磁层随载体高速运转,磁头在磁层上进行读写操作,按照剩磁状态的不同而区分"0"和"1",具有非易失的特点
磁表面存储器分类(按照载磁体形状不同)
磁盘
磁带
磁鼓(已经基本不使用了)
由硬磁材料做出的环状元件,在磁芯中穿有驱动线(通电流)和读出线,这样就可以进行读/写操作,磁芯为磁性材料,所以也是一种非易失的永久记忆存储器
由于体积过大,工艺复杂,功耗大,于是已经基本不使用了
应用激光在记录介质(磁光材料)上进行读/写的存储器,具有非易失性的特点
也被称为随机存储器或者读写存储器,存取时间和存储单元的物理地址无关,为一种可读/写存储器,在存储器的任何一个存储单元的内容都可以随机存取,存取的时间和存储单元的物理位置无关(计算机的主存都采用这种随机存储器。一般的RAM芯片,关闭电源以后所存信息将全部丢失,故RAM常用来暂存运行的程序和数据。高速缓冲存储器Cache就是使用高速的静态RAM组成的小容量存储器
早期的ROM因为技术不成熟所以无法擦写,出厂后就只能读数据,所以叫只读存储器,即一但存储了原始信息以后,在程序执行的过程中,只能将内部信息读出,无法随意改变原始信息。掉电以后所存信息不会丢失,故ROM通常将其用来存放固定不变的程序、常数、汉字字库,甚至用来进行操作系统的固化,ROM的内容是由生产厂家或者用户使用专用设备写入固化的。存数据的时间和存储单元的物理位置无关。只读存储器和随机存储器可共同作为主存的一部分,统一构成主存的地址域
硬盘和ROM的关系
由于ROM和硬盘都可以存储数据而且断电不会丢失,而且都广泛运用于电子产品中,所以很容易对两者产生混淆,这里进行一个大概的区分:硬盘分为两种,一种是机械硬盘(即磁盘HDD),一种是固态硬盘(SSD),机械硬盘和ROM没什么关系,但是固态硬盘用到的存储颗粒基于NAND FLASH闪存技术,该技术ROM技术发展的产物,所以说硬盘和ROM还是多多少少有些关系的,但不能说ROM就是硬盘
对存储单元进行读/写操作时,需要按照存储单元的物理位置的先后顺序寻找地址,根据信息所在物理位置的不同,存取时间会有所差异,即存取的时间和存储单元的物理地址相关
用在两个速度不同的部件之间,比如CPU和主存之间实现二者速度的弥补,起到一个缓冲作用
一个熟悉的缓冲存储器就是高速缓存存储器Cache(一般使用静态RAM构成),速度高于主存
1、缓冲区属于内存空间,是内存空间的一部分。我们在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据(就像人落地的时候,需要进行一个缓冲一样,数据的传递也需要一个缓冲),然后我们把这部分预留的空间就叫做缓冲区
buffer的全称其实为buffer cache,偏重于写,一般被称为写缓存write cache
在没有加入缓冲区概念的时候,应用程序都是直接将内存中的数据传递给硬盘空间,但是由于内存相对于硬盘来说,速度极快,这样整体数据传递的速率就会因为硬盘速率低而过慢,导致内存中的应用程序效率过低
在加入缓冲区的概念后,应用程序可以先将数据交给同在内存中的缓冲区,然后就可以执行其他任务(由于同在内存中,所以这个数据传递过程是极快的),在缓冲区中将要写入硬盘的数据暂存下来后再将缓冲区中的数据传递给硬盘空间,等缓冲区的数据取完后再次进行缓冲区的数据填充,这样就可以减少磁盘的读写次数,所以应用缓冲区可大大提高计算机的运行速度(比如原来是每秒要写100次硬盘,对系统冲击很大,此时用缓冲区将数据暂存起来,就会变成每10秒写一次硬盘,对系统的冲击就很小,写入效率也高了)
2、CPU中的Cache的中文名称是高速缓冲存储器。根据程序的局部性原理,当计算机执行程序时,数据与地址管理部件会预测可能要用到的数据和指令,并将这些数据和指令预先从内存中读出送到Cache。一旦需要时,先检查Cache,若有就从Cache中读取,若无再访问内存。Cache就是用来解决CPU与内存之间速度不匹配的问题,避免内存与辅助内存频繁存取数据,这样就提高了系统的执行效率
cache偏重于读,一般被称为读缓存read cache
可以和CPU直接交换信息
为半导体存储器,速度高于磁盘,低于主存,可以在主存和辅存之间实现二者速度的弥补,起缓冲作用,U盘就是使用闪速存储器制作的,闪速存储器可以在一些高性能计算机中作为硬盘
实际上,闪速存储器是在只读存储器EPROM和EEPROM的工艺基础上产生的一种新型,可靠性更高的可擦非易失性存储器,具有整片擦除的特点,对于需要周期性修改存储信息的应用场合,闪速存储器为一个极其理想的器件,因为其至少可以擦除/编程10000次
为主存的后援存储器,用来存储当前暂时不需要的程序和数据,不能和CPU直接交换信息
存储器具有三个性能指标:速度,容量,每位价格。一般来说速度越高,位价越高;容量越大,位价越低;容量越大,速度必然越低
由存储器的性能指标之间的关系,可见人们追求的大容量、高速度、低位价的存储器是很难实现的,于是我们提出了存储器的层次结构,来尽可能解决这个矛盾
该图中,由上至下,存储器价位越来越低,速度越来越慢,容量越来越大,CPU访问的频度也越来越少
存储体系:指使用两种或者两种以上的存储介质,用软件、硬件、或者是软硬件相结合的方式将它们链接成一个统一的整体,使得从某一级程序员的角度出发,这个整体(即表明对于程序员来说这个整体是透明的)具有高速度、大容量、低价格的特点
缓存-主存这一层次的速度接近于缓存,而容量和价位却接近于主存
主存-辅存这一层次的速度接近于主存,而容量和价位却接近于辅存
于是可以发现,这样的缓存、主存、辅存三级结构(由两个存储体系构成)解决了前面提到的矛盾,现代计算机系统几乎都具有这两个存储层次
主要解决CPU和主存速度不匹配的问题,于是采用硬件的方法把缓冲主存链接为一个存储体系
解决方式:由于缓存的速度比主存高,于是只要将CPU近期要调用的信息存入缓存(使用了程序的局部性原理),CPU即可直接从速度较快的缓存中获取信息,提高了访存速度。但是同时由于缓存的容量较小,于是需要不断地将主存的数据存入缓存中,使缓存原来的数据被替换掉,这个过程是硬件自动完成的,对程序员来说是透明的
主要解决存储系统容量的问题,于是采用软硬件相结合的方法把主存辅存链接为一个存储体系
解决方式:辅存的容量比主存大得多,当CPU需要辅存中的数据时,再将辅存的信息存入主存,供CPU直接访问,主存和辅存之间的信息调动是由硬件和操作系统共同完成的
虚拟存储器是为了满足用户对存储空间不断增长的需求而提出的一种计算机存储器管理技术,它是建立在主存-辅存这一物理层次结构基础之上,由辅助硬件及操作系统存储管理软件组成的一种存储体系。在这个存储系统中,程序员编写的程序的地址范围与虚拟存储器的地址空间相对应,即程序员编程的时候,可用的地址空间是远远大于主存空间的
虚实地址的转化
对虚拟存储器的直观描述(可能并不那么正确)
主存的基本结构在"计算机系统概论"那篇文章中已经进行了粗略的讲解,此处进行细化和补充
实际上,根据MAR中的地址访问某一个存储单元时,存储器内部还需要经过地址译码、驱动等电路的运行,才能找到所需访问的存储单元。将地址线接入译码器,从译码器输出端接出的线称为选择线,用于选定译码器指定的存储单元
实际上,读出数据时,存储器内部还必须经过读出放大器,才能将被选中的存储单元中的存储字送到MDR中;写入时,必须经过写入电路,才能将数据写入被选中的存储单元中
不同的机器,存储字长也不同,为了满足字符处理的需要,常用8位二进制表示一个字节,同时存储字长都设定为8的倍数。计算机系统既可以按照字(即存储字长)进行寻址,也可以按照字节进行寻址,即可以使用字地址和字节地址两种地址实现存储器中数据的定位
下面使用大端存储和小端存储两种不同的方式存储同一个十六进制数12345678为例(注意1为最高位,8为最低位)对主存储器存储单元地址的分配方式进行进一步的展示(这里的"大端存储和小端存储"中的"大端"和"小端"即为文章——C语言存储篇中提到的"大端"和"小端"的概念)
指主存可以存储的二进制代码的总位数,即存储容量=存储单元个数 * 存储字长,计算出的存储容量的单位为"位"(容量也可以使用字节总数来表示,即存储单元个数*存储字长/8,计算出的存储容量的单位为MB,GB,TB等单位)
对于一个存储芯片而言,容量是以位为单位描述的(比如4K x 8位);对于一个微机系统而言,容量是以字节为单位描述的(比如1MB)
存储速度是由存取时间和存取周期来表示的
半导体存储芯片采用超大规模集成电路制造工艺,在一个芯片内部集成具有记忆功能的存储矩阵、译码驱动电路和读/写电路等(与存储器相关的MAR和MDR制作在了CPU中)
用于存储0、1代码的一块区域
负责把通过地址总线送来的地址信号翻译成对应存储单元的选择信号,该选择信号在读/写电路的配合下即可实现对被选中存储单元的读/写操作,即存储器的译码驱动
包括放大器和写入电路,用来完成CPU对存储芯片的读/写操作
存储芯片通过地址总线、数据总线和控制总线与外部连接
地址线和数据线的位数共同反映了存储芯片的容量(类比于MAR和MDR的位数共同反映了存储体的容量),比如地址线有10根,数据线有4根,则芯片容量为( 2 10 2^{10} 210)* 4,通常使用1K * 4这样的形式来表示芯片容量(4表示的是数据线个数,即存储字长的位数,1K表示的存储单元总数,每一个地址对应一个字节的空间)
片选线工作的例子:
如果使用 16K x 1位 的存储芯片要组成 64K x 8位 的存储器
由于存储器中的每一个存储单元的容量为8位(一个字节),而存储芯片的存储单元的容量为1位,于是我们要将8个存储芯片看作一组,在进行存储器读/写操作的时候,必须要同时对绑定为一组的这8个存储芯片同时进行读/写操作,此时每一组芯片的容量为 16K X 8位,由于64为16的4倍,所以还需要增加4组这样的 16K x 1位 芯片才能满足要求,形成一个 64K X 8位 的存储器
进行地址编号分配的时候,由于同一组的8个芯片要同时工作,所以每一组共用地址数目为16K的地址编号和一根片选线(8个芯片要么全部被选中,要么全部都不被选中)。比如,当我们需要地址编号为65535(64K-1)对应存储器中的数据时,我们就会将该地址编号对应的那一组的8个存储芯片的片选信号同时置为低电平(8个存储芯片同时处于有效状态),同时其他组的芯片的片选信号全部置为高电平(其他存储芯片同时处于无效状态),从而实现仅仅对此组的8个芯片同时进行存储单元进行访问(在8个芯片相对应的同一位置的那个存储单元处同时读出一位,从而取出地址编号为65535对应存储器中的那8位数据)
数据线有8根,表示每一个存储单元的位数有8位(一个字节);地址线有4根,表示每一个存储单元的总数为16个,所以存储容量表示为16 * 1字节
选中存储单元的方式
特点
数据线只有一根,表示每一个存储单元的位数只有一位;地址线有10根,表示每一个存储单元的总数为 1K 个,所以存储容量表示为 1K * 1位
选中存储单元的方式
对于图中的矩阵,使用了64根线(X,Y两个方向的译码器输出端各具有32根),与线选法不同的是此时每一个存储单元具有行、列两个地址,通过确定行、列地址,即可实现对该 32X32 矩阵的中每一个存储单元的访问(只有当一个存储单元的行地址和列地址都被选中时,才能对该存储单元进行访问)
比如,当地址线全为 0 的时候(即A9 A8 … A0全部为0),两个译码器输出 X0 和 Y0 有效,对应于矩阵中 0 行 0 列的那个存储单元被选中,只有这个存储单元才能进行数据的输入和输出
特点
实际上,在重合法中,在进行读操作的时候,被选中的行和列中的其他存储单元,自身也会进行数据输出,但是都不会到达I/O读写结构处,只有当一个存储单元的行地址和列地址都被选中时,才能让存储单元中的数据成功到达I/O读写结构处。类似地,进行写操作的时候也是因为是否具有通路的问题,而导致只有那个行地址和列地址同时被选中的那个存储单元,才能实现数据的输入
比如有20根地址线,采用重合法,我们需要两个译码器进行译码,这两个译码器的输入端分别连接10根地址线,则在译码器的输出端一共就可以产生2K根线,每两根相互垂直的线即可选中一个存储单元,这种方式相对于线选法节省了大量的线
本质来说,重合法是将所有的存储单元排成一个矩阵,只有将行地址和列地址进行组合,才是一个存储单元的完整地址
使用重合法进行存储单元选定的例子:
如何使用重合法实现一个容量为 1K X 4位 的存储器
一个 1K x 4位 的存储器表示每一个存储单元的位数为4,即我们要把4个基本单元电路(每一个基本单元电路本身可以存储一位比特位的数据)作为一组,同时要实现一根列线控制4个基本单元同时读/写有效,此时1K表示具有1024(210)个存储单元,又每一个存储单元为4位,于是需要26*26个基本单元电路(一个相互垂直的线选中一个基本单元电路)
那么我们可以将这些基本单元电路排布为一个 64 x 64 的矩阵,由于要实现的是一个列选信号同时控制4个基本单元电路,于是我们对应列地址的译码采用4个输入端,16个输出端的译码器,实现每一个输出端控制4列,而行地址依旧使用6个输入端,64个输出端的译码器,这样就可以实现:只要给出一个地址编号,就会同时有4个基本单元电路被选中
当行地址有效,该行对应的所有存储元的T5、T6都会打开,当列地址有效,该列对应的那个T7-T8就会打开,可以实现读/写操作
保存一位二进制代码的原理
基本构成
动态RAM基本电路的读/写操作
三管电路
单管电路
刷新
电容上的电荷一般只能维持1到2ms,即使电源不掉电,信息也会自动消失,为此,我们必须在这2ms内对所有的存储单元恢复一次原状态,这个恢复过程称为再生或者刷新
刷新的过程实质上为先将原存信息读出,在由刷新放大器形成原信息并重新写入的再生过程,在进行刷新的同时必须停止对存储单元的读/写操作
定时
由于存储单元被访问是随机的,这样就会导致某一些存储单元可能长期得不到访问。如果不进行存储器的读/写操作,这些存储单元内部的原信息会逐渐消失,为此必须使用定时刷新的方法,即在一定时间内,对动态RAM的全部基本单元电路做一次刷新,一般取2ms,这个时间我们称为刷新(再生)周期,刷新是一行一行进行的,而且必须使用专用的刷新电路完成逐行刷新
刷新方式
集中刷新
分散刷新
异步刷新
所以通常情况下,把DRAM作为主存,SRAM作为Cache
按照ROM的原始定义,一旦写入原始信息,就不能发生改变,但是随着用于需要的变化,总希望能够修改ROM内部的原始信息,这就出现了PROM、EPROM、EEPROM等,对于ROM来说,基本器件分为MOS型和TTL型
这里仅仅介绍MOS型掩模ROM
单片存储芯片的存储容量是有限的,一般不能满足实际需求,因此,必须将若干个存储芯片相连才能组成足够容量的存储器,这种操作称为存储容量的扩展,通常有位扩展和字扩展两种方式
指扩展存储字长
进行位扩展的时候,芯片的对应地址线是连接在同一条线上的,即存储数据的时候是在芯片的对应存储单元处进行存储,而数据线不是连接在同一条线上的,即对应的存储单元中存储的数据是不一样的, C S ‾ \overline{CS} CS、 W E ‾ \overline{WE} WE 都分别连接在一起,即进行读/写操作的时候,是同时进行读/写操作的;进行片选的时候,是同时被/不被选中的
比如2片 1K X 4位 的芯片可以组成 1K X 8位 的存储器:将两片芯片的地址线 A9 - A0、 C S ‾ \overline{CS} CS、 W E ‾ \overline{WE} WE 都分别连接在一起(必须这样,因为要实现同时访问两个芯片的存储单元),其中一片的数据线作为4位 D7 - D4,另一片的数据线作为低4位 D3 - D0,这样就可以构成一个 1K X 8位 的存储器
指增加存储器字的数量(即存储单元的个数,或者说是存储单元地址编号的总数)
进行字扩展的时候,芯片的 C S ‾ \overline{CS} CS 是有进行区分的,即一个被选中,另一个就不会被选中,所以即使对应的地址线、数据线、 W E ‾ \overline{WE} WE分别都是连接在同一条线上的,这两个芯片之间也是毫不相干的,因为两个芯片不可能同时进行读/写操作,存储的数据必定是不一样的
比如使用2片 1K X 8位 的存储芯片可以组成一个 2K X 8位 的存储器,即存储字的数目增加了一倍:将 A10 作为片选线,由于存储芯片的片选输入端要求低电平有效,于是当 A10 为低电平时, C S 0 ‾ \overline{CS0} CS0 有效,于是选中的是左边的芯片,当 A10 为高电平时,反相以后 C S 1 ‾ \overline{CS1} CS1 有效,于是选中的是右边的芯片
指既增加存储字的数量,又增加存储字长(画图过程中先画扩位操作,再画扩字操作)
比如使用8片 1K x 4位 的芯片组成 4K x 8位 的存储器:从左到右,每相邻两个芯片的 C S ‾ \overline{CS} CS 和 W E ‾ \overline{WE} WE 都是连接在同一根线上的,同时两个芯片的数据线并不是连接在一起的,所以每相邻两个芯片都是一组 1K x 8位 的存储结构
如果将它们看成一个整体,组与组之间的片选线并不是连接在一起的,即使即使对应的地址线、数据线、 W E ‾ \overline{WE} WE 分别都是连接在同一条线上的,这两个组之间也是毫不相干的,显然,这种连接方式实现了字扩展,由于一共具有4组,于是就扩展了4倍
最后得到了一个 4K x 8位 的存储器
当存储芯片的容量不同时,其地址线数也不同,CPU的地址线数往往比存储芯片的地址线数要多,此时我们通常将CPU的地址线的低位和存储芯片的地址线相连接(用于选择芯片内部的各个存储单元),地址线的高位在存储芯片扩展的时候用到 或者 作为片选线等
比如假设CPU的地址线为16位 A15-A0,而1K X 4位 的存储芯片仅仅只有10根地址线 A9-A0,此时,我们一般会选择将CPU的低位地址线 A9-A0 与存储芯片的地址线 A9-A0 进行连接
当然,CPU的数据线和存储芯片的数据线数量也不一定会相等(通常CPU的数据线数会大于存储芯片的数据线数),此时必须对存储器进行位扩展,使CPU的数据线数和存储器的数据线数相同
读/写命令线的连接
片选线的连接
合理选择存储芯片主要是指存储芯片类型(RAM或者ROM)和芯片数量的选择
芯片类型:通常使用ROM存放系统程序、标准子程序和各类常数;而RAM是为用户编程而设置的
芯片数量:要尽量使连线简单方便
芯片类型和数目的选择
根据地址编号数目(系统程序区需要800H个地址编号,即211个地址编号;用户程序区需要400H个地址编号,即210个地址编号),即可得出ROM和RAM芯片的容量(ROM对应系统程序区,所以需要211个存储单元;RAM对应用户程序区,所以需要210个存储单元)
再考虑到题目所给芯片类型和CPU的数据线数目
所以我们选择 2 个 1K x 4位的 RAM 芯片(要进行位拓展)和 1 个 2K x 8位的 ROM 芯片
芯片与CPU的连线
先将题目要求的十六进制地址编号范围转化为二进制地址编号范围(注意书写的时候,CPU具有多少根地址线,我们也要对应写出多少二进制位,这是为了方便进行片选信号的构造)
芯片地址线的连接
由于ROM存储器容量为 2K X 8位,于是ROM的地址线具有11根,于是我们将CPU的低11位地址 A10-A0 与ROM地址线相连;由于RAM存储器容量为 1K X 8位,于是RAM的地址线具有10根,于是我们将CPU的低10位地址 A10-A0 与RAM地址线相连,CPU剩下的高位地址线与访存控制信号 M R E Q ‾ \overline{MREQ} MREQ共同产生片选信号
芯片数据线的连接
将ROM的4根数据线与CPU的4根数据线直接相连,两个RAM的2根数据线分别与CPU的4根数据线直接相连
芯片控制线的连接
读/写命令线的连接
片选线的连接
由于"存储墙"成为提高系统性能的主要障碍,于是必须要使用一些手段来提高访存速度,可以通过调整主存的结构、采用高性能的存储芯片、采用层次结构("层次结构"这种方法前面已经介绍过了,前两种方法在此次开始讲解)等方法实现
基本介绍
顺序存储(高位地址交叉编址)
交叉存储(低位地址交叉编址)
存储控制部件的基本结构
在计算机运行过程中,由于种种原因致使数据在存储过程中可能出现差错。为了能及时发现错误并及时纠正错误,通常可将原数据配成汉明编码
公式:L - 1 = D + C (D >= C)
为了及时检测到数据在存储过程中发生的差错,通常可以在原始数据上添加检测位,形成汉明码
汉明码是根据纠错理论提出的具有一位纠错能力的编码方式,采用奇偶校验和分组校验的方式
k位的检测位在新代码中位置的确定
每一个检测位的小组构成
检测位上数值的确定(1还是0)
为了进一步提供存储芯片DRAM的性能,开发出了基于DRAM结构的增强功能,出现了高性能存储芯片,比如SDRAM、RDRAM、CDRAM
与常用的异步RAM不同,SDRAM与处理器的数据交换同步于系统的时钟信号,并且以处理器-存储器总线的最高速度运行,CPU不需要插入等待状态(在典型的DRAM中,处理器将地址和控制信号送入存储器以后,都要经过一段延时,供DRAM执行各种内部操作,而由于为异步DRAM,而且CPU的速度一般都是高于RAM的,于是此时CPU只能等待,不能利用这个时间去处理其他请求),而SDRAM为同步DRAM,即SDRAM会在系统时钟的控制下进行数据的读出与写入,CPU给出的地址信号一般都会被SDRAM锁存,直到指定的时钟周期数后在进行响应,此时CPU就可以去执行其他任务而无需等待了
比如系统时钟周期为10ns,存储器接收到地址以后需要50ns的时间才能读出数据。如果使用的是异步DRAM,CPU要等待50ns来获取数据;而如果使用的同步DRAM(即SDRAM),CPU只需要将地址放入所存器中,在存储器进行读操作的期间可以去完成其他操作,到了CPU计时到5个时钟周期以后,即可获得从存储器读出的数据。简单来说就是,SDRAM由于与处理器的数据交换同步于系统的时钟信号,于是处理器就可以知道何时SDRAM会将需要读取的数据取出,只要到点去拿就可以了,不需要一直傻等着存储器,期间可以去做其他事情,而异步DRAM下,由于存储器不知道何时存储器会读出数据,于是必须要一直进行等待,直到存储器取出数据为止
Rambus开发的RDRAM采用专门的DRAM和高性能的芯片接口取代了原有的存储器接口,主要解决了存储器带宽的问题,可以通过高速总线获得存储器请求,不像传统的DRAM采用 W E ‾ \overline{WE} WE、 C A S ‾ \overline{CAS} CAS、 R A S ‾ \overline{RAS} RAS信号来控制,而是采用异步的面向块的传输协议传送地址信息和数据信息。一个RDRAM芯片就像一个存储系统,通过一种互连电路RamLink,将各个RDRAM芯片连接成一个环,数据通信在主存控制器的控制下进行,数据交换以包为单位进行
CDRAM即带有Cache的DRAM,是在DRAM芯片中又集成了一个小的SRAM(Cache一般就是由SRAM构成的),也称为EDRAM(增强型的DRAM)
图中1M x 4位 的CDRAM 芯片中具有排列成2048 x 512 x 4位 的DRAM阵列和 512 x 4位 的SRAM Cache,可以看到整个CDRAM芯片的对外地址线仅仅只有11根,而 1M x 4位 的CDRAM如果按照之前的常规设计思路需要20根地址线才能满足1M存储空间的需求,于是就导致了这20位地址编号必须进行分时传送:
工作过程:
首先在行选通信号作用下,高11位地址(211即为2048)经过地址线输入,并进行一次复制,将这两个相同的行地址分别保存在行地址锁存器中和最后读出行地址锁存器中,此指定行地址会把在DRAM阵列的2048行中所指定的那一行的所有存储单元的数据(即512 x 4位的数据)都先读入SRAM中暂存
然后在列选通信号下,低9位地址(29即为512)经过地址线输入,保存在列地址锁存器中,在读命令有效时,存储在SRAM的512 x 4位的数据中的某一个4位数据就会被列地址选中,传送到数据总线上
下一次读取的时候,CDRAM 芯片会先将从11位地址线输入的行地址与最后读出行锁存器中的内容进行各个位的比较,如果比较相同,说明此次所需要的4位数据和上一次读出的4位数据在同一行,此时就比较简单了,表明需要获取的数据一定还在SRAM中,根据列地址进行选中SRAM中对应的那4位数据即可,效率高;如果比较不同,则需要重新去DRAM阵列中去寻找,并更新SRAM中存储的所有数据和最后读出行地址所存器中的内容,最后送出指定那4位数据
效果:
CDRAM使用512 x 4位 的SRAM Cache保存上一次取出数据所在行所有数据的方法,使得当CPU需要对连续的属于同一行的数据进行读取的时候,只需要连续变动那9位的列地址即可实现,这是猝发式读取,对于成块的传送的效率提高十分有利
同时,看图可知,芯片中的数据输出路径(由SRAM到I/O)与数据输入路径(由I/O到读放大器和列写选择)是分开的,这就允许在写操作完成以后,可以立即启动对同一行的读操作,而且在SRAM读出数据期间可以同时对 2048 x 512 x 4位 的DRAM阵列进行刷新操作(刷新就是一个写数据的过程)
主存
Cache
主存块与缓存块
命中率
Cache-主存系统的平均访问时间
访问效率
任何时刻都会有一些主存块的复制体在Cache中,CPU想要读取主存信息时(CPU只有主存的地址信息,无Cache的地址信息),此时有两种情况:
需要指出的是,Cache对于用户是透明的,即用户进行编程的时候所用到的地址是主存地址,用户不需要知道这些内存块是否已经调入了Cache中,将主存块调入Cache的工作是由计算机硬件自动完成的
写操作过程较读操作过程会相对复杂一些,因为对于向Cache块内写入的信息,必须要与被映射的主存块中保存的信息完全一致,对于进行写操作的时候,如何保持Cache中的信息和主存中的对应信息一致的问题,我们提出了写直达法和写回法
写直达法
写回法
典型的系统中只会有一个缓存,但是为了增加Cache的级数或者是为了将统一的Cache变成分立的Cache,开始普遍采用多个Cache
每一个Cache块都具有一位有效位,用来标识该Cache块中的信息是否有效(数值为1标识有效,数值为0标识无效),比如在初始时刻,Cache还没开始复制主存中的信息,于是Cache中每一个块的有效位的数值应该都是0
原理
组相联映射为上述两种映射方式的折中,将Cache划分为Q组,每一组有R块,并且有主存块与Cache组的映射关系:i = j mod Q
其中,i为缓存组号,j为主存块号,Q为缓存组数
q = c - r的数学原理
组相联映射的思路就是先使用直接映射,即主存块可以先经过主存块与Cache组的映射关系i = j mod Q映射到一个确定的缓存组上,然后再使用全相联映射,对于这个缓存组中的任一缓存块,这个主存块都可以进行映射,特别地,如果将r = 0,则为直接映射,如果将r = c,则为全相联映射,即组相联映射的性能以及复杂性介于直接映射和全相联映射两者之间
特点
一个主存地址的组成
Cache的区域划分
当新的主存块需要调入Cache中,同时Cache又已经被旧有的主存块占满了,此时就需要进行Cache块的替换操作,这就产生了替换策略(算法)问题,即如何挑选被替换的Cache块的问题。在直接映射的Cache中,对于一个内存块来说,只有一个Cache块与之对应,于是映射的策略很简单,但是对于组相连和全联映射的Cache中,主存块可对应于多个Cache块,于是就需要使用一些可靠的替换算法进行选择。理想的算法是将未来很少用到的或者是很久才会用到的数据块替换出来,但是实际上是非常难做到的
FIFO(First In First Out 先进先出)算法
LRU(Least Recently Used 近期最少使用)算法
随机法
辅助存储器不能直接与CPU进行数据交换