计算机组成原理 第三章 存储系统

第三章 存储系统

存储器层次化结构

多级存储系统

image-20210709102641709

image-20210709102655653

主存——辅存:实现虚拟存储系统解决了贮存容量不够的问题

Cache——主存:解决了主存与CPU速度不匹配问题

image-20210709102945108

存储器的分类

存储介质分类

半导体存储器

磁表面存储器

光存储器

存取方式

相联存储器(Associative Memory) 如:"快表",按照内容检索到存储位置进行读写

CAM(Content Addressed Memory)存储器

RAM(Random Access Memory)随机存取存储器

SAM(Sequential Access Memory)顺序存取存储器

DAM(Direct Access Memory)直接存取存储器

信息的可改性

读写存储器(Read/Write Memory)可读可写(磁盘、内存、Cache)

只写存储器(Read Only Memory)可读不可写(CD-ROM,BIOS通常写在ROM)

信息的可保存性

image-20210709104315290

存储器的性能指标

\[\begin{align} &1.存储容量=存储字数*字长(1M*8位)\\ &2.单位成本:每位价格=\frac{总成本}{总容量}\\ &3.存储速度:数据传输率=\frac{数据的宽度}{存储周期}=\frac{存储字长}{存储周期}\\ &主存带宽:又称数据传输率,表示每秒从主存进出信息的最大数量,单位为字/秒,字节/秒(B/s),位/秒(b/s)\\ \end{align} \]

image-20210709104942008

主存储体的基本组成

image-20210709153008450

一行存储元就是一个存储字,存储字长:8bit

image-20210709153156526

image-20210709153808790

image-20210709154211175

计算引脚数量(数据线引脚+地址线引脚+读/写控制线引脚+片选线引脚+等等)

image-20210709154350099

可以通过描述如

\[\begin{align} &64K*16位\\ &数据线:16根\\ &地址线:16根\\ \end{align} \]

image-20210709160051369

将按字寻址转换为对应的按字节寻址:将字地址算术左移两位后转为相应的十进制

字地址:1

算数左移2位后:100

转为十进制:100 ——> 4

SRAM和DRAM

存储器特性对比

image-20210709160541650image-20210709160516570image-20210709161754154

3.2 DRAM的刷新(由存储器独立完成,不需要CPU控制)

image-20210709160819688

左侧为单个的行地址译码 直接将地址送到译码器

\[\begin{align} &2^n根选通线\\ \end{align} \]

0000 0000 选择0号存储单元

右侧为行列译码 高位地址送到行地址译码器 低位地址送到列地址译码器

\[\begin{align} &存储单元排成n*n的矩阵,2^{\frac{n}{2}}+2^{\frac{n}{2}}根选通线\\ \end{align} \]

0000 0000 选中0,0号存储单元

image-20210709161710201

地址线复用

image-20210709161959829

image-20210709162041092

ROM

ROM的类型

image-20210709162521373

计算机内的重要ROM

内存=内存条+BIOS的芯片

RAM和ROM统一编制

image-20210709162844813

主存储器与CPU的连接

image-20210709163324682

数据总线(宽度=存储字长)

位扩展(解决:数据总线宽度>存储芯片字长)

image-20210709163618238

image-20210709163633240

带横线表示低电平有效,不带横线表示高电平有效

CPU连接单个主存

image-20210709164040888

CPU连接两块主存

image-20210709164210718

1号主存和2号主存连接相同的地址线,接收相同的地址,CPU可以同时对两块主存的同一地址进行读写

CPU连接多块主存

image-20210709164429717

字扩展(增加主存的存储字数)

线选法

image-20210709165436449

高地址11和00时产生总线冲突 高地址为11和00时不能使用

译码器片选法image-20210709165255910

image-20210709170229203

字位同时扩展法

image-20210709170437088

译码器

image-20210709171022499

双端口RAM和多模块存储器(优化多核CPU访问一根内存条的速度)

双端口RAM

image-20210710155908929

image-20210710160657540

问题:

image-20210710160632516

image-20210710160611419image-20210710160717931

优化多喝CPU访问一根内存条的速度

对比操作系统“读者”“写者”问题

可以同时读不可同时写

多体并行存储器

image-20210710161341565

低位交叉编制可以降低存取时间

image-20210710161553901

\[\begin{align} &m=\frac{T}{r}满足\\ \end{align} \]

例题:

(1)计算连续取n个存储字的时间?

image-20210710162114004

(2)给定一个地址x,如何确定它属于第几个存储体?

例如:01101在哪个存储体?

法1:直接通过低位体号求得

\[\begin{align} &01\Rightarrow M_1 \\ \end{align} \]

法2:对地址的十进制数求余

\[\begin{align} &(01101)_2=(13)_{10},13\pmod{4}=1\Rightarrow M_1 \\ \end{align} \]

多模块存储器

image-20210710162816363

一次读一行

适用于连续读写

高速缓冲存储器Cache

Cache工作原理

程序的局部性原理

image-20210710163921097

image-20210710163946556

性能分析

image-20210710164353024

image-20210710164408453

例题

image-20210710164220590

\[\begin{align} &设Cache的访存周期为t,主存的存取周期为5t\\ &(1)Cache和主存同时访问:\\ &命中时访问时间为t,未命中访问时间为5t\\ &\bar t=0.95t+5t(1-0.95)=1.2t\\ &\eta=\frac{5t}{\bar t}\sim4.17\\ &(2)先访问Cache再访问主存:\\ &命中时访问时间为t,未命中访问时间为t+5t\\ &\bar t=0.95t+6t(1-0.95)=1.25t\\ &\eta=\frac{5t}{1.25t}=4\\ \end{align} \]

剩余问题

image-20210710210420887

image-20210710210349239

image-20210710210433763

Cache-主存映射方式

三种映射

添加标记为和有效位

image-20210710215134861

image-20210710215455572

image-20210710215530770

全相联映射

image-20210710215516325

直接映射

image-20210710220127614

当两块冲突时无法解决

image-20210710220109978

对标记位进行优化:

\[\begin{align} &主存块号\%2^3\Leftrightarrow 留下最后三位二进制数\\ &即:Cache总块数=2^n,则主存块号末尾n位反映它在Cache中的位置\\ &将主存块号的其余位作为标记\\ \end{align} \]

image-20210710220724351

CPU访存:

image-20210710221911745

image-20210710221918451

组相联映射

image-20210710222204893

image-20210710222220339

CPU访存:

image-20210710222248750

image-20210710222307630

总结

image-20210710222439230

Cache替换算法(解决Cache被装满的问题)

Cache完全装满了才需要替换,需要在全局选择替换哪一块

image-20210711160553389

如果对应位置非空,直接替换

image-20210711160615752

分组内满了才需要替换需要在分组内选择替换哪一块

image-20210711160634017

随机算法(RAND)

随机选择一块替换

算法性能:

实现简单,但完全没有考虑局部性原理,命中率低,实际效果很不稳定

image-20210711164435610

先进先出算法(FIFO)

替换最先调入Cache的块

实现简单,最开始#0#1#2#3放入Cache,之后轮流替换#0#1#2#3

算法性能:

没有考虑局部性原理,最先调入Cache的块也可能是被频繁访问的

image-20210711164119361

抖动现象:频繁的换入换出现象(刚被替换掉块很快又被调入)

近期最少使用算法(LRU)

为每一个Cache块设置一个计数器,用于记录每个Cache块已经有多久没有被访问了,当Cache满后替换计数器最大的

\[\begin{align} &Cache块的总数=2^n,则计数器只需要n位,且Cache装满后所有计数器的值一定不重复\\ \end{align} \]

(1)命中时,所命中的行的计数器清零,比其低的计数器加1,其余不变

(2)未命中且还有空闲行时,新装入的行的计数器置0,其余非空闲行全加1

(3)未命中且无空闲行时,计数值最大的行的信息块被淘汰,新装行的块的计数器置0,其余全加1

算法性能:

基于局部性原理,近期被访问过的主存块,在不久的将来也很可能再次被访问,因此淘汰最久没访问过的块是合理的,实际运行效果优秀,Cache命中率高

image-20210711165057274

最不经常使用算法(LFU)

为每一个Cache块设置一个计数器,用于记录每个Cache块被访问过几次,当Cache满后替换计数器最小的

算法性能:

曾经被经常访问的主存块在未来不一定会用到,算法实际运行效果不让LRU

image-20210711165307359

总结

image-20210711170550046

Cache的写策略(如何保持Cache里的数据和内存里的数据保持一致)

image-20210711170803320

写命中

写回法

image-20210711171649574

image-20210711171635987

全写法

image-20210711171740689

image-20210711171728702

写不命中

写分配法

image-20210711171818049

image-20210711171805412

非写分配法

image-20210711171901658

image-20210711171842837

多级Cache

image-20210711171945407

image-20210711171935529

总结

image-20210711172016851

虚拟存储器

页式虚拟存储器

原理

image-20210711174441630

image-20210711174351441

image-20210711174421728

虚地址与实地址

Cache-主存分块是���向物理地址

程序的分页是面向逻辑地址

image-20210711174630870

页表(记录逻辑页号与主存块号的关系)

image-20210711175036358

image-20210711175016518

查询过程:

image-20210711175220931

快表(TLB)

快表是一种相联存储器,可以按内容访存

将近期访问的页表项放入更高速的存储器中可加快地址转换的速度

image-20210711175747460

快表和Cache的区别

快表中储存的是页表项的副本

Cache中储存的是主存块的副本

访问策略

访问快表根据页号查找

命中根据快表页表项得到主存块号

去Cache中寻找相应主存的副本

命中访存

image-20210711181558957

posted on 2021-07-09 10:45  blueskylabor  阅读(674)  评论(0)    收藏  举报