4、 存储器概述
约 15512 字大约 52 分钟
2025-06-18
按存储介质分类 存储介质是指能寄存"0”、“1"两种代码并能区别两种状态的物质或元器件。存储介质主要有半导体器件、磁性材料和光盘等。
半导体存储器 存储元件由半导体器件组成的存储器称为半导体存储器。现代半导体存储器都用超大规模集成电路工艺制成芯片,其优点是体积小、功耗低、存取时间短。 半导体存储器又可按其材料的不同,分为双极型(TTL)半导体存储器和MOS半导体存储器两种。前者具有高速的特点;后者具有高集成度的特点,并且制造简单,成本低廉,功耗小,所以MOS半导体存储器被广泛用。
磁性材料存储器 磁性材料存储器主要依靠磁性材料作为记录的介质,是不易失的永久记忆存储器。又可以分为磁表面存储器和磁芯存储器。 磁表面存储器是在金属或塑料基体的表面上涂一层磁性材料作为记录介质,工作时磁层随载磁体高速运转,用磁头在磁层上进行读/写操作,故称为磁表面存储器。按载磁体形状的不同,可分为磁盘、磁带和磁鼓。 磁芯是由硬磁材料做成的环状元件,在磁芯中穿有驱动线(通电流)和读出线,这样便可进行读/写操作,这种存储器称为磁芯存储器。磁芯属磁性材料,故它也。不过,磁芯存储器的体积过大、工艺复杂、功耗太大,目前几乎已不被采用。
光盘存储器 光盘存储器是应用激光在记录介质(磁光材料)上进行读/写的存储器,具有非易失性的特点。光盘具有记录密度高、耐用性好、可靠性高和可互换性强等特点。
按存取方式分类 按存取方式可把存储器分为随机存储器、只读存储器、顺序存取存储器和直接存取存储器。·
- 随机存储器(RandomAccessMemory,RAM) RAM是一种可读/写存储器,其特点是存储器的任何一个存储单元的内容都可以随机存取,而且存取时间与存储单元的物理位置无关。计算机系统中的主存都采用这种随机存储器。 由于存储信息原理的不同,RAM又分为静态RAM(以触发器原理寄存信息)和动态RAM(以电容充放电原理寄存信息)。
- 只读存储器(Read OnlyMemory,ROM) 只读存储器是能对其存储的内容读出,而不能对其重新写人的存储器。这种存储器一旦存入了原始信息后,在程序执行过程中,只能将内部信息读出,而不能随意重新写人新的信息去改变原始信息。 所以ROM通常用来存放固定不变的程序、常数和汉字字库,甚至用于操作系统的固化。它与随机存储器可共同作为主存的一部分,统一构成主存的地址域。
- 串行访问存储器 如果对存储单元进行读/写操作时,需按其物理位置的先后顺序寻找地址,则这种存储器称为串行访问存储器,也称为顺序存取存储器。显然这种存储器由于信息所在位置不同,使得读/写时间均不相同,比如磁带存储器就是一种顺序存取存储器。
- 直接存取存储器 还有一种属于部分串行访问的存储器,比如磁盘。在对磁盘读/写时,首先直接指出该存储器中的某个小区域(磁道),然后再顺序寻访,直至找到位置。故其前段是直接访问,后段是串行访问,称为直接存取存储器。
按在计算机中的作用分类 按在计算机系统中的作用不同,存储器可以分为主存储器、辅助存储器、缓冲存储器。
主存储器 (简称主存):用来存放程序和数据,可以和CPU直接交换信息
辅助存储器 (简称辅存):主存储器的后援存储器,用来存放当前暂时不用的程序和数据,它不能与CPU直接交换信息。两者相比,主存速度快、容量小、每位价格高;辅存速度慢、容量大、每位价格低。
缓冲存储器 (简称缓存,Cache)用在两个速度不同的部件之中。
按信息的可保存性分
- 易失性存储器 断电后存储信息消失的存储器 主存
- 非易失性存储器 断电后存储信息依旧保存的存储器 磁盘
存储器的性能指标
存储器有3个主要性能指标:速度、容量和每位价格(简称位价)。
1.存储速度
(1)存取时间 要想衡量存储速度,最直观的指标就是完成一次存储器读/写操作所需要的时间,这叫做存取时间,又称为访问时间(MemoryAccessTime)。 存取时间又分为读出时间和写入时间。读出时间是从存储器接受到有效地址开始,到产生有效输出所需的全部时间;写入时间是从存储器接受到有效地址开始,到数据写入被选中存储单元为止的全部时间。
(2)存储器周期 存储器周期(MemoryCycleTime)指连续进行两次独立的存储器操作(读或者写)需要的最小时间间隔,也叫存取周期。需要注意的是,存储器周期并不等同于完成一次读写操作的时间,而是要更大;因为存储器经过一次读写操作后,并不能立即进行下一次读写,中间还需要一段时间来恢复内部状态。所以 存储器周期=存取时间-恢复时间
(3)存储器带宽 一般来说,存储器周期越短,存储器的速度就越快;这前提是存储器的每次读写操作处理的数据位数相同。通常情况下,存储器每次读写的位数是跟存储字长相关的,字长越长,一个存取周期处理的数据就越多。 所以可以用数据传输率来表示存储速度,而存储器带宽就是衡是数据传输率重要指标。存储器带宽指单位时间内存储器存取的数据量。单位为位/秒(b/s),或者字节/秒(B/s)、字/秒。 存储器带宽=数据宽度/存储周期 例如,存储器周期为500ns,每个存取周期可以访问16位,那么带宽就是: 16bit÷500ns=32Mb/s
2.存储容量
存储容量指存储器能存放的数据总量,一般用二进制代码的总位数(bit)来表示。 存储容量=存储字数×存储字长 存储字数代表了存储器地址空间的大小,由地址线的位数决定。容量一般也可以用字节总数(Byte)来表示,也就是: 存储容量(字节数)=存储字数×存储字长/8 例如,某机器存储字长为8位,地址线有28位,那么它的主存最大存储容量为: 228×8/8=228B=256MB
3.位价
每位价格也就是存储器的单位成本。 位价=总成本/总容量 一般来说,速度越高,位价就越高;容量越大,位价就越低;而且容量越大,速度也会越低。
层次花存储器的基本结构
上面列出了不同层级的存储器。由上至下,位价越来越低,速度越来越慢,容量越来越大,CPU访问的频度也越来越少。
- 存器通常都制作在CPU芯片内。寄存器中的数直接在CPU内部参与运算,CPU内可以有十几个、几十个寄存器,它们的速度最快,位价最高,容量最小。
- 主存用来存放将要参与运行的程序和数据,它与CPU速度差距较大。
- 为了使主存和CPU之间速度更好地匹配,需要在主存与CPU之间插入一种比主存速度更快、容量更小的高速缓冲存储器Cache,其位价要高于主存。
磁盘、磁带属于辅存,其容是比主存大得多,大都用来存放暂时未用到的程序和数据文件。CPU不能直接访问辅存,辅存只能与主存交换信息,因此辅存的速度可以比主存慢得多。 存储系统的层次结构主要体现在缓存-主存和主存-辅存这两个存储层次上。显然,CPU和缓存、主存都能直接交换信息;缓存能直接和CPU、主存交换信息;而主存可以和CPU、缓存、辅存交换信息。
- 缓存-主存层次 这一层次主要解决CPU和主存速度不匹配的问题。由于缓存的速度比主存的速度高,只要将CPU近期要用的信息调人缓存,CPU便可以直接从缓存中获取信息,从而提高访存速度。但由于缓存的容量小,因此需不断地将主存的内容调入缓存,使缓存中原来的信息被替换掉。主存和缓存之间的数据调动是由硬件自动完成的,对程序员是透明的。
- 主存-辅存层次 这一层次主要解决存储系统的容量问题。辅存的速度比主存的速度低,而且不能和CPU直接交换信息,但它的容量比主存大得多,可以存放大量暂时未用到的信息。当CPU需要用到这些信息时,再将辅存的内容调人主存,供CPU直接访问。主存和辅存之间的数据调动是由硬件和操作系统共同完成的。在主存-辅存这一层次的不断发展中,逐渐形成了虚拟存储系统。主存和辅存共同构成了虚拟存储器,二者在硬件和系统软件的共同管理下工作。
从CPU角度来看,缓存-主存这一层次的速度接近于缓存,高于主存;其容量和位价却接近于主存。主存-辅存这一层次;从整体分析,其速度接近于主存:容量接近于辅存,平均位价也接近于低速、廉价的辅存位价。这就解决了速度、容量、成本这三者的矛盾。现代的计算机系统几乎都具有这两个存储层次,构成了缓存、主存、辅存三级存储系统。
半导体存储器
半导体存储器分为随机存取存储器(RAM)和只读存储器(ROM)。 RAM是一种可读/写存储器,其特点是存储器的任何一个存储单元的内容都可以随机存取,而且存取时间与存储单元的物理位置无关。计算机系统中的主存都采用这种随机存储器。 RAM按照存储信息的原理不同,又可以分为静态随机存取存储器(SRAM)和动态随机存取存储器(DRAM),主存储器主要由DRAM实现,靠近处理器的那一层缓存(Cache)则由SRAM实现,它们都是易失性存储器。ROM是非易失性存储器。 采用超大规模集成电路制造工艺,可以将半导体存储器集成在一个芯片上,一个芯片内主要包括了具有记忆功能的存储矩阵、译码驱动电路和读/写电路等。
主存中各个存储单元的空间位置,是由一个地址号来表示的;通过地址总线可以给定一个存储单元的地址号,从而根据地址读出或者写入一个存储字。
- 译码驱动:将地址总线送来的地址信号翻译成对应存储单元的选择信号,该信号在读/写电路的配合下完成对被选中单元的读/写操作。
- 读/写电路:包括读出放大器和写入电路,用来完成读/写操作。存储芯片通过地址总线、数据总线和控制总线与外部连接。地址线和数据共同反映了芯片的存储容量。比如,10根地址线,4根数据线,表示芯片的存储容量为:210×4=4Kb。
- 地址线是单向输入的,其位数与芯片存储容量有关。
- 数据线是双向输入的,其位数与芯片每次可读出或写入的数据位数有关,从而也影响到存储容量。
- 控制线包括了读/写控制线和片选线。读/写控制线决定芯片进行的具体操作,片选线用来选择芯片。不同的存储芯片的控制线可能是不同的,有的芯片读/写控制线是两根(引脚名称一般是OE和WE),有的芯片则读/写共用一根(引I脚WE);片选线一般是一根(引脚CE或CS),也有可能是两根。半导体存储芯片的译码驱动,主要有两种方式:线选法和重合法。
- 线选法:是用一根字选择线(字线),直接选中一个存储单元的各位。这种方式结构比较简单,不过只适合用于容量不大的存储芯片。
- 重合法:用两个方向的地址,共同决定选中存储矩阵中的一个存储单元。相比“一维”的线选法,重合法就升级到了“二维”,可以用更少的选择线实现对所有存储单元的选择。
SRAM
通常把存放一个二进制位的物理器件称为存储元,它是存储器最基本的构件。地址码相同的多个存储元构成一个存储单元。存储单元的集合构成存储体。 静态RAM(StaticRAM,SRAM)的存储元是用双稳态触发器(六晶体管MOS)来记忆信息的,因此信息被读出后,它仍保持其原状态而不需要刷新;这种读特性被称为"非破坏性读出”。 SRAM使用触发器工作原理存储信息,因此在读出信息后,它仍会持原来的状态,不需要刷新。不过如果电源掉电,存储的信息就会丢失,所以它属于易失性半导体存储器。SRAM的存取速度快,但集成度低,功耗较大,价格昂贵,一般用于Cache。
DRAM
动态RAM(DynamicRAM,DRAM)是利用存储元电路中栅极电容上的电荷来存储信息的。若电容上存有足够多的电荷表示存“1”,电容上无电荷则表示存“0"。 常见的动态RAM基本单元电路有三管式和单管式两种。单管式只需要一个MOS管和一个电容,因此可以极大地提高集成度。 DRAM的基本存储元可以只使用一个晶体管,所以它比SRAM的密度要高很多。为了进一步提高集成度,DRAM采用地址复用技术,地址信号分行、列两次传送,这样地址线是原来的一半,地址引脚数也可以减少一半,就能够进一步减小芯片的体积。因此内部有一个时序和控制电路根据时钟周期来区分地址信号 相对SRAM来说,DRAM具有容易集成、价位低、容是大和功耗低等优点,但DRAM的存取速度比SRAM慢,一般用于大容量的主存系统。
DRAM的刷新
由于电容上的电荷一般只能维持1~2ms,因此即使电源不掉电,信息也会自动消失。为此,必须在2ms内对所有存储单元恢复一次原状态,这个过程称为再生或者刷新。 刷新的过程,实质上是先将原存信息读出,再由刷新放大器形成原信息并重新写入的再生过程。由于存储单元是被随机访问的,有些存储单元可能一直不会被访问,因此其存储的原信息将会慢慢消失。因此,必须进行定时刷新。一般要求在一定的时间内,对动态RAM的全部基本单元必须作一次刷新,这个时间称为刷新周期,也叫再生周期,一般取2ms。
通常有三种刷新方式:集中刷新、分散刷新和异步刷新。
集中刷新
刷新放大器(读放大器)每列或每行有一个就可以了,每次都可以刷新一行 在规定的一个刷新周期内,对全部存储单元集中一段时间进行逐行刷新;刷新时必须停止读/写操作。例如,我们有一个芯片的存储矩阵为128×128,它的存取周期为0.5us,刷新周期为2ms(4000个存取周期),那么对它的128行存储单元进行集中刷新需要: 0.5μs×128=64μs
那剩余的1936us(3872个存取周期)就可以用来读/写或者维持信息。由于在这64us内无法进行读/写操作,所以这段刷新时间被称为“死时间”,也叫访存“死区”。死时间占据存取周期的比例 64us/2ms×100%=3.2%,称为死时间率。
分散刷新
对每行存储单元的刷新,分散到每个存取周期内完成。这样,每个存储周期tc就分成了两段:前半段tM用来读/写或者维持信息,后半段t用来刷新。所以: tc=tM+tR 同样以128×128存储矩阵的芯片为例,读/写周期tm=t=0.5us,那么存取周期tc=1us。逐行进行刷新,每隔128us就可以将存储芯片全部刷新一遍。 这样的好处是不存在停止读/写操作的死时间,而且刷新间隔比要求的刷新周期2ms短得多;缺点在于存取周期tc变长了,使得整个系统速度变慢。
异步刷新
异步刷新是前两种方式的结合,它既可以缩短“死时间”,又能充分利用最大的刷新间隔2ms。还是之前的例子,对于128×128存储矩阵的芯片,存取周期tc=0.5us,可以让它把对128行的刷新平均分配到2ms的刷新周期内。也就是说,每隔2ms÷128=15.6us刷新一行,每次刷新的时间还是一个存取周期tR=0.5μS。 这样一来,2ms内用于刷新的时间仍然是128tR=64us,而由于分散到了整个刷新周期内,每次刷新一行只停了一个存取周期;所以对于每行来说,刷新的间隔还是2ms,而“死时间”缩短为0.5uS。 如果将DRAM的刷新安排在CPU对指令的译码阶段,由正这个阶段CPU不会访问存储器,所以这样就完全避免了“死时间”的问题,从根本上提高了机器效率。
ROM(ReadOnlyMemory)
最原始的定义是“只读存储器”,一旦写入原始信息后就不能更改。所以ROM通常用来存放固定不变的程序、常数和汉字字库,甚至用于操作系统的固化。它与随机存储器可共同作为主存的一部分,统一构成主存的地址域。 不过随着用户的需要和技术的发展,又出现了更多类型的ROM,让用户拥有了修改数据的能力。
- MROM(MaskRead-OnlyMemory)一一掩模式只读存储器 厂家按照客户需求,在芯片生产过程中直接写入信息,之后任何人不可重写(只能读出)可靠性高、灵活性差、生产周期长、只适合批量定制
- PROM(Programmable Read-Only Memory)一一可编程只读存储器 用户可用专门的PROM写入器写入信息,写一次之后就不可更改
- EPROM(Erasable Programmable Read-Only Memory)一一可擦除可编程只读存储器 允许用户写入信息,之后用某种方法擦除数据,可进行多次重写
- UVEPROM(ultraviolet rays)一一用紫外线照射8~20分钟,擦除所有信息
- EEPROM(也常记为E^2PROM,第一个E是Electrically)--可用“电擦除”的方式,擦除特定的字
- Flash Memory -闪速存储器 (注:U盘SD卡就是闪存)在EEPROM基础上发展而来,断电后也能保存信息,且可进行多次快速擦除重写注意:由于闪存需要先擦除在写入,因此闪存的“写”速度要比“读”速度更慢。
- SSD(Solid StateDrives)一一固态硬盘 由控制单元+存储单元(Flash 芯片)构成,与闪速存储器的核心区别在于控制单元不一样,但存储介质都类似,,可进行多次快速擦除重写。SSD速度快、功耗低小价格高目前个人电脑上常用SSD取代传统的机械硬盘
Flash
闪速存储器(闪存,Flash),又称快擦型存储器,是在EEPROM的工艺基础上发展而来的,性价比更好、可靠性更高。其主要特点有:
- 价格便宜、集成度高;
- 属非易失性存储器,适合长期保存信息;
- 能快速擦写(电可擦除),写入前必须先擦除,因此写比读要慢。 由于Flash的擦除、重写时间已经非常短,比一般的EEPROM要快得多,所以Flash已经具备了RAM的功能,可以与CPU直接相连。电脑的BIOS程序由于包含了开机后的自检程序和自举装载程序,一般都会固化到主板上的一个ROM芯片中:如今的电脑通常就会用Flash芯片来存放BIOS程序。 Flash可以至少擦写10000次以上,而且是非易失性存储器,所以在需要周期性修改存储信息、并长期保存的场合,它是一个非常理想的存储器;比如工控系统、单片机中作为数据采集和存储器件,用于制作U盘和移动硬盘等。 自前随看闪存技术的发展,容量越来越大、价格越来越低,让大容量Flash取代磁盘成为了可能。用闪存技术做成固态硬盘(SSD),可以代替传统的磁盘,速度更快,功耗更低,体积更小。如今很多笔记本电脑中都使用了SSD,使得计算机平均无故障时间示大延长。
存储器 | 特点 | 应用 |
---|---|---|
SRAM | 易失性存储器,断电信息即丢失;非破坏性读出,不需要刷新;高速缓存(Cache)存取速度快,集成度低,功耗大 | 高速缓存Cache |
DRAM | 易失性存储器,断电信息即丢失;破坏性读出,需要刷新;主存集成度高、容量大、功耗低、价位低 | 主存 |
ROM | 非易失性存储器,信息永久保存 通常只能读出、不能写入 新型的可编程ROM也可以进行写入 | 存放固定不变的程序和数据;和RAM共同作为主存的一部分,构成主存的地址域;Flash可以用来制作U盘、SSD |
主存储器
其内部有三个结构:存储体(用来存储数据)、MDR存储器数据寄存器(主要存储数据)、MAR存储器地址寄存器(存储要访问的存储单元的地址) 存储体是由存储单元构成的,每个存储单元都有一个地址,cpu要存取数据的时候要先把要访问的地址写入到mar中,然后根据地址找到对应的存储单元,然后根据读写控制信号决定是把mdr中的数据写进去还是把存储体中的数据读出来放到mdr中 地址总线连接cpu和mar,拿到的地址放到mar里边,从mar中拿到地址后首先交给到译码器,将其翻译为能够连接到想要的存储单元的选择线上,选择线还需要经过驱动电路的放大,最终就可以选中想要的存储单元了,然后通过读写电路就可以将数据放到mdr中mdr再通过数据总线交给cpu,写入的时候也需要通过读写电路写入 在实际使用中是将译码器、驱动器、存储体、读写电路、控制电路封装在DRAM存储芯片中的;而mar和mdr会集成在cpu芯片中存储芯片可以通过总线与cpu相连
位扩展 位扩展是指对字长进行扩展,也就是增加存储字长。这种情况下,系统地址线位数等于芯片地址线位数,而系统数据线位数多于芯片数据线位数。 位扩展的连接方式:各芯片的地址线、片选线和读写控制线与系统总线相应并联;各芯片的数据线单独引出,分别连接系统数据线。各芯片同时工作。 以之前介绍过的SRAM芯片2114为例,它的存储容量为1K×4,那么用2片2114采用位扩展的方式可以组成1K×8的存储器。如下所示:
字扩展 字扩展是指对存储字的数量进行扩展,而存储字的位数满足系统要求。这种情况下,系统数据线位数等于芯片数据线位数,系统地址线位数多于芯片地址线位数。 字扩展的连接方式:各芯片的地址线与系统地址线的低位对应相连,芯片的数据线和读写控制线与系统总线相应并联;由系统地址线的高位译码得到各芯片的片选信号。各芯片分时工作,同一时间只能有一个芯片被选中。 扩展之后的地址线为11位,共有211=2K个地址。其中: 第一片2114的地址范围为00000000000~01111111111; 第二片2114的地址范围为10000000000~11111111111
字和位同时扩展 字和位同时扩展是前两种扩展的组合,这种方式既增加存储字的数量,又增加存储字长。 字和位同时扩展的连接方式:将进行位扩展的芯片作为一组,各组的连接方式与位扩展相同;由系统地址线高位译码产生若千个片选信号,分别接到各组芯片的片选信号。 例如,用8片容量为1K×4的2114芯片,字和位同时扩展之后可以组成4K×8的存储器。如下所示: 扩展之后的地址线为12位,共有212=4K个地址。其中: 第一、二片2114通过位扩展构成第一组,地址范围为000000000000~001111111111; 第三、四片2114通过位扩展构成第二组,地址范围为010000000000~011111111111; 第五、六片2114通过位扩展构成第三组,地址范围为100000000000~101111111111; 第七、八片2114通过位扩展构成第四组,地址范围为110000000000~111111111111。
多模块存储器
随着计算机技术的发展,处理的信息量越来越多,对存储器的速度和容量要求也越来越高;而且随着CPU性能的不断提升、1/O设备数量不断增加,导致主存的存取速度已经成为了整个计算机系统的性能瓶颈。这就要求我们必须提高主存的访存速度。 基本的想法是寻找更加高速的元器件和存储芯片,或者采用层级结构、加入高速缓存;除此之外,调整主存的结构也可以提高访问速度。这就是所谓的多模块存储器。
1、单体多字存储器
在主存中,程序和数据是连续存放的,所以CPU访存取出的信息也是连续的。如果将存储器的存储单元进行扩展,让它能够存储更多的字,那么就可以在一个存取周期内,从同一地址取出更多的指令。将多条指令逐条送至CPU执行,由于CPU的速度远高于主存,这样就相当于增大了主存的带宽,提高了速度。 这种方式是对单独的存储器进行了扩展,类似于位扩展的思路,不过是将一个地址对应的数据扩展到了多个存储字。所以这种结构的存储器称为单体多字存储器。 例如,对于一个单体四字存储器,可以在一个存取周期取出四个字的信息。假设指令字长就是一个存储字,那么原先一个存取周期拿到一条指令,现在就可以拿到4条;逐条传给CPU进行处理,就相当于每隔1/4周期,主存就向CPU传送了一条指令,带宽变成了4倍。
- 结构特点:存储器中只有一个存储体,每个存储单元存储m个字,总线宽度也为m字。
- 访问方式:一次并行读出m个字,地址必须顺序排列并处于同一存储单元。
- 优点:宽度为单体单字存储器的近m倍(访问的内容在同一行时)。
- 缺点:如果出现访问冲突(需要的内容不在同一行)或遇到转移指令,效率会显著降低。
2.多体并行系统
另一种思路是采用多模块组成存储器,各个模块可以并行读写,这就是多体并行系统。每个模块有相同的容量和存取速度,各模块都有自己独立的地址寄存器(MAR)、数据寄存器(MDR)、地址译码、驱动电路和读/写电路,它们能并行工作,也能交叉工作。 所谓的“并行工作”,就是CPU可以同时访问N个模块,同时启动,同时读出;当然,由于总线是公共的,同时读出的N个字需要在总线上分时传送。 根据对这N个模块中存储单元的不同编址方式,多体并行系统又可以分为多体高位交叉存储器和多体低位交叉存储器。
(1)多体高位交叉存储器
多体高位交叉存储器中,各模块采用高位交叉方式编址。 高位交叉方式编址时,地址分为两部分,高位地址表示体号,低位地址为体内地址。这种编址方式下,一个模块(也就是“体")内的地址是连续的,程序存储时会按照体内地址的顺序存放,也就是先存一个模块,存满之后再存下一个;所以这种方式也叫“顺序存储”。 根据体号区分要选中的存储单元,再根据译码器导通对应存储单元 只要调动合理,使不同的请求源同时去访问不同的模块,就可以实现并行工作。比如,CPU在访问一个模块的同时,外部设备可以以直接存储器访问(DMA)的方式访问另一个模块,这样两个体就是并行工作的。 多体高位存储器在多个不同请求源处理多个任务的时候可以提升效率,但不能使一个请求源运行效率更高,这样就需要使用多体低位交叉存储器了
(1)多体高位交叉存储器
多体低位交叉存储器中,各模块采用低位交叉方式编址。低位交叉编址是指用主存地址的低位来指明存储器模块,高位指明模块内的字地址。这种编址方式下,连续的地址分布在相邻的模块中,同一模块内的地址是不连续的,因此也叫做“交叉存储”。有M个模块的低位交叉编址,又叫模M编址。 程序按照地址连续存放在相邻模块中,采用低位交叉编址后,可以在不改变每个模块存取周期的前提下,采用流水线方式并行存取,提高存储器的带宽。 在一个存取周期T内,m个模块按一定的顺序分时启动;如果分时启动的时间间隔为t=T/m,那么在一个存取周期内,CPU交叉访问各个模块,从而使各模块的读/写操作交错重叠进行,最终向CPU可以传送m个字。这样,存储器的带宽提升为m倍。 由于各个模块传送取出的字共享总线,因此假设总线传输周期为T,当t小于等于T时,就可以获得最大的存储器带宽。所以: t=T/m≤T 所以,对于一个存取周期为T、总线传输周期为T的机器,设计多体低位交叉存储器时应该有m≥T/T。一般取最小值即可,在采用流水线方式时应该满足 T=m T
可以看出,对于流水线工作的低位交叉存储器,连续读取n个字所需的时间为: t=T+(n-1)T 而如果是高位交叉存储器,对应的时间为: t2=nT 对于上面的四字低位交叉存储器,T=T/4,所以t=(n+3)T/4,明显要低于t2:当n非常大时,t趋近于T/4,即速度提升了4倍。
外部存储器
外部存储器是主存的后援设备,也叫做辅助存储器,简称外存或辅存,与主存一起构成了存储器系统的主存-辅存层次。与主存相比,外存容量大、速度慢、价格低,可以脱机保存信息,属于非易失性存储器。 用于计算机系统的外存主要有磁盘、磁带、光盘;磁盘和磁带都属于磁表面存储器。而目前广泛应用的固态硬盘(SSD)主体由闪存芯片构成,属于半导体存储器。
磁盘存储器
磁盘是应用最为广泛的外存设备。磁盘根据结构和盘片材质的不同,可以分为硬磁盘和软磁盘,如今随着存储技术的发展,软磁盘存储器已渐渐不再使用,而硬磁盘存储器依然在外存中占据着重要的比例。 磁盘存储器具有外存设备普遍的优缺点: 优点:存储容量大,位价低;记录介质可重复使用;记录信息可长期保存而不丢失,甚至可脱机存档:非破坏性读出,读出时不需要再生。 缺点:存取速度慢,机械结构复杂。
磁盘的所有磁道记录的数据量都是相等的 越内侧的磁道位密度越大
将磁盘控制器的功能全部内置在磁盘设备中,主机和设备之间就可以采用标准的通用接口了。最初这种接口就称为IDE(Integrated Drive Electronics)(ATA、PATA)接口,同时期还有更高性能的ScSI(Small Computer SystemInterface)接口:之后又发展出了采用串行传输技术的接口,这就是SATA(Serial Advanced Technology Attachment)和SAS(Serial Attached SCSI)。目前我们的个人电脑中,大多都是采用SATA接口的硬盘。
磁盘地址 一个磁盘存储器可以有多台驱动器,不同的驱动器可以用一个编号(驱动器号,或者台号)来区分。当驱动器号确定后,磁盘进行寻址定位时,首先需要整体移动磁头找到对应柱面(磁道)、再选定磁头,最后转动盘片找到扇区。所以寻址所需要的磁盘地址,一般由驱动器号、柱面(磁道)号、盘面号、扇区号组成。
驱动器号+柱面(磁道)号+盘面号+扇区号
例如,系统中有4个驱动器,每个驱动器带一个磁盘组,其中有11个盘片(最外层上下侧为保护面),每个盘面有203个磁道、划分为16个扇区。则可以算出,驱动器号需要2位;柱面号需要8位(27<203<2°);而11个盘片有20个盘面,所以盘面号需要5位;扇区号需要4位。最终每个磁盘地址要19位二进制代码。 驱动器号(2位)+柱面(磁道)号(8位)+盘面号(5位)+扇区号(4位)
磁盘的主要操作是寻址、读盘、写盘。磁盘属于机械式部件,其读/写操作是串行的,不可能在同一时刻既读又写,也不可能在同一时刻读两组数据或写两组数据。
冗余磁盘阵列
兄余磁盘阵列(RedundantArrayofIndependentDisks,RAID)是将多个独立的物理磁盘组成一个磁盘阵列,引入并行处理技术,让数据在多个物理盘上分割交叉存储、并行访问。 根据不同的目的,可以采用不同的RAID方案;在RAID1~RAID5的几种方案中,无论何时有磁盘损坏,都可以随时拔出受损的磁盘再插入好的磁盘,而数据不会损坏。RAID的分级如下所示:
- RAID0:无冗余和无校验的磁盘阵列
- RAID1:镜像磁盘阵列,无校验
- RAID2:采用纠错的海明码的磁盘阵列
- RAID3:位交叉奇偶校验的磁盘阵列
- RAID4:块交叉奇偶校验的磁盘阵列
- RAID5:无独立校验的奇偶校验磁盘阵列 其中,RAIDO把连续多个数据块交替地存放在不同物理磁盘的扇区中,几个磁盘交叉并行读写,不仅扩大了存储容量,而且提高了磁盘数据存取速度,但RAIDO没有容错能力。 RAID1是为了提高可靠性,使两个磁盘同时进行读写,互为备份,如果一个磁盘出现故障,可从另一磁盘中读出数据。两个磁盘当一个磁盘使用,意味着容量减少一半。 总之,RAID通过同时使用多个磁盘,提高了传输率;通过在多个磁盘上并行存取来大幅提高吞吐量;通过镜像功能,提高了安全性、可靠性;通过数据校验,提供容错能力。
固态硬盘
最大的问题是基于EEPROM的擦除原理,随机写入比较慢。 固态硬盘的数据都存放在闪存芯片中。一个闪存芯片内包含了多个“块”,每个块又由若干“页”组成。数据以页为单位进行读写,但是需要以块为单位进行擦除;所以只有一页所属的块整个被擦除之后,才能重新写这一页。一旦一个块被擦除了,块中的每一页都可以再写一次。一般某个块进行了数千次重复写之后,就会损坏。 当一个数据要写入到一个块中的时候,若该块中存有数据就需要将该数据复制一份放到其他块中,若该数据复制到其他块中的时候目标块有数据也需要这样操作。数据复制过去后就可对目标块进行擦除然后写入了,这样原数据的地址也发生了改变在闪存翻译层就需要对此改变 闪存的擦写寿命是有限的,读/写数据通常会集中在SSD的一部分闪存,这部分闪存就会损坏得特别快;在磨损不均衡的情况下,数个闪存块的损坏,会导致整个SSD损坏。为弥补SSD的寿命缺陷,引I入了磨损均衡技术,SSD磨损均衡技术大致分为两种:
- 动态磨损均衡:写入数据时,自动选择较新的闪存块(里面有空白的页可以直接写的)。
- 静态磨损均衡:监测并自动进行数据分配,让旧的闪存块承担无须写数据的储存任务,同时让较新的闪存块空出来;平常的读/写操作都在较新的闪存块中进行,这样就使各闪存块的损耗更为均衡。 有了磨损均衡技术,SSD的寿命就比较可观了。例如,对于一个256GB的SSD,闪存的擦写寿命是500次的话,那么就需要写入125TB数据才可能损坏;而目前的Flash芯片已经做到至少可以擦写上万次了。
告诉缓冲存储器
为了解决CPU和主存之间速度不匹配的问题,计算机系统中引入了高速缓存(Cache)的概念。基本想法就是使用速度更快但容量更小、价格更高的SRAM制作一个缓冲存储器,用来存放经常用到的信息;这样一来,CPU就可以直接与Cache交换数据,而不用访问主存了。 这种方案之所以有效,是因为通过对大量典型程序分析发现,在一定时间内,CPU要从主存取指令或者数据,只会访问主存局部的地址区域。这是由于指令和数据在内存中都是连续存放的,而且有些指令和数据会被多次调用(比如常用函数、循环代码段、数组和一些常数);也就是说,指令和数据在主存中地址分布不是随机的,而是相对的簇聚。这使得CPU执行程序时,访存具有相对的局部性;这称为程序访问的局部性原理。
- 时间局部性:如果一个数据现在被访问了,那么以后很有可能也会被访问
- 空间局部性:如果一个数据现在被访问了,那么它周围的数据在以后可能也会被访问局部性原理是Cache高效工作的理论基础。
为了便于Cache与主存交换信息,Cache和主存都被划分为相等的块。Cache块又称Cache行,每块由若干字节组成,块的长度称为块长。由于Cache的容量远小于主存的容量,所以Cache中的块数要远少于主存中的块数,Cache中仅保存主存中最活跃的若干块的副本。
假设主存按字节编址,地址用n位二进制码表示,那么主存容量为2°B;块的大小为16个字节,那么主存中块的个数为:2n/16=2n4。那么如果对每个块也做一个编号,其实就对应着地址中的前n-4位。 这样,主存地址就分成了两部分:高n-4位表示主存中的“块地址”,低4位表示“块内地址”,块内地址其实就是具体存储字在块内的“偏移量”。类似,Cache中地址也可以分成这样的两部分,由于Cache中块长与主存一致,所以低4位同样是块内地址:剩余的高位则为Cache的块号。Cache的块号位数小于n-4。
可按照某种策略预测CPU在未来一段时间内要访存的数据,将其装入Cache。当CPU要读取主存中的某个字时,分为两种情况:
- Cache命中:需要的字已经在缓存中,就将其地址转换为缓存地址,直接访问Cache,与主存无关;
- Cache未命中:需要的字不在缓存中,仍需访问主存,并将该字所在的块一次性地从主存调入Cache。如果某个主存块已经调入Cache,就称该主存块和Cache中的缓存块建立了对应关系。由于Cache容量有限,当Cache已满时,就需要根据某种替换算法,让需要调入Cache的块替换之前某个缓存块的内容。所以,一个缓存块不可能永远只对应一个主存块;需要给每个缓存块设置一个标记,写入当前对应的主存块号,表示它当前存放了哪个主存块。CPU与Cache之间的数据交换,通常是以字为单位;而Cache与主存之间的数据交换则以块为单位。 Cache的效率,通常用命中率来衡量。命中率是指CPU要访问的信息已经在Cache中的比率。Cache的容量和块长都是影响命中率的重要因素。假设一个程序执行期间,访问Cache的总命中次数为N.,访问主存的总次数为Nm,那么命中率为:h=NeN+Nm设t为命中时的Cache访问时间,tm为未命中时的主存访问时间,那么Cache-主存系统的平均访问时间t为:ta=htc+(1-h)tm由于t.远小于tm,因此平均访问时间t。越接近t.就说明Cache效率越高。用e表示访问效率,则有:tce=tcta×100%=htc+(1-h)tm×100%命中率h越接近1,访问效率就高。一般来说,Cache容量越大,命中率就越高;而块长与命中率的关系较为复杂,它取决于程序的局部特性,一般取每块4~8个可编址单位(字或字节)效果较好。
Cache的改进
Cache的改进,主要就是由一个缓存改为使用多个缓存。主要有两个方向:增加Cache级数;将统一的Cache变为分立的Cache。 (1)两级缓存 最初在CPU和主存之间只设一个缓存,称为单一缓存。随着集成电路密度的提高,这个缓存就直接与CPU集成在了一个芯片中,所以又称为片内缓存(片载缓存)。 由于片内缓存容量无法做到很大,所以可以考虑在片内缓存和主存之间再加一级缓存,称为片外缓存,也由SRAM组成。这种由片外缓存和片内缓存构成的Cache系统被称为“两级缓存”,片内缓存作为第一级(L1Cache),片外缓存作为第二级(L2Cache)。 (2)分立缓存 指令和数据都存放在同一缓存内的Cache,称为统一缓存:而分立缓存则将指令和数据分别存放在两个缓存中,一个叫指令Cache,另一个叫数据Cache。这两种缓存的选择主要考虑两个因素:
- 主存结构。如果计算机主存中指令、数据是统一存储的,则相应的Cache采用统一缓存;如果主存指令、数据分开存储,则相应的Cache采用分立缓存。
- 机器对指令执行的控制方式。如果采用了超前控制或者流水线控制方式,一般都采用分立缓存。所谓超前控制,是指在当前指令执行尚未结束时就提前把下一条准备执行的指令取出;而所谓流水线控制,就是多条指令同时分阶段执行。
映射方式
直接映射
Cache行号=主存块号 mod Cache总行数 例如,假设主存地址为32位,按字节编址,主存块大小为64B,所以主存块共有232/64=226个;如果Cache只有4行(4个块) 直接映射实现简单,但不够灵活,即使Cache的其他许多地址空着也不能占用,这使得直接映射的块冲突概率高,空间利用率低。
全相联映射
直接映射的问题在于,我们找到的是从主存块到缓存行的一种“多对一”的关系,每一个主存块只能对应唯一的缓存行,从而导致冲突概率高。如果让一个主存块,可以映射到多个缓存块上,变成“多对多”的关系,明显就可以减少冲突了。 最简单的情况,就是不加任何条件限制,让主存的每一个块都可以映射到Cache的任意位置;简单来说就是有空就填”,放在哪里都可以。这就是全相联映射方式 由于没有任何规律,所以当一个块存放在Cache中,无法根据Cache行号推出它对应主存块的任何信息;因此必须在每行的标记中明确指出该行取自主存的哪一块,这样标记就需要完整的m位主存块号。CPU访存时,需要与所有Cache行的标记进行比较。
全相联映射方式的优点是灵活,Cache块的冲突概率低,空间利用率高,命中率也高;缺点是标记的速度较慢,实现成本较高,通常需采用昂贵的按内容寻址的相联存储器进行地址映射。
组相联映射
把直接映射和全相联映射两种方式结合起来,就是组相联映射方式。 组相联的思路是将Cache分成Q个大小相筹的组,每个主存块可装入对应组的任意一行:它所在的组则按顺序依次排列得到。也就是组间采用直接映射、而组内采用全相联映射的方式。当Q=1时,变为全相联映射;当Q=Cache行数时变为直接映射。 假设每组有R个Cache行,则称之为R路组相联;例如每组有2个Cache行时称为2路组相联。 类似的例子,假设主存地址为32位,按字节编址,主存块大小为64B,所以主存块共有232/64=226个;如果Cache有8行(8个块),采用2路组相联映射方式,那么共有Q=8/2=4组。对应关系如下:
替换算法
写策略
因为Cache中的内容是主存块内容的副本,当对Cache中的内容进行更新时,就需选用写操作策略使Cache内容和主存内容保持一致。此时分两种情况:
- Cache写命中(要修改的单元在Cache中)这种情况有两种处理方法:
- 写直达法 也叫全写法、写穿透法。将数据同时写入Cache和主存。这种方法实现简单,一致性好。缺点是降低了速度,时间开销为访存时间。为了减少写入主存的开销,可以在Cache和主存之间加一个写缓冲。
- 写回法 也叫回写法、写返回法。数据只写入Cache,而不立即写入主存,只有当此块被换出时才写回主存。这种方法效率很高,但一致性较差。在每个Cache行中设置一个修改位(脏位),若修改位为1(脏"),则说明对应Cache行中的块被修改过,替换时须写回主存;若修改位为0(净"),则替换时无须写回主存。
- Cache写未命中(要修改的单元不在Cache中)这种情况也有两种处理方法:
- 写分配法 把数据写入主存,同时将该块调入Cache。这种方法依据了空间局部性原理。
- 非写分配法 只把数据写入主存,不进行调块。非写分配法通常与全写法合用,写分配法通常与回写法合用。
虚拟存储器
早期的计算机,CPU是直接操作主存的,也就是运行程序时,直接给出要访问的实际主存地址。这种方式简单直接,但是会有一些问题:
- 不同的程序之间需要共享内存,它们的内存地址空间很难隔离,从而导致程序运行的稳定性和安全性降低;
- 主存容量有限,如果同时执行的程序太多、使用内存太大容易超出容量限制而前溃。 为了解决这些问题,在主存-辅存这一层次的不断发展中,逐渐形成了虚拟存储系统。 主存和辅存共同构成了虚拟存储器,二者在硬件和系统软件的共同管理下工作。对于应用程序员而言,虚拟存储器是透明的。虚拟存储器具有主存的速度和辅存的容量。
虚拟存储器将主存和辅存的地址空间统一编址,形成一个庞大的地址空间,在这个空间内,用户可以自由编程,而不必在乎实际的主存容量和程序在主存的实际存放位置。用户编程允许涉及的地址称为虚地址或逻辑地址,虚地址对应的存储空间称为虚拟空间。实际的主存地址称为实地址或物理地址,实地址对应的是主存地址空间。虚地址比实地址要大很多。
使用虚拟存储器之后,程序中看到的地址都是逻辑地址。在访存时,逻辑地址首先会被转换成物理地址,然后再访问实际物理内存。
这样一来,每一个程序都有独立的虚拟地址空间,不同进程的虚拟地址空间互相不干抗,提高了安全性。在每个进程看来,就像它自己独享了整个内存。当物理内存不够时,可以将一部分不常使用的内存块换出(Swap-out)到磁盘中,下次使用时再换入到内存中(Swap-in),这样程序就可以使用超过实际物理内存大小的地址空间了。 相当于硬盘和主存当作缓存和主存那样使用 CPU使用逻辑地址时,先判断这个逻辑地址对应的内容是否已装入主存。若已在主存中,则通过地址变换CPU可直接访问主存指示的实际单元;若不在主存中,则把包含这个字的一页或一段调入主存后再由CPU访问。若主存已满,则采用替换算法置换主存中的页。 虚拟存储器采用了和Cache类似的技术,将辅存中经常被访问的数据副本存放到主存中。但缺页(或段)而访问辅存的代价很大,因此虚存机制采用全相联映射,每个页可以存放到主布区域的任意一个空闲页位置。此外,当进行写操作时,不能每次写操作都同时写回磁盘,因而采用回写法。
页式虚拟存储器
页表
页表是一张存放在主存中的虚页号和实页号的对照表,它记录程序的虚页调入主存时被安排在主存中的位置。每个程序都有自己的页表,页表一般长久地保存在内存中。 页表中的每一项,都包含以下几部分:
- 有效位:也称装入位,用来表示对应页面是否在主存,若为1,则表示该虚页已从外存调入主存,此时页表项存放该页的物理页号;若为0,则表示页面没有调入主存,此时页表项可以存放该页的磁盘地址。
- 脏位:也称修改位,用来表示页面是否被修改过,虚拟存储机制中采用回写策略,利用脏位可判断替换时是否需要写回磁盘。
- 引用位:也称使用位,用来配合替换策略进行设置,例如是否使用先进先出(FIFO)或近期最少使用(LRU)策略等。
CPU执行指令时,需要先将逻辑地址转换为主存物理地址。每个进程都有一个页表基址寄存器,存放该进程的页表首地址,然后根据逻辑地址高位部分的虚页号找到对应的页表项。若装入位为1,则取出物理页号,和逻辑地址低位部分的页内地址拼接,形成物理地址;若装入位为0,则说明缺页,需要操作系统进行缺页处理。缺页时会由CPU的内存管理单元(MMU)发出中断,操作系统需要将相应的页从磁盘取回调入主存,并将物理页的地址填入页表中。 页式虚拟存储器的优点是:页的长度固定,页表简单,调入方便。缺点是:最后一页的零头无法利用而造成浪费,并且页不是逻辑上独立的实体,所以处理、保护和共享都不及段式虚拟存储器方便。
快表
有了虚拟存储器之后,CPU在寻址时所生成的都是虚拟地址。于是CPU在取指或者执行访存指令的时候,都需要进行地址翻译,而每次地址翻译都要访问主存中的页表,会产生严重的开销。 依据程序执行的局部性原理,当CPU在一段时间内总是经常访问某些页时,若把这些页对应的页表项存放在Cache中,就可以不访问主存直接进行地址翻译了;这样明显能提高效率。 在CPU芯片中,加入一个专门存放最常访问的页表项的Cache,就叫做转址旁路缓存(TranslationLookasideBuffer,TLB),一般简称为“快表”。TLB实质上就是“页表的Cache”,其中存储了当前最可能被访问到的页表项,其内容是部分页表项的一个副本;所以TLB又被称为页表缓存。 相应地,把放在主存中的页表称为慢表(Page)。在地址转换时,先查找快表,若命中,则无须再访问主存中的页表(慢表)。 TLB通常采用全相联映射。每个TLB项由页表表项内容加上一个TLB标记字段以及有效位等标志位组成,TLB标记用来表示该表项取自页表中哪个虚页号对应的页表项,其内容就是该页表项对应的虚页号。
段式虚拟存储器
在段式虚拟存储器中,将虚拟空间用“段”进行分割;而段是按程序的逻辑结构划分的,各段的长度因程序而异。虚地址分为两部分:段号和段内地址。虚地址到实地址之间的变换是由段表来实现的。段表的每行记录与某个段对应的段号、装入位和段长等信息。由于段的长度可变,所以段表中要给出各段的起始地址与段的长度。
CPU用逻辑地址访存时,先根据段号与段表基地址拼接成对应的段表项,再根据该段表项的装入位判断该段是否已调入主存(装入位为“1”,表示该段已调入主存)。当已调入主存时,从段表读出该段在主存的起始地址与段内地址相加,得到对应的主存物理地址。 段式虚拟存储器的优点是,段的分界与程序的逻辑分界相对应,这使得程序易于编译、修改和保护,也便于多道程序共享;缺点是因为段长度可变,分配空间不便,容易留下碎片,造成浪费。
段页式虚拟存储器
把程序按逻辑块分段,段内再分页,主存空间也划分为大小相等的页,程序对主存的调入调出仍以页为基本单位,这样的虚拟存储器称为段页式虚拟存储器。在段页式虚拟存储器中,每个程序对应一个段表,每段对应一个页表,段的长度必须是页长的整数倍,段的起点必须是某一页的起点。
虚地址分为段号、段内页号、页内地址3部分。CPU根据虚地址访存时,首先根据段号得到段表地址,然后从段表中取出该段的页表起始地址,与虚地址段内页号拼接,得到页表地址;最后从页表中取出实页号,与页内地址拼接成主存实地址。 段页式虚拟存储器的优点是,兼具页式和段式虚拟存储器的优点,可以按段实现共享和保护;缺点是在地址变换过程中需要两次查表,系统开销较大。
贡献者
版权所有
版权归属:PinkDopeyBug