1 存储器概述
主存储器其实就是内存!
1.1 存储器的层次结构
存储器的三大评判指标:速度、容量、价格
使用任意一种存储器,都无法满足用户对存储器 高速、大容量、低价格 的需求,所以采用 多级结构 形成对应的 “存储体系“。
存储体系:把两个或两个以上的存储介质,通过 软件、硬件 或 软硬件结合 的方式,把它们连成一个整体。使得这个存储体系具有高速、大容量、低价格的特点。
- 主存 - 辅存 结构解决 容量 问题;
- 缓存 - 主存 结构解决 速度 问题;
主存和CPU两者的速度存在不匹配问题,故使用 cache缓存 进行解决,这里面还涉及到 局部性原理(时间、空间)
主存的读写虽然已经够快了 但是还是跟不上CPU处理的速度!
因此计算机硬件 会把程序经常访问的从主存复制一份 放入到cache当中,这样cpu就可以直接复制cache中的副本数据
寄存器:进行加减乘除的时候把操作数放在寄存器里,数量很少!
缓存 - 主存 层次采用 硬件方式 连成一个整体(为了追求速度);
主存 - 辅存 层次采用 软、硬件结合方式 连成一个整体;【数据交换:是硬件+操作系统(也页面置换算法:决定把那些数据从主存换入到外存)实现的;因此主存和副存之间的数据交换需要系统程序员来关心!】
主存 - 辅存 构成 虚拟存储器 ,使用虚地址(逻辑地址);【通过数据交换完成的】
缓存 - 主存 使用主存储器地址,也就是实地址(物理地址);【数据交换:硬件自动完成,软件程序员不需要关系,但是硬件程序员要设计】
cpu可以直接访问的是:cache和主存
1.2 存储器的分类
① 按 层次结构 分类
副存要调入才可以访问
② 按 存储介质 分类
- 半导体存储器
- 磁表面存储器
- 光存储器
半导体 挺快的
③ 按 存取方式 分类
- 随机存储器:存储器的任何存储单元都能被 随机存取 ,且存取时间和存储单元的物理位置 无关;(半导体存储器是随机)
- 顺序存储器:存储器只能按照 某种顺序来存取 ,存取时间和存储单元的物理位置 有关;(磁带是顺序,磁盘是半顺序)
- 直接存储器
前三个都是给了地址去访问内容的
- 相联存储器 :按照内容检索到位置
④ 按 信息的可更改性 分类
- 只读存储器(ROM)
- 随机读写存储器(RAM)
⑤ 按 信息的可保持性 分类
- 易失性存储器
- 非易失性存储器
1.3 存储器的性能指标
一个存储周期可以读或者写一个存储字的信息!因此存取时间和存取周期是由区别的!!!
字存储单元 :存放一个机器字的存储单元,相应的单元地址叫做 字地址 ;
字节存储单元 :存放一个字节的存储单元,相应的单元地址叫做 字节地址 ;
按字寻址 :计算机可编址的最小单位是 字存储单元 ;
按字节寻址 :计算机可编址的最小单位是 字节存储单元 ;
再补充下 字的概念:
- 如果指单位 :一个字 = 2个字节 ;
- 如果指机器字 :就是计算机一次运算的数据位数(32位、64位);
- 如果指存储字 :每个存储单元的位数(一般是1B);
存储字长是指存放在一个存储单元中的二进制代码个数,内存中存储字的长度,存储字长可以是8位、16位、32位等;
不要把字节和字长混淆 。因为1字节 = 8位(一般情况下),所以存储字长都是8的倍数。(1字长 = n字节)
下图举例说明:
地址线24根,224 = 16MB, 此时 1字节就是1B,所以按字节寻址的范围就是16M;
按字寻址时,如果字长为16位,那么1字长(16)就是2字节(2 * 8),此时按字寻址的范围就是8M;
关键就是看 字长等于几字节
小结
cache和主存之间的数据交换 是由硬件实现的 对所有程序员都透明 解决速度不匹配的问题
2 主存储器
2.1 主存储器的基本构成
本来这个在王道书的3.3.3和3.3.1
CPU 要实现对存储单元的访问,首先要 选择存储芯片 ,即进行 片选;
然后为选中的芯片依地址码 选择相应的存储单元 ,以进行数据的存取,即进行 字选;
片内的字选通常是由CPU送出的N条低位地址线完成的,地址线直接接到所有存储芯片的地址输入端 (N 由片内存储容量决定);
片选信号的产生分为 线选法 和 译码片选法;
1. 半导体元件的原理
每个存储器由 存储体、MAR 和 MDR 构成,在 时序控制逻辑 的控制下有条不紊地运行;
存储体(存储矩阵)由多个 存储单元 构成,一个存储单元由多个 存储元 构成;一个存储元就可以存储一位二进制的1或者0;
存储字长是存储单元的长度; 一个存储单元就是一个存储字! 多个存储单元构成了存储字
MOS管是典型的半导体元器件:当电压到阈值之上时,由绝缘体变为导体
电容:是用来保存电荷的 等MOS管通的时候 电荷就可以过去
读:右端有输出电流的话就表示二进制的1;没有电荷流出就是0
写:MOS管用5V接通 从右传入电荷到电容器形成电压差后 断开MOS管--这样就存储了1
红色的那个1表示把所有的MOS管来联通 然后检测绿色的线是否有电流 有的话就是1没有就是0;这样就可以读出一整行存储元存储的二进制的信息
因此 存储器每一次读和写的单位都是存储单元【一个存储字】!!!因为存储与同一个存储器的存储字的MOS是链接在一起的。
注意字节和存储字的区别:1字节(Byte) = 8bit ;但是1个存储字的大小要具体看存储单元里有几个存储元!
上面的存储体包含了两个存储单元!
2. 存储芯片的基本原理
如何根据地址,去读/写某个存储字?这就涉及到译码器的使用
n位二进制地址 代表 2^n个存储单元,译码器 根据地址寄存器送来的地址,转为某一条 字选线 的高电平信号 也就是接通那一根 这样就可以得到这根MOS管输出的 二进制结果;
【2^n的解释:一共有n位 则一共有2^n中编码结果 唯一对应一个存储单元!所以n位二进制代表2^n个存储单元!!!】
过程:当字选择线被接通之后,就可以通过数据线[绿色]把每一位的二进制信息传送到MDR中,接下来CPU会通过数据总线从MDR中取走这一整个字的数据! 因此数据总线的宽度和存储字节应该是相同的!!!
加压之后,对应的MOS管连通,之后进行读、写操作;
总容量:存储单元*存储字节
控制电路:用于控制MDR/MAR/译码器,CPU通过地址总线把二进制数传送到MAR中,因为电信号难免不稳定,因此稳定之前不能送到地址信息不能送到译码器里;MAR 不稳定,只有当其电信号稳定之后,控制电路 才会打开 译码器 的开关,让其翻译地址;
当 MDR 的输出稳定之后,控制电路 才会认为此时的输出是正确的,才让其给 数据总线 传输数据;
片选线:
选择存储芯片是否有效【比如下面的内存条有8个存储芯片,你所需要的数据在摸哪一个就让哪一个的片选线有效,其他的无效】;CS上面加一杠的意思就是 低电平的时候是有效的
读写线:
当OE那根线是低电平的时候,说明是读数据;同理WE也是这样
也可以合二为一,编程WE
金属引脚:
考试还会让你根据地址线【看是几位地址就是几根】、数据线【是存储单元里有几个存储元】、片选线【1个】、读/写控制线【至少需要一个】等信息,确定金属引脚的数量;
eg:某个芯片的容量为1024 x 8位,其中1024是2^10,所以地址线有10根,数据线有8根。所以至少要20个金属引脚!
因此去驱动器其实就是一个把带点电信号放大的元件!
3. 如何实现不同的寻址方式
一个方块表示1个字节 也就是8bit的信息;注意字节和存储字的区别:1字节(Byte) = 8bit ;但是1个存储字的大小要具体看存储单元里有几个存储元!
一整行表示一个存储字;总容量是1KB ,说明一共有 2^10/4 = 256行!
现代的计算机时按照:
按字节寻址:【每一个字节对应一个地址】这个存储矩阵里有1K个字节 所以有1K个地址! 因此地址线有10根 数据线有8根
按字寻址:每一个字对应一个地址【一行一个地址】,字地址转换为字节地址就是左移两位!比如说1号字【就是第二行】 对应的字节地址 是100 换算成十进制就是4 和现实是一样的!!
小结
2.2 SRAM和DRAM
两个特定类型的存储芯片!
RAM:随机访问存储器,当我们指明存储单元的地址时,这个存储单元的读取速度并不会因为物理位置而改变!
1. DRAM和SRAM存储元件不同导致的特性差异
双稳态触发器:写1:左线高电压 右线低电压;读 根据那根线输出的是低电平来判断!
栅极电容是 ==破坏性读出,==读出就放电了,所以在读出之后还得 重写;
双稳态触发器是 ==非破坏读出,==所以速度更快;有两根数据线!
双稳态触发器 要6个MOS管 成本高,功耗高,更贵;
DRAM【电容】 v.s SRAM【双稳态触发器】
存储元件比较复杂 (所以用的少?) 的SRAM芯片 集成度会更低,而存储元件简单的DRAM的集成度会更高!
电容里面的电荷会逐渐消失,所以必须在消失前进行 刷新
SRAM存储原理
SRAM采用双稳态触发器来作存储元件,不存在电容的刷新问题,只要电源正常供电,触发器就能稳定地存储数据,因此称为静态随机存取储存器。其存储单元的每一位都是由双稳触发器和选通门电路组成的;而整个存储器由存储单元组成的阵列和控制电路组成。SRAM特点
连接使用方便(不需要刷新电路)、工作稳定、存取速度快(约为动态随机存取储存器DRAM的3~5倍)、使用简单;集成度低:
由于每一位的存储,都用好几个晶体管,因此单片的存储容量不易做得很高,集成度较低且价格较贵;由于价格相对较高,计算机主存用得很少,主要用作高速缓冲存储器(Cache)。、DRAM存储原理
DRAM的每一位存储单元采用一个晶体管和小电容来实现。若写入位为“1”,则电容被充电:若写入位为“0”,则电容不被充电。读出时用晶体管来读与之相连的电容的电荷状态。若电容被充电,则该位为“1”;若电容没有被充电,则该位为“O”。DRAM特点
由于每个存储位仅用一个晶体管和小电容,因此集成度比较高。就单个芯片的存储容量而言,DRAM可以远远超过SRAM;就相同容量的芯片而言,DRAM的价格也大大低于SRAM。这两个优点使DRAM成为计算机内存的主要角色。DRAM的行列地址分时复用控制和需要刷新控制,使得它比SRAM的接口要复杂一些。DRAM的存取速度一般比SRAM要慢。集成度高:
DRAM是一种半导体存储器,主要的作用原理是利用电容内存储电荷的多寡来代表一个二进制bit是1还是0。与SRAM相比的DRAM的优势在于结构简单,每一个bit的数据都只需一个电容跟一个晶体管来处理,相比之下在SRAM存储芯片上一个bit通常需要六个晶体管。因此DRAM拥有非常高的密度,单位体积的容量较高因此成本较低。
2. DRAM的刷新
存储单元是由存储原构成的 , 存储单元是以行为单位的!
比如当n=20 的时候i,左边需要2^20个字选线 但是右边只需要2^10 [20位的地址前10位送给行地址编码器 后10位送给列地址编码器 !一行一列!]这样只需要1024个字选线 是相对比较好实现的!
刷新其实就是一次读操作!
一次读/写要用0.5us,
思路1:刷新就是进行一次读写操作所以也是0.5us;这时的存取周期变成了1us,存取周期变长了,在2ms内读写的就少
思路2:一共2ms 一个周期需要0.5us 所以一共4000个周期 刷新时一行一行刷新 一共有128行【有几个地址就有几行】 所以刷新就需要128个周期 剩下的全给读写
思路3:把刷新分散到整个2ms里!在刷新的时候不能进行读或者写
3. DRAM的地址线复用技术
行地址,列地址一共n位,但可以用 n/2条地址线分别送到行地址缓冲器、列地址缓冲器里;
送到 行地址和列地址缓冲器之后 通过控制电路把地址送到 地址译码器里!
4、SRAM存储芯片的读写周期
一、
要保证正确地读/写,必须注意CPU时序与存储器读/写周期的配合。一般存储器芯片手册都会给出芯片读/写周期的时序图。
Intel 2114芯片的读、写周期时序如图所示。
二、 读周期
读操作时,必须保证 片选信号为低电平,读写信号为高电平。
tRC (读周期时间):指对芯片连续两次读操作之间的最小间隔时间。
tA (读出时间):从给出有效地址后,经过译码电路、驱动电路的延迟,到读出所选单元内容,并经I/O电路延迟,直到数据在外部数据总线上稳定出现所需的时间。显然,读出时间小于读周期时间。
tCO (片选到数据输出稳定的时间):数据能否送到外部数据总线上,不仅取决于地址,还取决于片选信号。因此,tCO是从有效到数据稳定出现在外部数据总线上的时间。
tCX(片选到数据输出有效时间):从片选有效到数据开始出现在数据总线上的间隔时间。
tOTD:片选无效后数据还需在数据总线上保持的时间。
tOHA:地址失效后,数据线上的有效数据维持时间,以保证所读数据可靠。
过程:
一行“地址有效”CPU 送出地址信息 ;
二行“地址有效”地址信号稳定才发出读/写请求 ,然后发出MREQ信号 这会导致译码器的输出端输出一个有效的片选信号 使得某一个片选信号被选通 ;
“数据稳定”是数据被传出 ;
当数据传出一段时间后撤销存储请求信号[MREQ];
再过一段时间 CPU接收到输出的数据信息 这时候撤销地址信号
图里线的含义:
地址上下交织都有 说明就是数据0101都有
CS在地址有效前是高电平1 有效后是低电平0
Dout数据输出:灰色没有数据输出 白色的上下说明数据有1有0
三、写周期
执行写操作时,为低电平,读写信号为低电平。
tW(写入时间):为保证数据可靠地写入,与同时有效的时间必须大于或等于tW。
tAW(滞后时间):地址有效后,必须经过tAW时间,WE/信号才能有效(低),否则可能产生写出错。
tWR(写恢复时间):WE/无效后,经tWR时间后地址才能改变,否则也可能错误地写入。
tDW:写入数据必须在写无效之前tDW时间就送到数据总线上。
tDH:WE/无效后,数据还要保持的时间。此刻地址线仍有效,tWR>tDH,以保证数据可靠写入。
tWC(写周期时间):表示连续两次写操作之间的最小时间间隔。tWC = tAW + tW + tWR。
小结
因此要注意在DSAM里 地址线是要减半的 对应的金属引脚也会发生变化!
现在更新了 主要用的时SDRAM!!!
2.3 只读存储器ROM
断电之后数据不会消失
1. 各种ROM的信息
MROM只能读
PROM可以写,写一次就不可以再更改
位密度高:相同的芯片 工艺水平相同的前提下 闪存芯片上存储元的数量比RAM上的数量要多!也急速是闪存芯片可以保存更多的比特位!
SSD的控制单元用来控制不同Flash芯片的读和写的操作!
在手机里:RAM是内存、ROM是副存!
2. 计算机内的重要ROM
所以开机的时候RAM芯片里完全没有数据,就需要从主板上面的ROM芯片上读取开机所需要的数据,这块芯片就是BIOS芯片;
自举装入程序:CPU在刚开始执行的那一段程序,根据这一段程序的指引,CPU可以指挥IO系统把副存中存储的操作系统给放到主存。所以这个程序就是用来引导开机的!!!!
RAM是易失的芯片;即便计算机没有电,BIOS里存入的指令数据也不会丢失
BIOS通常被集成在主板上,但逻辑上应该把BIOS看成是主存的一部分!
主存:内存条+BIOS芯片
RAM和ROM两者进行同一编址
小结
注意多种ROM芯片的名称和特性!
随机存取:存取速度不会因为地址而变化!【顺序表的给一个序号查找就是顺序存储!】
3 主存储器与CPU的连接
3.1 主存储器与CPU的连接
1. 单块存储芯片与CPU的链接
对外暴露的接口:绿色的新用来传输数据,通过数据总线和CPU进行链接;红色的线用来传送访问地址,通常通过地址总线和CPU连接;还有片选线、读写控制线,通常通过控制总线来发送这些控制信号;
现在只能存储8B,如果想要扩展主存的字数?--字扩展法
存储字的字长只有8位,也就是说一次只能同时存或取8bit的数据,但是现在的CPU大多数都能同时存/取64bit的数据 也就是说现在的计算机的数据总线的宽度都有64个;但是应该尽可能地保证数据线的宽度和主存的存储字长一样,只有这样才能尽可能的发挥数据总线的性能,每次多存或者多取一些数据可以让数据读写的速度更快。
问题是:如果现在数据总线的宽度>存储芯片字长 怎么办---位扩展
通过多块存储芯片的合理连接,可以让整个主存的存储字长拓展为和宽度一致
左边的有4个存储芯片,右边的有8个 所以说探究 多块存储芯片和CPU是怎么链接的是十分必要的!
2. 多块存储芯片与CPU的链接
补充一下:地址线和数据线的根数 取决于 存储器芯片 的容量,如何理解这句话?
分析:
① 先假设有一个存储芯片的容量为1GB
② 可能是下面几种情况:
1GB = 1G * 1B
= 512M * 2B
= 256M * 4B = 存储单位个数 * 存储单位位数
虽然这三种情况容量都是1GB,但代表了三个不一样的存储器。
③ 以 1G * 1B 举例:
1G = 230,也就是 30根地址线
1字节 = 8位,也就是 8根数据线
地址有A表示 A0是低位【address】D表示数据【data】 片选信号用CS 读写用WR
3、位扩展和字扩展
(1) 位扩展
存储字长看的是D
单块的存储芯片怎末和cpu连接呢?
8K = 2^13 说明需要13根地址线来表示8K的地址【A0~A12】CPU通过地址线传给芯片
WE读写控制线:上面没有杠说明 高电平的时候是CPU往里写数据;低电平是读。CPU会有一个金属引脚发送读写控制信号然后通过控制总线传给芯片
数据的传输:虽然CPU可以同时读写8bit的数据,然而由于存储芯片的限制,每次只能通过数据总线来传送一个bit,也就是说数据总线是利用的很不充分的
CS直接简单粗暴的上一个高电压
为了解决数据总线利用不充分的问题
给主存再加上一块相同型号的存储芯片
13位的地址信息同时传给两个芯片,这个地址信息可以选中这个地址信息相同位置的存储单元
读写控制线也是一样的,同时送给两个芯片
D1连上作为输出
存储字长拓展成2位,现在可以同时读/写 2bit
一直拓展就会得到下面的图:
(2) 字扩展
输出的数据就是8bit和地址总线已经完美匹配了 不需要进行位拓展了
但是还有3个地址位的信息没有被利用到!!
如果像之前一样:
地址会同时传给俩个芯片 两个的CS都是1 说明两个片选线都在工作 则0号的8bit信息在两个芯片里都会传给CPU 两个同时串就会造成冲突!!
解决:线选法;译码片选法
① 线选法【控制CS线】
这种情况下的00和11开头的地址都不能用 所以还要改进!
4、译码器
② 译码片选法
那个三角是 非门
A13发1 第一个芯片接收到的是1 第二个通过非门的处理接收到的是0
使用 1-2 译码器 进行字扩展,1-2 代表输入一位信号得到2种输出结果;
下图左边存储芯片,当地址为 1x xxxx xxxx xxxx 时,存储芯片工作;
下图右边存储芯片,当地址为 0x xxxx xxxx xxxx 时,存储芯片工作;
通过这样的方法 地址空间就变成连续的啦!从00..0-111...1
可以进行扩展:3-8译码器
==3-8 译码器,==输入 ==000,==对应的 第1条线高电平信号;
==3-8 译码器,==输入 ==001,==对应的 第2条线高电平信号;
==3-8 译码器,==输入 ==010,==对应的 第3条线高电平信号;
使用 2-4 译码器 进行字扩展
输入 00、01、10、11
当 2-4 译码器 的两条输入线接 A13、A15 时, A14 是什么都影响不到选片的操作;
5、74ls138译码器结构
A0~A2:地址输入端
(3) 字位扩展
位扩展,增加存储字长,提高数据总线传输能力;
字扩展,增加存储字数,提高CPU寻址能力;
一共8个芯片 每两个芯片为一组实现位扩展
2个空的地址实现字扩展 叠在一起的芯片就是要同时读出的!
小结
注意如果是低电平有效的话 需要在芯片的头上换一个小圆圈!
3-8译码器:
下图右边的译码器,有 EN 使能端 和 小圆圈(非门)
使能端,让译码器工作;
只有一个 使能端
注意下图多个 使能,只有输入 100 时,译码器才有效;
如果是其他的非法状态 右边的输出全是1
作用:CPU可使用译码器的 使能端 控制 片选信号 的生效时间;
过程:CPU先送出地址信号,说我要取数据了; 但是 MRER 会等到 地址信号稳定后再发出存储器请求信号
解释:
CPU里除了地址的输出 和数据的输入之外 还有一个很重要的输出信号 访存控制信号MREQ(Memory request) 当CPU想要访问主存是 就会发送这个信号 【上面有横杠 所以输出的是低电平信号0】 与其中一个使能端来连上 只有MERQ信号发出后 译码器才能工作【右边不全为1了】
3.2 双端口RAM和多模块存储器【提高内存速度】
1. 双端口RAM【408已删】
双端口RAM可以优化 多核CPU 访问一根内存的速度;
4、CPU2 本来想拿的是A 但是CPU1在写B 最后拿出的是B---这样就出现了读写错误!
解决方法:置0信号
2. 多模块存储器
即便是对于单核的CPU CPU的读写速度也比内存要快得多 而内存每次读写之后还要有一段的恢复时间 但CPU想要连续的读取数据的时候 必须要等待恢复时间 这个问题的解决可以用:多体并行存储器!
(1) 多体并行存储器
cpu对内存进行访问的时候 一定要有内存的地址--数据存储在哪?
高位交叉编制:有地址的高比特位 区分在那个存储体【比如:下边一共有4个存储体,就可以有高位的两个比特来确定在那个存储体里】
低位交叉编制:用地址的低比特位!
下面的总容量 = 4[个存储体] *8[一个存储体有8个存储单元] = 2^5 说明需要5个比特位表示地址信息
把高低位编址的地址分别转换成十进制:
高位是数着增加的 低位是横着增加的.这会带来什么区别呢?连续访问时的时间不同
高位交叉编制,访问 ==00 000 ~ 00 100,==读了5个存储字,耗时5T
对于低位交叉编制,耗时:T + (n-1) × r !!!
宏观上讲:读取一个字的时间接近于r
1、为什么低位交叉编制可以不用等待恢复时间呢 ?
因为低位交叉编制,是 一个个存储芯片交替使用,高位交叉是一直占用一个存储芯片,直到满了再去下一个存储芯片;
2、为什么要探讨 连续访问 的情况 ?
因为很多数据、数据结构在内存中就是被连续存储;
比如数组、程序代码都是来连续的存放在主存当中的!
既然低位存储可以让效率变高,那么我们应该取几个存储体呢?
m ≥ T / r
存取时间:指的是存储体性能的瓶颈,存取一次至少需要r的时间
总线传输周期:通过数据总线把数据传给CPU,至少需要r这么长的时间
这两种表示方式背后的含义是不一样的,但是都以为着CPU一次存取的时间不可能低于r
一般来说,存取时间 与 总线传输周期 是同一个概念
给定地址如何确定在那个存储体?1、根据末尾的体号来判断 2、十进制地址x对m取余
(2) 单体多字存储器
多体并行存储器:每一体每一个模块之间是相互独立的,每一个存储体独立的工作,cpu可以自由的选择每一次从那个存储体读出哪一个字;与这种方案对立的是单体多字存储器
单体多字存储器:相当于对上面的存储体进行合并,总共只有一套读写电路、地址寄存器、数据寄存器,类似于“位扩展”--本来每一次只能读取一个存储字 但是现在可以读取一整行【在这里是一整行是4个存储字】为了配合这个 数据总线也要扩展
因此灵活性会差【不能单独取某个字;如果程序指令不在一行 ,就会读到不同的数据。but多体就会精准的取到想要的】
当连续存取时:每一次读取平均下来 都是r;所以无论是那个方案都会提升主存的读取速度!
小结
双通道内存:低位交叉的二体存储器【相同容量、相同主频】
如果有两个内存条 就插到颜色相同的时低位交叉编址;插到颜色不同的是高位交叉编址【只是单纯的扩充了容量,并没有提升速度】
相同主频:3200MHZ是主频 主频反应读写周期有多快:主频越高 读写周期T越短 相应的r也会越短 如果两个内存条的主频不一样 搞的那个会有降频的操作 就不能发挥出完整的性能
相同容量:低地址是双通道 但是高地址还是是单通道
4 外部存储器(磁盘存储器)
特别是磁盘存储器!
注意和==《操作系统》第5章 输入输出管理 5.3 磁盘和固态硬盘== 联系起来学习;
计组主要考察硬件特性,但是操作系统主要是对磁盘的管理
4.1 磁盘原理
读写时,载体与磁层高速运动,磁头相对不动。磁表面存储器存储信息、写入和读出信息的过程如下:
存储信息:用磁层中一小块记录区域的两种不同剩磁状态分别表示"1"和"0"。大家知道,磁性材料有S极和N极,如果S极在前N在后表示一种状态,则N极在前S在后表示另一种状态。由于磁表面存储器的记录密度很高,每个记录区域的面积非常小,而且,在两个记录区域之间要保留有足够大的空隙。
写入过程:在读写线圈中加入脉冲电流,磁头的间隙附近就会产生变化的磁场,于是,处于磁头间隙附近的一小块磁层就被磁化。如果加入线圈中的电流方向不同,就能形成两种不同方向的剩磁状态。磁表面存储器的写入过程可以简单地表示如下:
数据->脉冲电流->变化的磁场->两种剩磁状态
读出过程:【切割磁感线】载体与磁层相对于磁头作高速运动,当记录在磁层中的两种剩磁状态运动到磁头间隙附近时,就会在读写线圈中感应出电流。剩磁状态不同,感应电流的方向也就不同。感应电流经过放大后,就得到读出数据。1、每次读/写 只能1bit
所以主机传来以个8bit的要存储 要有一个元件将并行数据转成串行 传给磁;同时输出的时候要把串性的弄成并行的
2、读/写不能同时进行
1.磁盘设备的组成
1、盘片就是记录面 2、盘面上涂磁性材料是一圈一圈的涂 不是一整块的涂 涂的这些形成了磁道 3、扇区是读/写的最小单位!
磁盘控制器:属于一种I/O接口,实现磁盘和主机之间数据的交互!
一个磁盘的正面和反面都可以涂上磁性材质
2.磁盘的性能指标
非格式化:存储的二进制比特位的上限!格式化:磁盘的某些扇区可能损坏 为了防止某些扇区的损坏导致整个磁盘无法工作 所以进行格式化 留下备用的扇区顶替以供使用 ;所以磁盘里的一些扇区会用于其他的地方 所以实际的容量会比非格式化的低!
道:从原点出发1cm 一共有60个磁道!位:圆上的1cm可以存600bit!
注意:!!!一个扇区里的所有道 存储的bit数是一样的,所以越靠近外侧密度越小
面:道*位
1.寻道时间,【移动到目标磁道】启动磁臂的时间s与磁头移动n条磁道所花费的时间之和
t=m*n+s(一般磁盘,m=0.2,高速磁盘,m<=0.1)
2.旋转延迟时间【旋转到目标扇区】,是指定扇区移动到磁头下面所经历的时间【可以取转半圈所需要的时间】
3.传输时间 ,指把数据从磁盘读出或向磁盘写入数据所经历的时间
若每次读/写的字节数为b,磁盘每秒钟的转速为r,
一条磁道上的字节数为N
t=b/(rN)
1/r -- 1圈需要多少秒 b/r -- 这个扇区占一圈的多少
例:一个7200(转 /每分钟)的硬盘,
每旋转一周所需时间为60×1000÷7200=8.33毫秒,
则平均旋转延迟时间为8.33÷2=4.17毫秒
(最多旋转1圈,最少不用旋转,平均情况下,需要旋转半圈)。
寻址+旋转延迟【半圈】+【访问一个扇区】
8+ 【60*1000/7200 *0.5】 + 【60*1000/7200 * (1/1000)】
3.磁盘地址
寻址也对应了控制字!
4.2 磁盘阵列
连续的存放在不同的盘上 磁盘的读写效率提高 参照低位交叉编制的多体存储器的连续存储
RAID0无校验:A1里的部分比特位收到干扰 而出错但是校验不出来
RAID1有冗余有校验
从上到下 越往下可靠性越高!
小结
4.3 固态硬盘SSD
机械硬盘vs固态硬盘
机械硬盘是通过磁性物质存储0、1 而固态硬盘是通过闪存技术,U盘也是采用了闪存技术;SSD图里黑色的就是闪存芯片
注意:读写性能特性、磨损均衡技术
系统对固态硬盘的读写是以页为单位的!
当一个固态硬盘的某一块一直被擦除 就有可能会坏掉! 所以采用磨损均衡技术:动态、静态
5 高速缓冲存储器 ⭐
5.1 Cache的基本概念和原理
1. Cache的工作原理
【问题】Cache的作用 ?
答:弥补CPU与内存之间的速度差异;
【问题】Cache的工作原理 ?
答:把内存里频繁访问的一段程序复制一份到 cache里;程序访问的局部性原理;
Cache由SRAM构成,SRAM比DSAM的速度更快、成本更高、集成度会更低
集成度低:cache高速缓冲器放入很小的手机里,由于集成度低,芯片的大小不能做的特别大的情况下,就注定了cache的存储容量不可能的特别大
具体特性可复习 2.2.2 SRAM和DRAM;
目前已经被集成到CPU内部,下图中Cache在CPU外部只是为了更好地展示效果;
2. 局部性原理
400直接变到404 why? 数是int类型 int类型占4B【4个字节】
把二维数组存储在内存里,是一行一行的存的
3. 性能分析
也可以同时找
4. 主存和缓存的编址【如何找到周围放入cache】
主存与Cache之间以 块 为单位进行数据交换;
块的大小是固定的
当cpu访问的主存的某个存储单元后,一定会把这个存储单元所从属的块立即调入到cache中【这个过程只是把数据复制一份,不会吧主存里的数据删除】
小结
5.2 Cache和主存的映射方式
【问题】什么是地址映射 ?
答:从主存调入指定块到Cache里,该放到Cache的哪一块里;
【问题】Cache如何标记已经存放的主存块 ?(cache里存的是主存的那个块)
答:使用 有效位 + 标记位,
==标记位记录存放的是哪一块主存块,【有了标记位,还存在的问题是 计算机的标记存储的是0101的二进制 是没有空的 当后面的cache没有放的时候 也会被标记为0 这是不对的 因为没有对应0号内存 所以添加有效位】
有效位记录标记位是否有效;
1. 全相联映射
全相联映射,任意找空闲块存放;
使用 全相联映射 的访存过程
标志位 :记录的只是块号!!!不包括块内地址!
2. 直接映射
直接映射,固定的映射关系;
缺点:空闲区不能用,必须一一对应;
对 标记 进行优化
末尾三位直接指明了 这个块应该放在cache的那个位置!所以标记位没有必要存储后三位的信息 【他的位置就放映了 后三位的信息 】所以只需要标志19位就可以!
使用 直接映射 的访存过程
3. 组相联映射
组相联映射:组间直接映射 + 组内全相联映射;
组相联映射 的地址结构
使用 组相联映射 的访存过程
小结
Cache 的总容量包括:存储容量、标记阵列容量(有效位、标记位)
(标记阵列中的一致性维护位 和 Cache 数据一致性维护方式相关,替换算法控制位和替换算法相关)
5.3 Cache替换算法
直接映射方式无需考虑替换算法 因为毫无选择
1. 随机算法 (RAND)
2. 先进先出算法 (FIFO)
FIFO没考虑 ==局部性原理,==可能会发生 抖动现象
刚被调入的块一会又被调入 -- 抖动现象
3. 近期最少使用 (LRU)
命中的时候 所命中的行的计数器清零
手算的话就是从要访问 的主存块 向前看 最先碰到的是 近期访问过的!
计数器比2打的就不用加了,4行计数器正好是0~3 就够用了,这样计数器只需要2bit的信息就足够了
LRU算法的Cache命中率高;但如果 ==频繁访问的主存块数量 > Cach行的数量,==则有可能发生 抖动;
4. 最近不经常使用 (LFU)
LRU的缺点:过去经常访问的主存块在未来不一定会用到;
小结
近期最少使用 与 最不经常使用 很容易混淆,区别小技巧:
LRU 淘汰一段时间内最久没有被访问的,可以理解为 淘汰老人(很久没被访问了) ;
LFU 淘汰访问次数最小的,可以理解为 淘汰废物(不怎么被访问)
但是如果微信聊天有一段时间频繁被访问 计数器一直加 等不用的时候 过了很久当别人超过她的时候才会调出
5.4 Cache写策略
因为读操作不会导致Cache与主存的数据不一致,所以只需考虑写操作;
当CPU对Cache写操作时,如果Cache里有目标块,就是 写命中 ,没有目标块就是 写不命中 ;
1. 写命中
① 写回法
写回法:Cache块换出时,对块的 修改位 (脏位) 进行判断,再决定时写回还是舍弃;当cache中的数据被修改时,脏位置为1
② 全写法
全写法(写直达):命中时,Cache与内存一块写;两个都写访存次数增加 写会比较慢 为了优化这个问题引入 写缓存
当CPU不对Cache写操作的时候,写缓冲 就可以在专门的控制电路下去写回主存,保持Cache与主存数据一致;
2. 写不命中
① 写分配法
② 非写分配法
直接对主存写数据,不会调入Cache
3. 多级Cache
L2保存的是主存的副本;L1保存的是L2的副本!因此各级cache之间也存在数据副本的问题
小结
多级cache:尽可能地较低成本的同时尽可能地提升cpu的速度
章节小结
Cache的总容量:用户Cache容量 + CAM+ 计数器 + 修改位
- 用户Cache容量:狭义上, 指 2c = C - 1 块Cache块;
- CAM (相联存储表) :Cache的一部分,完成由主存地址到Cache地址的转换;
- 计数器: 替换算法计数;
- 修改位:写策略标记;
6 虚拟存储器 ⭐
注意和==《操作系统》第3章 内存管理 3.2 虚拟内存管理== 联系起来学习;
6.1 页式存储器
1. 页式存储的思想
离散的放入就会让内存的空间利用率更高
把程序分成一个一个的页面 是逻辑层面的划分;主存和cache进行分块 更多是物理层面的划分
2、虚地址vs实地址
程序中:一页有1KB = 2^10B,一共有4KB = 2^12B 所以页内地址占10位 逻辑页号占2位【正好有4页】
主存:一页有4MB = 2^22B
逻辑地址转物理地址 只需要把前面的块号变了就可以--这时操作系统干的事!
页表记录了逻辑块放在了内存的那个块里!页表放在主存里,查询页表就意味着进行了一次访存操作
3、地址变换
页表基地址:当前运行的程序所对应的列表是从1058号主存单元开始存储的,每一个页表项的大小都是相同的,比如每一个占4B;也就是说从1058开始往后取4个字节就是第一个页表项:指明了0号逻辑页面存储在什么位置、再向后找四个字节就到了第二个页表项
程序运行是有局部性的:此时访问的x再0号,下一条指令要访问的很有可能还在0号!
页表项和块的区别:
页表项是比较小的,但是cache里存的主存副本还是比较大的;块表的作用是让地址变换快可以减少一次缓存】,cache的作用是让拿到物理地址之后,对这个物理地址的访问有可能更快
TLB为什么更快:
块表是SRAM、慢表是DRAM;
块表是相联存储器 是按照内容 找的不是地址按照地址找所以更快;
块表也很小 所以也要替换
小结
6.2 虚拟存储系统【操作系统实现的】
调入的时候也是基于“局部性原理”
1.页式虚拟存储器
有效位:是1表示已经调入内存;访问位:为了实现页面替换算法;脏位:是1表示数据被修改了,那么主存里的就要再写入辅存
操作系统实现页;硬件实现块
2.段式虚拟存储器
段长可能不一样
3.段页式虚拟存储器
7 常见问题和易混淆知识点
1. 存取时间 Ta 就是存储周期 Tm 吗 ?
不是;
存取时间 Ta 是执行一次读操作或写操作的时间,分为 读出时间 和 写入时间 ;
读出时间是从主存接收到有效地址开始到数据稳定为止的时间;
写入时间是从主存接收到有效地址开始到数据写入被写单元为止的时间;
存储周期 Tm 是指存储器进行连续两次独立地读或写操作所需的最小时间间隔;
所以存取时间 Ta 不等于 存储周期 Tm 。通常存储周期T大于存取时间T;
2. Cache行的大小和命中率之间有什么关系 ?
行的长度较大,可以充分利用程序访问的空间局部性,使一个较大的局部空间被一起调到Cache 中,因而可以增加命中机会;
但是,行长也不能太大,主要原因有两个:
- ① 行长大使失效损失变大。也就是说,若未命中,则需花更多时间从主存读块;
- ② 行长太大,Cache项数变少,因而命中的可能性变小;
3. 发生取指令Cache缺失的处理过程是什么 ?
- ① 程序计数器恢复当前指令的值;
- ② 对主存进行读的操作;
- ③ 将读入的指令写入Cache 中,更改有效位和标记位;
- ④ 重新执行当前指令;
1)存储器的 层次结构 主要体现在何处 ?为何要分这些层次 ?计算机如何管理这些层次 ?
存储器的层次结构主要体现在 Cache - 主存和 主存 - 辅存 这两个存储层次上;
Cache - 主存层次 在存储系统中主要对 CPU访存起加速作用 ;
即从整体运行的效果分析,CPU访存速度加快,接近于Cache的速度,而寻址空间和位价却接近于主存;
主存 - 辅存层次 在存储系统中主要起 扩容作用 ;
即从程序员的角度看,他所使用的存储器的容量和位价接近于辅存,而速度接近于主存;
综合上述两个存储层次的作用,从整个存储系统来看,就达到了 速度快、容量大、位价低 的优化效果;
主存与Cache 之间的信息调度功能全部由 硬件自动完成 ;
而主存与辅存层次的调度目前广泛采用 虚拟存储技术 实现,即将主存与辅存的一部分通过 软/硬结合 的技术组成虚拟存储器;
程序员可用这个比主存实际空间(物理地址空间)大得多的虚拟地址空间(逻辑地址空间)编程,当程序运行时,再由软/硬件自动配合完成虚拟地址空间与主存实际物理空间的转换;
因此,这两个层次上的调度或转换操作对于程序员来说都是 透明 的;
2)存储周期和存取时间 有何区别 ?
存取周期和存取时间的主要区别是:存取时间 仅为完成一次操作的时间 ;
而存取周期不仅包含操作时间,而且包含操作后线路的恢复时间,即 存取周期 = 存取时间+恢复时间
3)在虚拟存储器中,页面是设置得大一些好还是小一些好 ?
页面不能设置得过大,也不能设置得过小;
因为页面太小时,平均页内剩余空间较少,可节省存储空间,但会使得页表增大,而且页面太小时不能充分利用访存的空间局部性来提高命中率;
页面太大时,可减少页表空间,但平均页内剩余空间较大,会浪费较多存储空间,页面太大还会使页面调入/调出的时间较长;