【刷题】计算机组成原理:存储器(转)

原文地址:https://blog.csdn.net/redRnt/article/details/83445031

重要考大题

一、存储器的分类

存储器是计算机系统中的记忆设备,用来存放程序和数据,从不同的角度对存储器可以做不同的分类。

1、按存储介质分

  • 半导体存储器(又称易失性存储器):体积小,功耗低,存取时间短,电源消失的时候,所存的信息也随之消失。
  • 磁表面存储器(非易失性存储器):如磁盘
  • 光盘存储器(非易失性存储器):耐用,可靠,如光盘

2、按存取方式分

  • 随机存储器(RAM):任何一个存储单元内容都可以随机存取,像数组的下标,可以直接访问元素。访问速度较快,常用于制作主存和Cache
  • 顺序存取存储器(SAM):只能按某种顺序来存取,即与存取时间和存取单元的物理位置有关。(比如磁带)
  • 直接存取存储器(DAM):如磁盘
  • 相联存储器(CAM):按内容检索

3、按计算机中作用分

 

 二、计算机的层次结构

 

 存储器有三个性能指标,速度,容量,每位价格(位价)。
就一般而言,速度较高,位价越越高,容量越小。反之,速度越低,位价也越低,容量也就越大。
存储系统的层次结构主要体现在缓存——主存和主存——缓存两个存储层次上。如图:

 

 

  • 缓存——主存层次:这一层面主要解决CPU与主存速度不匹配的问题,主存用来存放将要参与运行的程序和数据。但是其速度与CPU相差很大,为了使得他们之间的速度更好匹配,于是在主存与CPU之间插入了一种比主存更快,容量更小的高速存储器(Cache),因此只要把近期要使用的信息调入缓存,CPU便可以直接从缓存中获取信息。注意,主存与缓存中的数据调动是由硬件自动完成,对程序员是透明的。
  • 主存——辅存层次:这一层面主要解决存储系统的容量问题,辅存的速度较低,但是容量大,用于存放暂时未用到的信息,当CPU要用到这些信息的时候,将辅存的内容调到主存中,供CPU直接访问,主存与辅存之间的数据调动是由硬件和操作系统共同完成的。

三、半导体随机存储芯片

半导体随机存储器芯片内集成有记忆功能的存储矩阵,译码驱动电路和读/写电路等等。

 

 读写电路:包括读出放大器和写入电路,用来完成读/写操作。
地址线:单向输入,其位数与芯片的容量有关
片选线:确定哪个芯片被选中(用来选择芯片)
数据线:双向输入,其位数与芯片可读出或者写入的位数有关,也与芯片容量有关。

存储容量

通常我们将存储容量表示为:
字数 X 位数,比如 64K X8位,其含义为,以8位构成一个字,一共有64个字。这个概念要相当熟悉,后面理解题目很有用。
下面我们来看一道例题:

一个64K x 8位的存储器,可以由()个16k x1位的存储芯片构成?

分析:64K x 8位,说明该存储器是以8位构成一个字,因此,每读出一个字,需要选中8片16k x1位的存储芯片,而一片能表示16k,因此一共需要64/16 = 4片,根据组合的原理,一共需要4x8 = 32片。

 

 

从图中我们可以看出,相当于把32个芯片分成了4组,每组8片(表示8位)。
于是我们得出这样的结论:
在这里插入图片描述

 

半导体随机存取器,习惯上多称为RAM,按其存储信息原理不同,可以分为静态RAM(SRAM)和动态RAM(DRAM)

 

SRAM

SRAM存储原件所使用的mos管多,占用硅片面积大,集成度低,但是采用触发器工作原理存储信息,因此即使信息读出之后,它仍然保持原状,不需要再生,但是电源掉电时,原存有的信息就会消失,因此它属于易失性存储器。因为这个比较的简单,因此就简单介绍一下就好:
工作原理:触发器
优点:

  • 能长久保存信息
  • 速度快,工作稳定
  • 无需刷新
  • 无需读后再生

缺点:功耗大,集成度低,价格高。
典型应用:cache

DRAM(这个是重点)

与SDRAM相比,DRAM所用的mos管少,占硅面积小,因而功耗小,集成度高但是因为采用了电容存储电荷的原理来寄存信息,会发生漏电现象,所以要保持状态不变,需要定时刷新,因为读操作会使得状态发生改变,故需要读后再生。且速度比SRAM慢。但是由于其功耗小,集成度高,被广泛应用于计算机中。
典型应用:主存

存储记忆原理

 

 

 定义:存“0”:C中没有电荷,存“1”:C中有电荷
读入的时候,T中的高电平使得T通导,如果此时C有电荷,那么数据线就会产生电流,视为读出1.否则视为读出0
写入的时候,若为高电平,则经过T对C充电,充电后有电荷,于是存1,若为低电平,C经过T时放电,C中没有电荷,于是存0.

DRAM的刷新

问:为什么要对DRAM进行刷新?如何进行刷新?
由于动态存储器的原理是容存储电荷的原理,且访问存储单元是随机的,有可能某些存储单元长期得不到访问,其存储单元内原信息就会慢慢消失(原因)。刷新的过程实质上是将原信息读出,再由刷新放大器形成原信息并重新写入的再生过程,称为读后再生。
下面介绍一下刷新过程中要用到的名词。

  • 刷新周期:在规定的时间内,对DRAM全部基本单元进行一次刷新(即两次刷新之间的相隔时间),一般为ms级别,2ms。
  • 死时间:刷新时,某段时间需要暂停读写操作,这段时间由于外界不能对存储器进行操作,因此称为死时间。
  • 存取周期:DRAM完成一次读写操作所需要的最短时间
  • 死时间率:

 

 

DRAM常见的刷新方式有三种:集中刷新,分散刷新,异步刷新
刷新的过程为:以行为单位,读出一行中全部单元的数据吗,经过信号放大后,同时写回。读出时候一定断开存储器的输出。

集中刷新:

做法:在刷新周期内,对全部存储单元集中一段时间进行刷新(逐行进行),此时必须停止读写操作。
看看下面的例题:

设对128 x 128矩阵的存储芯片进行刷新,若存取周期为0.5us,刷新周期为2ms,采用集中刷新的方式,那么对128行集中刷新,一共需要()us?死时间率为()%?

分析:刷新一遍的时间 = 存取周期 x行数,于是可以求得刷新时间。在刷新时间内,不能进行读写操作,因此死时间就是刷新的那段时间,占用的存取周期数值上等于行数。利用计算公式算出死时间率为32.%。所以很容易得到:

 

 

但是这种做法有个极其不好的缺点:对于经常要进行读入读出的程序,要陷入大量的等待时间,CPU的工作效率不高。

分散刷新:

做法:对每行存储单元的刷新分布到每个存取周期内完成,其中吧机器的存取周期(记为tc),分成两个部分,前半段的tm用来记录读写,后半段(tr)用来刷新,即tc = tm +tr。如图:

 

 

若读写周期 tc = 0.5us ,那么存取周期tc = (0.5+0.5)us = 1us
现在沿用上面的题目:

设对128 x 128矩阵的存储芯片进行刷新,若存取周期为1us,刷新周期为2ms,采用分散刷新的方式,那么对128行分散刷新,一共需要()us?死时间率为()%?

分析:因为在读写操作之后,立刻刷新,那么每读取操作一次,就会刷新一次,刷新128行就需要 1us x 128 = 128 us。由于刷新是在读写操作过后直接完成的,所以不存在死时间。也就是死时间率为0.
缺点:这样无异于加长了存取周期,会使系统运行速度降低,刷新操作也过于频繁。

异步刷新

做法:在刷新周期内对所有行各刷新一次,即每隔(刷新周期/总行数)us,刷新一次。这种方式是前面两种方式的结合,既能缩短死时间,又能充分利用刷新周期,提高刷新频率。

题目同上:

设对128 x 128矩阵的存储芯片进行刷新,若存取周期为0.5us,刷新周期为2ms,采用异步刷新的方式,那么对128行异步刷新,一共需要()us?死时间率为()%?

每隔(2ms/128) = 15.6us刷新一次,每一次刷新,死时间都是存取周期内的时间为0.5us,对于该行来说,下一次轮到它刷新还是间隔了2ms,所以死时间率为 1/4000.(2ms 里面有4000个存取周期)。所以;
1/4000 << 3.2%
若将DRAM的异步刷新安排在CPU对指令的译码阶段(此阶段CPU访问存储器),那么也就不存在死区。
四、ROM

ROM——只读存储器,顾名思义,只能读出不能写入的存储器。但是随着用户的需要,总希望修改原ROM里面的内容。 ROM中一旦有了信息,就不能轻易改变,也不会在掉电时丢失,它们在计算机系统中是只供读出的存储器。因此,SRAM、DRAM都是易失性(挥发性)存储器,而ROM是非易失性的存储器。

 

ROM器件有两个显著的优点:

1. 结构简单,所以位密度比可读/写存储器高。

2. 具有非易失性,所以可靠性

在计算机系统中,既有RAM模块也有ROM模块,ROM模块中常用来存放:

- 系统启动程序和参数表,常驻内存的监控程序

- 操作系统的常驻内存部分,某些语言的编译程序及解释程序等。(所以操作系统是存在于RAM和ROM之中的)

ROM常分为以下几种:

1. 掩模型ROM(MROM):在制作mask时将信息(Program)编排进去。光刻成的ROM,所存信息与mask完全一致,不可改变。故名全固定ROM。适合大批量生产已成型的产品。小量生产则成本上升(mask制作工艺复杂,周期长),所以,总是在一个计算机系统完成开发以后,才用掩膜ROM来容纳不再作修改的程序或数据。如家电洗衣机、风扇的程序 2. 一次可编程ROM(PROM):只能实现一次编程,不得再修改。写入时,利用外部引脚输入地址,对其中的二极管键进行选择,使某一些被熔断,某一些保持原状,于是就进行了编程。

3. 可擦除可编程ROM(EPROM):可以由用户对所有信息进行有限次数的修改,可采用光擦,电擦等方式对内容进行改写。对信息擦除的时候,只能全部擦除。

4. 电可擦写PROM(EEPROM或E2PROM):利用高压擦写 可字节擦,也可全片擦。一般用在即插即用设备,它既有ROM的非易失性,又有RAM 的可读写功能,编程方便。

5. 闪速存储器(flash memory):简称闪存,在EEPROM基础上发展起来的新型电可擦除非挥发性存储器件。存储单元结构类似于EEPROM,主要差别是闪存的氧化层较薄,因而电擦性能更好。它从全片擦除/按字节擦除进步到部分(块)擦除,写入快,适合文件存储,并且擦写次数10万次以上,读取时间小;存储单元只需单个MOS管,结构更简单,容量更大。是替代磁盘的理想工具。不过在写入的时候,要擦除原有的数据,因此写入比读出的速度略慢。

 

EEPOR与闪存

 

早期的手机软件一般放在EEPROM中,打电话时,最后拨打的号码暂存在SRAM (类似于缓存),不是马上 写入通话记录(记录保存在EEPROM中),因为当时正在通话,如果写入,影响质量 现在的主板,手机也用闪存.一般的手机,ROM=C盘,RAM=内存,SD卡相当于外存,硬盘 。笔记本也用闪存替代原来的磁盘。

 

五、主存扩容及其连接

 由于单片存储芯片的容量总是有限的,但很难满足实际的需要,因此必须将存储芯片连在一起才能组成足够的容量。这个过程简称主存扩容。常见的扩容方式有:字扩展。位扩展  字位同时扩展。主存与CPU的连接通过数据总线  地址总线  控制总线与CPU相连接。

 

 

其中:

地址线决定了CPU可寻址的最大内存空间。

控制总线(读写)指出总线周期的类型和本次输入输出操作完成的时刻。

MDR:数据寄存器,用来存入内存中读入/写出的信息。

MAR:地址寄存器,用来存放当前CPU访问的内存单元地址

主存扩容

位扩展

位扩展是指增加存储字长,例如,2片1K X4位的芯片,可以组成1K X 8位的存储器。

满足下列条件时,采用位扩展的方式:

  • 只加长每个存储单元的字长,而不增加存储单元的数量
  • 芯片数=设计要求的存储器容量/选择芯片存储器容量
  • 芯片之间采用并联的方式

例如下题:

利用1K×4位的SRAM芯片,设计一个存储容量为1K×8位的SRAM存储器,问:需要芯片,地址线,数据线的数量各为多少?

分析:显然从1K X 4 位 ——>1k X 8位,字长不变,只是位长发生了变化。所以使用位扩展。所以,有:

(1)需要芯片数为:

(1K×8)/(1K×4)=2片

(2)需要地址线数为:

1k表明存储单元个数,1k = 2^10,说明有10根地址线。

(3)需要多少根数据线?

需要组成8位的存储器,8代表数据线的位数,每片芯片占4根线即可实现位扩展。

 

字扩展

这种方式仅仅增加了存储单元数,各单元位数不变。 如下题:

利用1K×8位的DRAM芯片,设计2K×8位的DRAM存储器(字扩展),问需要芯片,地址线,数据线的数量各为多少?

解析:显然从1K X 8 位 ——>2k X 8位,字数边长,位数不变,应该选字扩展。

(1)需要几片芯片? d=(2K×8)/(1K×8)=2(片)

(2)需要多少地址线? 2K个存储单元对应11根地址线

(3)需要多少数据线? 8位,即8条

字位同时扩展

这种方式是指即加长存储单元的数量又增加各单元的位数,字位同时扩展的时候,先进行位扩展,在进行字扩展。 例如下题:

利用1K×4位的存储芯片,组成4K×8位的存储器。问需要芯片,地址线,数据线的数量各为多少?扩展过程如何?

数据线条数等于存储字长,如存储容量64K*32bit,存储字长和数据总线是32(也是MDR的位数)

解析:

(1)共需几块芯片: (4K×8)/(1K×4)= 4×2=8

(2)需要几根地址线: 4K地址空间(存储单元的个数),需要12根地址线

(3)需要几根数据线: 8根。

(4)扩展过程:先进行位扩展,这个过程相当于分组,将2片1K×4位构成一组,利用位扩展,构成1K X 8位的完整存储单元(如何构成,继续往下看)。这样一共可以分成四组。再将这些分组视为一个完整的存储单元,进行字扩展。

主存与CPU的连接

我们前面刚刚讲了理论上可以构成我们需要的芯片,那么实际上如何通过那些地址线和数据线去连接主存与CPU呢?大致过程可以分成5步。

1. 选择合理的存储芯片 合理选择芯片,是指选择芯片的数量及其种类(即ROM还是RAM)。通常来说,ROM存放系统程序,标准子程序以及各类常数。RAM则是为用户编程设置的。在考虑芯片数量的时候,尽量选择使得连线简单方便的芯片。

2. 地址线的连接 CPU的地址线通常要比存储芯片的地址线数要多,常见的做法是:将CPU的低位与存储芯片的地址线相连,CPU地址的高位一般用于扩充或者片选。例如CPU地址线为16位(A0-A15).1K X4位的存储器芯片仅有10根地址线A9-A0这个时候就可以将CPU的低地址段A9-A0与芯片A9 - A0相连。

3. 数据线的连接 这里跟地址线的连接不同,这里要求数据线数一定要相同。,如果CPU数据线与存储芯片的数据线不同,那么要先进行位扩展再连接。

4. 片选线的连接 片选线的连接是CPU与存储芯片能否正确工作的关键。存储器由许多存储芯片一起组成,哪一片被选中完全取决于该芯片的片选控制端CS能否接受CPU的片选有效信号.。而片选的有效信号由与CPU的访问控制信号MREQ有关。

5. 读写命令线 读写线一般直接与存储芯片的读/写控制端相连,高电平为读,低电平为写

 

图解字扩展和位扩展

其实一开始学这个有点懵主要是书上给的实例都是立体图,大家不好观察,那么我手绘了一下大致的过程(手残莫嫌弃哈)。 例子我们还用之前提到的,现在我们用下图表示1K x 4 位的芯片:

位扩展是增加位长,连接方式是并联:

字扩展是字长,连接方式是串联(下图中最后一个数字是2047,我拍完照才发现,就不重画了,这里纠正一下):

所以很容易得出字为同时扩展的图片,我就不画了。

字,位扩展在CPU连线中的区别

问,在位扩展和字扩展中,CS分别是如何连接的?

答:在位扩展中所有片的CS连在一起,而字扩展则是采用将多出的地址线用来片选(通常CPU的位地址与芯片地址相连,高位用于片选)。

这里举个例子,假设两个4位的芯片构成一个8位的存储单元,肯定是要将所有的芯片一同访问才能访问到8位。即两个芯片要一起选(看我画的图2),所以也就意味着所有的CS都连在一起。

但是字拓展中,是两个8位的存储单元,每次操作只能对其中的一个芯片单元操作,就是到底要选择哪个芯片的问题。(认真看看我手绘的图3应该就懂了)

问:那数据线如何连接?

答,在位扩展时,每个芯片的数据线分为低位高位连接。但是字扩展中每个芯片都和所有的数据线进行连接

 

六、并行存储器

随着计算机应用领域的不断扩大,处理的信息量越来越多,并且现代计算机的I/O设备也在不断增加,因此,提高访存的速度已经成为了迫不及待的任务。于是就出现了并行存储器。 在介绍并行存储器之前,

先来介绍一个概念: 存储器的带宽:表示单位时间内存储器存取的信息量,可用字/秒或者位/秒表示。是衡量数据传输率的重要技术指标。存储器的带宽是决定了以存储器为中心的机器获得信息的速度。

可以通过下面的几种方式提高:

1. 缩短存取周期

2. 增加存储字长

3. 增加存储体

 

双口RAM

为了提高CPU访问存储体的速度,可以采用双端口的存储器,多模块存储器等技术,它们同属于并行技术。前者为空间并行,后者为时间并行。双口RAM的模型图如下:

该模型允许两个独立的控制器同时异步地访问存储单元。但是这种方式有时也会带来一些读取错误。例如:

1. 两个端口对同一个地址单元写入

2. 两个端口对同一地址单元,一个写入,一个读出。

(熟悉操作系统的朋友应该能看出来,这是个读者写者问题的模型),

通常的处理方式是设立一个置忙信号Busy,当遇到上述状况的时候,将busy置0.暂时关闭一个端口。 可以看出,这是一个从空间上并行的存储技术。

多模块存储器

我们还可以从时间上并行并行存取。我们知道CUP的速度要比存储器要快,如果我们同时从存储器中取出几条指令,那么我们就可以充分利用CPU资源,提高运行效率。 多体并行存储器,由多体模块构成,每个模块都有相同的容量和存取速度,有独立的读写控制电路,地址寄存器和数据寄存器。

多体并行存储器分为高位交叉编址和低位交叉编址两种。

 

高位交叉编址

当程序按体内地址顺序存放,即一个体存满之后,再存入下一个体时,这种方式称为顺序存储,高位地址表示题号,低位表示体内地址(注意0 1 2 3....的顺序是从上往下的):

因此,CPU给出一次存储访问总是对一块连续的存储单元进行的,在多CPU系统中,不同的CPU访问不同的存储块,达到并行工作。 存储轨迹可以用下面的线条表示:

低位交叉编址

对应于高位交叉编址,低位交叉编址指的是将程序连续存放在相邻体中,又称交叉存储。(注意,0 1 2 3的顺序是从左往右的)

这种做法可以在不改变存取周期的前提下,提高存储器带宽,因为可以在一个访问周期下,访问多个不同的存储体。适用于单处理器系统

存储轨迹可以用下图表示:

访存冲突

但是低位交叉存储可能导致访存冲突,当访存地址在相邻的四次访存中,出现在同一存储块内,就会发生访存冲突。

比如,下面有一组将要访问的地址序列(3 9 17 2),采用的是4体低位交叉存储(即4个存储体,从0开始编号)。

我们可以通过计算得知3,9,17,2分别位于存储体3,1,1,2. 由于我们的访存方式是一次性访问多个不同的存储体,

比如这个是4体,一次性同时访问4个不同的体,那么就分别是 0,1,2,3及其对应的其他存储单元。

由于访问的顺序存在体数重合,因此有一次访问是一定失败的,这就是访问冲突。

那么如何算给定访问序列的所在体数呢?

所在体数 = 序列号mod体数,比如3%4 = 3,9%4 = 1

两种并行存储器的访问时间

设存储器的模块数为n,存取周期为T,总线传输周期为i,当采用流水线方式存取的时候,: 1. 若采用高位交叉编址,那么连续读取n个字节所需的时间t1为: t1 = T +(n - 1 )i

2. 若采用低位交叉编址,那么连续读取n个字节所需的时间t2为:t2 = nT

3. 存储器的交叉模块数 m >= T/i

 

七、Cache工作原理

为什么要引入Cache

cache,高速缓冲存储器,是一种以RAM为材料制成的高速存储器。引入的原因主要有:

1. I/O设备向主存的访问级别高于CPU,在I/O访存期间,CPU将处于空闲状态。

2. 主存速度的提高始终跟不上CPU的发展,主存与CPU的速度明显不匹配

局部性原理

程序访问的局部性原理包括时间局部和空间局部性。前者是指最近未来要用到的信息很可能是正在使用的信息,这是因为程序存在循环。后者是指指令和数据在内存中都是连续存放的并且有些指令和数据往往会被多次调用(如子程序,循环程序和一些常数)。因此只要将CPU近期要用到的程序和数据前从主存送到Cache,这样大多数情况下,CPU都能直接从Cache中取得指令和数据。

Cache的工作原理

Cache是一种容量小而速度快的高度缓冲器,由快速的SRAM组成,直接做在CPU内,速度几乎与CPU一样快,任何时刻都有一些主存块处于缓存之中,因此,CPU欲访问主存的时候,有两种可能: 1. 所需要的字已经在缓存中,于是CPU直接访问Cache,(通常一次传送一个字,主存不参与) 2. 所需要的字不在缓存中,那么此时需要将字所在的主存块整块一次调入Cache中,(即主存-Cache之间以块为单位进行传送 )。主存块调入缓存的过程,称为建立对应关系。

我们将第一种情况称为 CPU访问Cache命中,简称Cache命中。第二种情况为不命中。由于缓存块数目远小于主存数,因此每个缓存快要设立一个标识,用来表明当前存放的是哪一个主存块。 Cache的容量与长度是影响Cache效率的重要因素,通常用命中率来衡量Cache的效率 。 在一个程序执行期间,设总的命中次数为Nc,访问主存的次数为Nm,那么命中率可以这样表示:

设Tc为命中时Cache的访问时间,那么Tm为未命中时的主存访问时间,那么平均访问时间为;

其中H为命中率,显然1 - H就是未命中率。 显然,越好的Cache,其Ta值越接近Tc(即H接近于1)。

Cache与主存之间的映射

在Cache中,地址映射是指把主存地址空间映射到Cache地址空间,在将主存块复制到Cache中的时候遵循一定的映射规则,标志位为1时候,表示其Cache映射的主存块数据有效。(注意与地址变换的区别,地址变换是指CPU在访存的时候,将主存地址按照映射规则换算成Cache地址的过程 )。 地址映射有三种方式:直接映射,全相联映射,组相联映射、

1. 直接映射

这种方式主存块只能装入Cache的唯一位置,若该位置已有内容,则产生块冲突,原来在Cache中的块将无条件被替换出去,直接映射的关系可以定义为:

j = i mod2^c

其中,j为Cache的块号或者行号。i为主存块号,2^c为Cache的总块数,因此主存的

只能映射到第0行,依次类推,其地址结构为:

CPU的访存过程:首先根据地址中间的Cache字块地址,直接找到对应的Cache块号,若块号的有效位为1,则表示命中,否则为不命中此时从主存中读取该地址所在的主存块号,并将其内容送到对应的Cache块并将有效位置1,同时将内容送到CPU。 缺点:这种方式映射不够灵活

2. 全相联映射 这种方式可以把主存数据块装入Cache的任意一块, 方式可以从已占满的Cache存储块中,替换出任一旧块,显然这种方式灵活,命中率也高,缩短了块冲突,与直接相联映射相比,其主存字块位数增加,使得Cache标记位增多地址变换速度慢。通常使用“按内容寻址的”相联存储器。其地址结构为:

3. 组相联映射

将Cache空间分成大小相同的组,主存的一个数据块可以装到组内的任一个位置,即组间采取直接映射,组内采取全相联映射。 如果把Cache分成Q组,每组有R块,那么有: i= j % q 其中i为缓存的组号,j为主存块号主存地址分为三个字段:

当组内2块的时候,称为2路组相联映射。

CPU访存过程:首先根据中间的组地址,找到对应的Cache组,若其标记位为1,说明命中,此时根据块内地址,在对应得Cache行中,存取信息,若不命中,那么此时从主存中读出该地址所在的主存号块,送到对应的Cache组的任一行,有效位置1,同时将内容送到CPU中。

下一篇将介绍一下Cache相关的算法跟计算。

 

七、Cache块中的替换算法

 前面我们提到过,在Cache与主存之间的映射过程当中,当遇到已有的主存块的时候,我们的操作是直接进行替换的。因为对于直接映射来说,每一个主存块都对应映射到固定的一个Cache行中,因此在替换的过程中,也就不需要什么替换算法了,直接进行替换就好。

 

替换算法

其他的两种方式,都需要考虑替换算法 常见的替换算法有:

- FIFO算法:即先进先出的算法,选择最早调入Cahce的字块进行替换,这种方式实现简单。但是由于总是以最早调入的Cache块为替换目标,没有按照程序的局部性进行。所以并不能提高Cache的命中率。因为最早调入的信息,以后可能还会用到。

- LRU算法:近期最少使用算法,这种做法替换的是近期用的最少的字块,较好的利用了局部性原理,但是需要时刻记录Cache各个字块的使用情况,以便确定那哪个字块是近期最少使用的。

- LFU算法:将一段时间内访问次数最少的存储块换出,每行设立一个计时器,每访问一次,计时器的数值加1,替换的时候,将最数值最小的Cache块替换出去。

- Rand算法:顾名思义,随机替换。

注意:Cache对于用户来说是透明的,用户编程的时候,所用的地址是主存地址,用户并不知道这些主存块是否已经调入了Cache块中,因为主存与Cache之间的替换是由机器自动实现的。

Cache写策略

Cache的写操作比较复杂,因为对Cache块内写入信息,必须与映射的主存块内的信息完全一致,那么如何使得cache与主存的内容一致呢?目前常用的方式有以下两种:

1. 全写法(write—through):又称写直达法,即在进行写操作的同时,写入Cache和主存,这样主存中的数据与Cache中的数据就能时刻保持一致。但是这样会导致访存次数的增加。

2. 写回法(write—back):即写操作的时候,只把数据写入Cache中,待到Cache块要被换出的时候,再写出到主存中,,为了识别Cahce中的数据是否与主存中的一致,于是在Cache中每一块都增设一个标志位(也称为“脏”位)。脏位有两种状态,清:表示未被修改过,这个块当然也与主存间的数据块的内容一致了;浊:则表示被修改过,内容与主存不一致,于是替换算法就将此块替换出去。并将浊位置为清。显然在计算机中用0和 1 来表示这两种状态

而上面的两种状态,都是对应于写命中的情况(也就是CPU要写的单元都在Cache上面),那么当CPU访问的数据块不在Cache中,那又该如何?

我们也常常有两种做法:

- 写分配法:加载主存的块到Cache中,然后更新这一块。(所以常常跟写回法一同使用 )

- 写不分配法:对应于上面的做法,这个做法就是只是将要修改的内容写入到主存块而已,不进行与Cache之间的调块

 

Cache的改进

Cache的特性决定了它不能大容量的存储,所以目前我们普遍采用多个Cache,主要的改进方面有1,增加Cache的级数。2将统一的Cache变成分立的Cache。于是有了多级缓存的概念。将缓存分为多个级别,越接近CPU,速度就越快,容量也就越小。所以指令Cahce和数据Cache一般都在L1(靠近CPU)的那一级别。随着集成电路的发展,又把一级缓存直接与CPU做 在同一个芯片上,称为片内缓存。其他的称之为片外缓存。

下面来看一道Cahce——主存映射的题目

其实有三问,但是我们只需要了解一问就好了。接下来读题:

第一,主存容量为16mb,也就是2的24次方b,所以主存地址的总字段长度为24位。(不然表示不了那么多的地址)

第二,Cache容量的为8kb,根据前面的数据,我们可以知道这个机器是用字节存储的,所以每个字块8个字,每个字32位。32位就是4个字节,即8 X 4B.,所以块内地址一共需要5位。

第三,我们要确定组内地址,也就是说Cache要被分成几组。我们刚刚得到了块内的地址,那么这个时候我们就知道了Cache一共有8kb/2^5 =2的8次方,也就是2的8次方块。 于是的得出组数为:2的8次方除以4(4块为一组) = 2的6次方。 所以组内地址字段为6.

第四,用总长度减去已知的两个长度,于是得到标记字段。

八、补充知识点:

  1. SRAM和DRAM在与CPU的连接上有什么不同?

答:在实际中,DRAM芯片采用的是地址复用技术,至于什么是地址复用技术,自行查阅资料。做题只需要知道一点,那就是其地址线变为原来所需要的一半。片选的时候用两个跟线,一根用来选行,一根用来选列。(分别称为行通选线和列通选线)。

2. 按字编址与按字节编址。

一般的我们常常使用 字数X位数的方式来表示计算机容量。比如8K X16位 代表的是这个存储器一共有8K个存储单元,每个存储单元存放16位字。 我们知道 1B = 8bit。

所以上面的8K X16位可以写成8K X 2B也就是16KB,所以上面的式子表示的容量又可以写成是16KB。因此,如果按字节编址,上面的式子应该表示为:

16K X 1B

如果按字编址,那么写法应该是这样的:

8K X16位(这个位数跟机器字长有关,题目会给)

3. 主存块与主存单元的区别。 主存块,是为了与Cache或者是与虚拟存储器更好的映射,从而按照一定大小分成的块(这里是个人理解,未经证实,慎重参考)。而存储单元是主存中一个个有编号的单元,就像8K X16位就有8k个这样的单元。从0开始编号。所以某个主存有8k个存储单元不等于其有8K个块,至于它在第几块,除一下就知道了。(后面有参看的题目)

 

4. 交叉存储方式什么时候会发生访存冲突? 交叉存储的特点就是一次性并行访问多个存储体,并且边访问边传输,达到提高访存速度的目的。假设有这样的一个4体交叉访问存储系统:

访问序列为 0 1 2 3 ,这个时候恰好刚刚一次访问完毕,因为各个序列号都位于不同的储存体内,访存不会发生冲突。但是如果序列号为0 2 3 4呢?4显然跟0在同一个存储体,由于事先访问了0,于是在结束这一行的并行访问的时候,是在占用存储体1的,这个时候也就导致4访问不到。于是发生访存冲突。 所以得出结论,只要在相邻的m个序列中,存在位于同一个存储体中的序列,他们就会发生访存冲突。(假设有m个体)

5. 怎么计算所需要的地址线与数据线? 先回顾一下地址线与数据线的作用: 地址线:单向输入,其位数与存储字的位数有关 数据线:双向输入,其位数与读出或者写入的数据位有关。 地址线10根,数据线8根,那么芯片的容量可以表示为: 2^10 X 8 = 8K位,所以用这种方式很容易知道数据线与地址线的个数

第一题

分析:这道题考查的是DRAM与SRAM之间的区别,基本概念题。放在这里只是希望能再熟悉一下基本的特点。秒选23.

第二题

分析:这两道都是概念题,记住就好。无论是SRAM还是DRAM都是易失性存储器。由于ROM是只读的,断电不会失去数据,所以为非易失性。SRAM速度快,被广泛用于Cache的制作。刷新的问题就不说了。所以11选A。

再看看第二题,闪存是一种只读存储器(ROM),所以属于非易失性,采用随机存储方式,是理想的磁盘替代者。那么为什么A不对。因为我们说过,ROM的写入都是要擦除才能进行写入的。而读取操作不需要对主存进行什么改变,因此写操作一定是要比读操作要慢的,毕竟写之前要擦除。

第三题

分析:这四道题都是一类题。所以放在一起,一次性攻克。

引脚数,是指所有连线的个数(包括地址线,数据线,片选等等)。

1024 = 2^10.,数据线显然是8根。加上片选线,读,写线。加起来最少为21.

第二题倒是干脆利落,32k = 2^15,秒选C

第三题,按照正常思维,我们需要10根地址线,8根数据线,但是题目说了地址复用技术,所以地址线减半,为5根。所以光是地址线+数据线就需要 5+8 = 13(根),加上两根读写线,两根通选线,所以最少为13+2+2 = 17(根)

第四题,有了上一题就好办了,注意题目问的是该DRAM的地址引脚跟数据引脚,没问其他的。所以4M = 2^22,需要22根地址线,但是注意了,DRAM是地址复用的,所以需要的是 11+8 = 19(根)。

第四题

分析:这是一道简单的计算题。如果题目没有特殊说明,一般的刷新周期取2ms。

1.异步刷新是按行一次刷新,缩短死时间,每一行之间间隔(2ms/64)刷新一次,然后向下取整,结果为31us。

2.集中刷新,其刷新一次所需要的时间 = 要刷新的行数 X 存取周期。死时间为6.4us,死时间率是指死时间占刷新周期的比例,结果为0.32%。

第五题

分析:这道题目很有味道,可以说很经典,首先我们要知道字位扩展的原理,扩展后的地址变化,二进制与16进制之间的转换。很精彩,我就手写一次。

第六题

分析:上一道题是给出容量算地址,这道题反过来,给出地址算容量。我们先确定这个地址空间包含多少个可用的地址: 5FFFH - 4000H + 1 = 2000H(为什么加1?因为地址从0开始数的)。

一个16进制数用4个二进制数表示,所以2000H是2^13B(题目说了按字节编址)。也就是8KB。所以RAM地区为64 -8 = 56KB,所以,所需要的芯片数为(56K X 8位)/(8K X 4位) = 14

 

posted @ 2019-09-19 17:14  霓裳梦竹  阅读(6967)  评论(0编辑  收藏  举报