计算机组成原理 知识点总结3——存储系统

3 存储系统
3.1 存储器概述
3.1.1 存储器的分类
按在计算机中的作用(层次)分类


1)主存储器。简称主存,又称内存储器(内存),用来存放计算机运行期间所需的程序和数据,CPU可以直接随机地对其进行访问,也可以和高速缓冲存储器(Cache)及辅助存储器交换数据。其特点是容量较小、存取速度较快、每位的价格较高。
2)辅助存储器。简称辅存,又称外存储器(外存),用来存放当前暂时不用的程序和数据,以及一些需要永久性保存的信息。辅存的内容需要调入主存后才能被CPU访问。其特点是容量大、存取速度较慢、单位成本低。
3)高速缓冲存储器。简称Cache,位于主存和CPU之间,用来存放当前CPU经常使用的指令和数据,以便CPU能高速地访问它们。Cache的存取速度可与CPLU的速度相匹配,但存储容量小、价格高。现代计算机通常将它们制作在CPU中。
存储系统层次结构主要体现在缓存一主存和主存一辅存这两个存储层次上

缓存-主存层次主要解决CPU和主存速度不匹配的问题。
主存-辅存层次主要解决存储系统的容量问题。
按存储介质分类

半导体存储器:以半导体器件存储信息;主存、Cache
磁表面存储器:以磁性材料存储信息;磁盘、磁带
光存储器:光盘
按存取方式分类

随机存储器(RAM)

存储器的任何一个存储单元都可以随机存取,而且存取时间与存储单元的物理位置无关。

静态RAM:触发器原理寄存信息
动态RAM:电容充电原理寄存信息
优点:读写方便,使用灵活,主要用于主存或高速缓重存储器

只读存储器(ROM)

存储器的内容只能随机读出而不能写入。ROM一旦有了信息则不能轻易改变,即使断电也不会丢失。

掩膜式只读存储器(MROM)
一次可编程只读存储器(PROM)
可擦除可编程只读存储器(EPROM):不能取代RAM,因为编程次数有限,且写入速度很慢
闪速存储器(Flash Memory):由E2ROM发展得到;应用U盘。
固态硬盘(SSD)
相联存储器(CAM)

不根据地址而是根据存储内容和指定地址方式来进行存取的存储器,可以实现快速地查找快表

串行访问存储器

对存储单元进行读/写操作时,需按其物理位置的先后顺序寻址。

顺序存取存储器(SAM):内容只能顺序读取,存取时间长短与信息在存储体上的物理位置有关;

如磁带。

优点是结构简单,成本低廉,容量大,适合于存放顺序访问的信息。
缺点是存取速度慢,不方便随机访问。
直接存取存储器(DAM):内容可以直接读取,存取时间与信息在存储体上的物理位置无关;

如磁盘、光盘;

优点是存取速度快,方便随机访问。
缺点是结构复杂,成本较高,容量有限,适合于存放长期随机访问的信息。
按信息的可保存性分类

易失性存储器:RAM、主存、Cache
非易失性存储器:ROM、磁表面存储器、光存储器
破坏性读出:信息读出后,原存储信息被破坏;如DRAM芯片,读出数据后要进行重写
非破坏性读出:信息读出后,原存储信息不被破坏;如SRAM芯片、磁盘、光盘
信息的可更改性

读写存储器(Read/Write Memory):即可读、也可写(如:磁盘、内存、Cache)
只读存储器(Read Only Memory):只能读,不能写(如:实体音乐专辑通常采用CD-RGM,实体电影采用蓝光光碟,BIOS通常写在ROM中。)
3.1.2 存储器性能指标
存储容量
存储容量 = 存储字数 × 字长 存储容量=存储字数×字长
存储容量=存储字数×字长

存储字数表示存储器的地址空间大小,字长表示一次存取操作的数据量。

单位成本
每位价格 = 总成本 / 总容量 每位价格=总成本/总容量
每位价格=总成本/总容量

存储速度
数据传输率 = 数据的宽度 / 存储周期 数据传输率=数据的宽度/存储周期
数据传输率=数据的宽度/存储周期

存取时间(Ta):从启动一次存储器操作到完成该操作经历的时间;从存储器读出或写入一次信息所需要的平均时间;分为读出时间和写入时间

存取时间不等于存储周期,通常存取周期大于存取时间


存取周期(Tm)/读写周期/访问周期:存储器进行一次完整的读写操作所需的全部时间;连续两次独立访问存储器操作(读或写操作)之间所需的最小时间间隔

主存带宽(Bm)/数据传输率:每秒从主存进入信息的最大数量;单位为字/秒、字节/秒(B/s)或位/秒(b/s)。

3.2 主存储器
​ 主存储器由DRAM实现,靠处理器的那一层(Cache)则由SRAM实现,它们都属于易失性存储器,只要电源被切断,原来保存的信息便会丢失。

​ DRAM的每位价格低于SRAM,速度也慢于SRAM,价格差异主要是因为制造SRAM需要更多的硅。

3.2.1 SRAM芯片和DRAM芯片
​ 通常把存放一个二进制位的物理器件称为存储元,它是存储器的最基本的构件。地址码相同的多个存储元构成一个存储单元。若干存储单元的集合构成存储体。

SRAM工作原理

​ 静态随机存储器(SRAM)的存储元是用双稳态触发器(六晶体管MOS)来记忆信息的,因此即使信息被读出后,它仍保持其原状态而不需要再生(非破坏性读出)。

​ 上图为双稳态触发器。若T2管导通,则T1管一定截止,此时A点为高电平,B电为低电平,假定此时为存1状态;反之(当T1管导通时)则为存0状态。

​ SRAM的存取速度快,但集成度低,功耗较大,价格昂贵,只要不断电,触发器的状态就不会改,一般用于高速缓冲存储器。

​ 应用Cache。

DRAM工作原理

​ 动态随机存储器(DRAM)是利用存储元电路中栅极电容上的电荷来存储信息的,DRAM的基本存储元通常只使用一个晶体管,所以它比SRAM的密度要高很多。

​ 读出1:MOS管接通,电容放电,数据线上产生电流;读出0:MOS管接通后,数据线上无电流

​ 电容放电信息被破环,是破坏性读出。读出后应有重写操也称“再生”;读写速度慢;每个存储元制造成本更低,集成度高,功耗低。

​ 电容内的电荷只能维持2ms。即便不断电,2ms后信息也会消失;2ms之内必须“刷新”一次(给电容充电);每次刷新一行存储单元。

集中刷新:指在一个刷新周期内,利用一段固定的时间,依次对存储器的所有行进行逐一再生,在此期间停止对存储器的读写操作,称为“死时间”,又称访存“死区”。

优点:读写操作时不受刷新工作的影响;
缺点:在集中刷新期间(死区)不能访问存储器。
分散刷新:把对每行的刷新分散到各个工作周期中。这样,一个存储器的系统工作周期分为两部分:前半部分用于正常读、写或保持;后半部分用于刷新。这种刷新方式增加了系统的存取周期,如存储芯片的存取周期为0.5μs,则系统的存取周期为1μs。

优点是没有死区;
缺点是加长了系统的存取周期,降低了整机的速度。
异步刷新:异步刷新是前两种方法的结合,它既可缩短“死时间”,又能充分利用最大刷新间隔为2ms的特点。具体做法是将刷新周期除以行数,得到两次刷新操作之间的时间间隔t,利用逻辑电路每隔时间t产生一次刷新请求。

这样可以避免使CPU连续等待过长的时间,而且减少了刷新次数,从根本上提高了整机的工作效率。

DRAM芯片的读写周期

SRAM和DRAM的比较

特点    SRAM    DRAM
存储信息    触发器    电容
破坏性读出    非    是
需要制新    不要    需要
送行列地址    同时送    分两次送
运行速度    快    慢
集成度    低    高
存储成本    高    低
主要用途    高速缓存    主机内存
存储器芯片的内部结构

存储器芯片由存储体、I/O读写电路、地址译码和控制电路等部分组成。下图为存储芯片结构图。

存储体(存储矩阵)。存储体是存储单元的集合,它由行选择线(X)和列选择线(Y)来选择所访问单元,存储体的相同行、列上的位同时被读出或写入。

地址译码器。用来将地址转换为译码输出线上的高电平,以便驱动相应的读写电路。

目前DRAM大多采用双译码结构,如下图所示。

采用地址线复用技术,使用行列地址双译码结构,行、列地址分两次送,是为了减少选通线数量。

若有28个芯片,单地址译码需要256条选通线,而双地址译码只需要24+24=32条选通线。

I/O控制电路。用以控制被选中的单元的读出或写入,具有放大信息的作用。

片选控制信号。单个芯片容量太小,往往满足不了计算机对存储器容量的要求,因此需用一定数量的芯片进行存储器的扩展。在访问某个字时,必须“选中”该存储字所在的芯片,而其他芯片不被“选中”,因此需要有片选控制信号。

读/写控制信号。根据CPU给出的读命令或写命令,控制被选中单元进行读或写。

3.2.2 只读存储器
只读存储器(ROM)的特点

ROM中一旦有了信息,就不能轻易改变,即使掉电也不会丢失。

1)结构简单,所以位密度比可读写存储器的高。
2)具有非易失性,所以可靠性高。
ROM的类型

掩膜式只读存储器(MROM)

厂家按照客户需求,在芯片生产过程中直接写入信息,之后任何人不可重写(只能读出)

可靠性高、灵活性差、生产周期长、只适合批量定制

一次可编程只读存储器(PROM)

用户可用专门的PROM写入器写入信息,写一次之后就不可更改

可擦除可编程只读存储器(EPROM)

EPROM不仅可以由用户利用编程器写入信息,而且可以对其内容进行多次改写。

不能取代RAM,因为编程次数有限,且写入速度很慢(写入前要先擦除)

UVEPROM(ultraviolet rays)–用紫外线照射8~20分钟,擦除所有信息
EEPROM(也常记为E2PROM,第一个E是Electrically)–可用“电擦除”的方式,擦除特定的字
闪速存储器(Flash Memory)

在EEPROM基础上发展而来,断电后也能保存信息,且可进行多次快速擦除重写

注意:由于闪存需要先擦除在写入,因此闪存的**“写”速度要比“读”速度更慢**。

每个存储元只需单个MOS管,位密度比RAM高。

应用:U盘、SD卡

固态硬盘(SSD)

由控制单元+存储单元(Flash芯片)构成,与闪速存储器的核心区别在于控制单元不一样,但存储介质都类似,可进行多次快速擦除重写。

SSD速度快、功耗低、价格高。目前个人电脑上常用SSD取代传统的机械硬盘。

3.2.3 主存储器的基本组成
​ 下图是主存储器的基本组成框图,其中由一个个存储0或1的记忆单元(也称存储元件)构成的存储矩阵(也称存储体)是存储器的核心部分。存储单元进行编号,现代计算机按字节编址。

CPU访问主存过程:

CPU首先把被访问单元的地址送到MAR中;通过地址线将主存地址送到主存中的地址寄存器,以便地址译码器进行译码选中相应单元
CPU将读写信号通过控制线送到主存的读写控制电路
写操作:CPU同时将要写的信息送到MDR中,在读写控制电路的控制下,经数据线将信号写入选中的单元
读操作:主存读出选中单元的内容送到数据线,然后送到MDR中
​ 数据线的宽度与MDR的宽度相同,地址线的宽度与MAR的宽度相同。地址线的位数决定了主存地址空间的最大可寻址范围。例如,36位地址的最大寻址范围为0~236-1,即地址从0开始编号。

例1:某一SRAM芯片,其容量为1024×8位,除电源和接地端外,该芯片的引脚的最小数目为()

按字节(8位)取地址,需要8位数据线;共有1024=210个存储单元,SRAM不复用地址线,需要10位地址线;还需要1片选线,2位读写控制线,共8+10+1+2=21位

例2:某一DRAM芯片,其容量为1024×8位,除电源和接地端外,该芯片的引脚的最小数目为()

DRAM复用地址线,分两次传递地址,地址线减半,需要5位地址线;片选线需要行选通线和列选通线,增加到2根,共8+5+2+2=17

注意SRAM和DRAM的区别,DRAM采用地址复用技术,而SRAM不采用。

3.2.4 双端口RAM和多模块存储器
双端口RAM

双端口顾名思义就是存储器芯片提供两个端口给两个CPU进行访问。

两个端口对同一主存操作有以下4种情况:

1.两个端口不同时对同一地址单元存取数据。成功。
2.两个端口同时对同一地址单元读出数据。成功。
3.两个端口同时对同一地址单元写入数据。写入错误。
4.两个端口同时对局一地址单完,二个写入数据,另一不读出数据。读出错误。
解决办法:

​ 置“忙”信号为0,由判断逻辑决定暂时关闭一个端口(即被延时),未被关闭的端口正常访问,被关闭的端口延长一个很短的时间段后再访问。

单体多字存储器

​ 单体多字系统的特点是存储器中只有一个存储体,每个存储单元存储m个字,总线宽度也为m个字。一次并行读出m个字,地址必须顺序排列并处于同一存储单元。

​ 单体多字系统在一个存取周期内,从同一地址取出m条指令,然后将指令逐条送至CPU执行,即每隔1/m存取周期,CPU向主存取一条指令。这显然提高了单体存储器的工作速度。

​ 缺点:指令和数据在主存内必须是连续存放的,一旦遇到转移指令,或操作数不能连续存放,这种方法的效果就不明显。

多体并行存储器

​ 多体并行存储器由多体模块组成。每个模块都有相同的容量和存取速度,各模块都有独立的读写控制电路、地址寄存器和数据寄存器。它们既能并行工作,又能交叉工作。

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

高位交叉编址(顺序方式)

​ 高位地址表示体号,低位地址为体内地址。如图所示,存储器共有4个模块M0~M3,每个模块有n个单元,各模块的地址范围如图中所示。

特点:

高位交叉方式下,总是把低位的体内地址送到由高位体号确定的模块内进行译码。
顺序串行存取。访问一个连续主存块时,总是先在一个模块内访问,等到该模块访问完才转到下一个模块访问,CPU总是按顺序访问存储模块,各模块不能被并行访问,因而不能提高存储器的吞吐率。
低位交叉编址(交叉方式)

​ 低位地址为体号,高位地址为体内地址。

​ 每个模块按“模m”交叉编址,模块号=单元地址%m,假定有m个模块,每个模块有k个单元,则0,m,…,(k-1)m单元位于M0;第1,m+1,…,(k-1)m+1单元位于M1;以此类推。

特点:

低位交叉方式下,总是把高位的体内地址送到由低位体号确定的模块内进行译码。
程序连续存放在相邻模块中,因此称采用此编址方式的存储器为交叉存储器。
采用低位交叉编址后,可在不改变每个模块存取周期的前提下,采用流水线的方式并行存取,提高存储器的带宽。
​ 设模块字长等于数据总线宽度,模块存取一个字的存取周期为T,总线传送周期为r,为实现流水线方式存取,存储器交叉模块数应大于等于
m = T / r m=T/r
m=T/r

​ 式中,m称为交叉存取度。每经过时间延迟后启动下一个模块,交叉存储器要求其模块数必须大于等于m,以保证启动某模块后经过m×r的时间后再次启动该模块时,其上次的存取操作已经完成(即流水线不间断)。这样,连续存取m个字所需的时间为
t 1 = T + ( m − 1 ) r t_1=T+(m-1)r

1

 =T+(m−1)r

而顺序方式连续读取m个字所需的时间为t 2 = m T t_2=mTt 
2

 =mT。可见低位交叉存储器的带宽大大提高。

【例】设存储器容量为32个字,字长为64位,模块数m=4,分别采用顺序方式和交叉方式进行组织。存储周期T=200ns,数据总线宽度为64位,总线传输周期r=50ns。在连续读出4个字的情况下,求顺序存储器和交叉存储器各自的带宽。

解:顺序存储和交叉存储器连续读出m=4个字的的信息总量为
q = 64 位 × 4 = 256 位 q=64位×4=256位
q=64位×4=256位

顺序存储器和交叉存储器连续读出4个字所需时间为
t 1 = m T = 4 × 200 n s = 800 n s = 8 × 1 0 − 7 s t 2 = T + ( m − 1 ) r = 200 n s + 3 × 50 n s = 350 n s = 3.5 × 1 0 − 7 s t_1=mT=4×200ns=800ns=8×10^{-7}s\\ t_2=T+(m-1)r=200ns+3×50ns=350ns=3.5×10^{-7}s

1

 =mT=4×200ns=800ns=8×10 
−7
 s

2

 =T+(m−1)r=200ns+3×50ns=350ns=3.5×10 
−7
 s

顺序存储器和交叉存储器的带宽分别是
W 1 = q / t 1 = 256 / ( 8 × 1 0 − 7 ) = 3.2 × 1 0 8 b / s W 2 = q / t 2 = 256 / ( 3.5 × 1 0 − 7 ) = 7.3 × 1 0 8 b / s W_1=q/t_1=256/(8×10^{-7})=3.2×10^8b/s\\ W_2=q/t_2=256/(3.5×10^{-7})=7.3×10^8b/s

1

 =q/t 
1

 =256/(8×10 
−7
 )=3.2×10 
8
 b/s

2

 =q/t 
2

 =256/(3.5×10 
−7
 )=7.3×10 
8
 b/s

3.3 主存储器与CPU的连接
3.3.1 连接原理
​ 单个芯片的容量不可能很大,往往通过存储器芯片扩展技术,将多个芯片集成在一个内存条上,然后由多个内存条及主板上的ROM芯片组成计算机所需的主存空间,再通过总线与CPU相连。下图是存储控制器、存储器总线和内存条的连接关系示意图。

​ 内存条插槽就是存储器总线,内存条中的信息通过内存条的引脚,再通过插槽内的引线连接到主板上,通过主板上的导线连接到CPU芯片。

​ 主存与CPU连接原理:

1)主存储器通过数据总线、地址总线和控制总线与CPU连接。
2)数据总线的位数与工作频率的乘积正比于数据传输率。
3)地址总线的位数决定了可寻址的最大内存空间。
4)控制总线(读/写)指出总线周期的类型和本次输入/输出操作完成的时刻。


3.3.2 主存容量的扩展
位扩展法

用多个存储器件对字长进行扩充,增加存储字长使其数据位数与CPU的数据线数相等。

连接方式:将多个存储芯片的地址端、片选端和读写控制端相应并联,数据端分别引出。

注意:仅采用位扩展时,各芯片连接地址线的方式相同,但连接数据线的方式不同,在某一时刻选中所有的芯片,所以片选信号CS要连接到所有芯片。

字扩展法

增加存储器中字的数量,而位数不变。

连接方式:将芯片的地址线、数据线、读写控制线相应并联,而由片选信号来区分各芯片的地址范围。

如上图所示,用4片16K×8位的RAM芯片组成64K×8位的存储器。将A 15 A 14 A_{15}A_{14}A 
15

 A 
14

 作为片选信号,连接2/4译码器,完成对4片RAM芯片的选择。各芯片的地址分配如下:

第1片,最低地址:0000000000000000;最高地址:0011111111111111(16位)
第2片,最低地址:0100000000000000;最高地址:0111111111111111
第3片,最低地址:1000000000000000;最高地址:1011111111111111
第4片,最低地址:1100000000000000;最高地址:1111111111111111
注意:仅采用字扩展时,各芯片连接地址线的方式相同,连接数据线的方式也相同,但在某一时刻只需选中部分芯片,所以通过片选信号CS或采用译码器设计连接到相应的芯片。

字位同时扩展法

字位同时扩展是指既增加存储字的数量,又增加存储字长。

如上图所示,用8片16K×4位的RAM芯片组成64K×8位的存储器。每两片构成一组16K×8位的存储器(位扩展),4组便构成64K×8位的存储器(字扩展)。

注意:采用字位同时扩展时,各芯片连接地址线的方式相同,但连接数据线的方式不同,而且需要通过片选信号CS或采用译码器设计连接到相应的芯片。

3.3.3 存储芯片的地址分配和片选
​ CPU要实现对存储单元的访问,首先要选择存储芯片,即进行片选;然后为选中的芯片依地址码选择相应的存储单元,以进行数据的存取,即进行字选。

​ 片内的字选通常是由CPU送出的N条低位地址线完成的,地址线直接接到所有存储芯片的地址输入端(N由片内存储容量2n决定)。片选信号的产生分为线选法和译码片选法。

线选法

​ 线选法用除片内寻址外的高位地址线直接(或经反相器)分别接至各个存储芯片的片选端,当某地址线信息为“0”时,就选中与之对应的存储芯片。这些片选地址线每次寻址时只能有一位有效,不允许同时有多位有效,这样才能保证每次只选中一个芯片。

​ 假设4片2K×8位存储芯片用线选法构成8K×8位存储器,各芯片的片选信号见表,其中低位地址线A10~A0作为字选线,用于片内寻址。

优点:不需要地址译码器,线路简单。
缺点:地址空间不连续,选片的地址线必须分时为低电平(否则不能工作),不能充分利用系统的存储器空间,造成地址资源的浪费。
译码片选法

​ 译码片选法用除片内寻址外的高位地址线通过地址译码器芯片产生片选信号。如上一节采用2/4译码器来实现字扩展。仅用2位便可以产生4位片选信号。

3.4 外部存储器
3.4.1 磁盘存储器
​ 优点:①存储容量大,位价格低;②记录介质可重复使用:③记录信息可长期保存而不丢失,甚至可脱机存档④非破坏性读出,读出时不需要再生。

​ 缺点:存取速度慢,机械结构复杂,对工作环境要求较高。

磁盘设备的组成

硬盘存储器的组成:硬盘存储器由磁盘驱动器、磁盘控制器和盘片组成。
磁盘驱动器。核心部件是磁头组件和盘片组件,温彻斯特盘是一种可移动磁头固定盘片的硬盘存储器。
磁盘控制器。硬盘存储器和主机的接口,主流的标准有 IDE、SCSI、SATA等。


存储区域:一块硬盘含有若干记录面,每个记录面划分为若干磁道,而每条磁道又划分为若干扇区,扇区(也称块)是磁盘读写的最小单位,即磁盘按块存取。

磁头数(Heads):即记录面数,表示硬盘共有多少个磁头,磁头用于读取/写入盘片上记录面的信息,一个记录面对应一个磁头。
柱面数(Cylinders):表示硬盘每面盘片上有多少条磁道。在一个盘组中,不同记录面的相同编号(位置)的诸磁道构成一个圆柱面。
扇区数(Sectors):表示每条磁道上有多少个扇区。


磁记录原理

原理:磁头和磁性记录介质相对运动时,通过电磁转换完成读/写操作。

编码方法:按某种方案(规律),把一连串的二进制信息变换成存储介质磁层中一个磁化翻转状态的序列,并使读/写控制电路容易、可靠地实现转换。

磁记录方式:通常采用调频制(FM)和改进型调频制(MFM)的记录方式。

磁盘的性能指标

记录密度。记录密度是指盘片单位面积上记录的二进制信息量,通常以道密度、位密度和面密度表示。

道密度是沿磁盘半径方向单位长度上的磁道数,
位密度是磁道单位长度上能记录的二进制代码位数,
面密度是位密度和道密度的乘积。


注意:磁盘所有磁道记录的信息量一定是相等的,并不是圆越大信息越多,故每个磁道的位密度都不同。

磁盘的容量。磁盘容量有非格式化容量和格式化容量之分。

非格式化容量是指磁记录表面可利用的磁化单元总数,它由道密度和位密度计算而来;
格式化容量是指按照某种特定的记录格式所能存储信息的总量。格式化后的容量比非格式化容量要小。
平均存取时间
平均存取时间 = 寻道时间(磁头移动到目的磁道) + 旋转延迟时间(磁头定位到所在扇区) + 传输时间(传输数据所花费的时间) + 平均存取时间=寻道时间(磁头移动到目的磁道)+\\旋转延迟时间(磁头定位到所在扇区)+\\传输时间(传输数据所花费的时间)+
平均存取时间=寻道时间(磁头移动到目的磁道)+
旋转延迟时间(磁头定位到所在扇区)+
传输时间(传输数据所花费的时间)+

由于寻道和找扇区的距离远近不一,故寻道时间和旋转延退时间通常取平均值。

数据传输率。磁盘存储器在单位时间内向主机传送数据的字节数,称为数据传输率。假设磁盘转数为r转/秒,每条磁道容量为N字节,则数据传输率为
D r = r N D_r=rN

r

 =rN

磁盘地址

主机向磁盘控制器发送寻址信息,磁盘的地址一般如图所示。

驱动器号:电脑可能有多个硬盘
柱面(磁道)号:移动磁头臂(寻道)
盘面号:激活某个磁头
扇区号:通过旋转将特定扇区划过磁头下方


若系统中有4=22个驱动器,每个驱动器带一个磁盘,每个磁盘256=28个磁道、16=24个盘面,每个盘面划分为16=24个扇区,则每个扇区地址要18位二进制代码,其格式如上图所示。

硬盘的工作过程

​ 硬盘的主要操作是寻址、读盘、写盘。每个操作都对应一个控制字,硬盘工作时,第一步是取控制字,第二步是执行控制字。
​ 硬盘属于机械式部件,其读写操作是串行的,不可能在同一时刻既读又写,也不可能在同一时刻读两组数据或写两组数据。

3.4.2 磁盘阵列
​ **RAID(独立余磁盘阵列)**是指将多个独立的物理磁盘组成一个独立的逻辑盘,数据在多个物理盘上分割交叉存储、并行访问,具有更好的存储性能、可靠性和安全性。

​ RAID的分级如下所示。在RAID1~RAID5几种方案中,无论何时有磁盘损坏,都可随时拔出受损的磁盘再插入好的磁盘,而数据不会损坏,提升了系统的可靠性。

RAID0:无冗余和无校验的磁盘阵列。


逻辑上相邻的两个扇区在物理上存到两个磁盘,类比“低位交叉编址的多体存储器”

RAID0把连续多个数据块交替地存放在不同物理磁盘的扇区中,几个磁盘交叉并行读写,不仅扩大了存储容量,而且提高了磁盘数据存取速度,但RAID0没有容错能力

RAID1:镜像磁盘阵列。


很粗暴,存两份数据。

RAID1是为了提高可靠性,使两个磁盘同时进行读写,互为备份,如果一个磁盘出现故障,可从另一磁盘中读出数据。两个磁盘当一个磁盘使用,意味着容量减少一半。

RAID2:采用纠错的海明码的磁盘阵列。


逻辑上连续的几个bit物理上分散存储在各个盘中;4bit信息位+3bit海明校验位——可纠正一位错

RAID3:位交叉奇偶校验的磁盘阵列。

RAID4:块交叉奇偶校验的磁盘阵列。

RAID5:无独立校验的奇偶校验磁盘阵列。

​ RAID通过同时使用多个磁盘,提高了传输率;通过在多个磁盘上并行存取来大幅提高存储系统的数据吞吐量;通过镜像功能,提高安全可靠性;通过数据校验,提供容错能力。

3.4.2 固态硬盘
原理

固态硬盘(SSD)是一种基于闪存技术的存储器,属于电可擦除ROM,即EEPROM。

组成

一个SSD由一个或多个闪存芯片和闪存翻译层组成。

闪存芯片:替代传统旋转磁盘中的机械驱动器,每个芯片包含多个块(block),每个块包含多个页(page)
闪存翻译层:将来自CPU的逻辑块读写请求翻译成对底层物理设备的读写控制信号,负责翻译逻辑块号,找到对应页(Page)
读写性能特性

以页(page)为单位读/写——相当于磁盘的“扇区"
以块(block)为单位"擦除",擦干净的块,其中的每页都可以写一次,读无限次
支持随机访问,系统给定一个逻辑地址,闪存翻译层可通过电路迅速定位到对应的物理地址
读快、写慢。要写的页如果有数据,则不能写入,需要将块内其他页全部复制到一个新的(擦除过的)块中,再写入新的页。
与机械硬盘相比的特点

SSD读写速度快,随机访问性能高,用电路控制访问位置;机械硬盘通过移动磁臂旋转磁盘控制访问位置,有寻道时间和旋转延迟
SSD安静无噪音、耐摔抗震、能耗低、造价更贵
SSD的一个“块"被擦除次数过多(重复写同一个块)可能会坏掉,而机械硬盘的扇区不会因为写的次数太多而坏掉
磨损均衡技术

思想:将“擦除"平均分布在各个块上,以提升使用寿命

动态磨损均衡:写入数据时,优先选择累计擦除次数少的新闪存块、
静态磨损均衡:SSD监测并自动进行数据分配、迁移,让老旧的闪存块承担以读为主的储存任务,让较新的闪存块承担更多的写任务
3.5 高速缓冲存储器
​ 由于程序的转移概率不会很低,数据分布的离散性较大,所以单纯依靠并行主存系统提高主存系统的频宽是有限的。这就必须从系统结构上进行改进,即采用存储体系。

​ 通常将存储系统分为“Cache-主存”层次和“主存-辅存”层次。

3.5.1 程序访问的局部性原理
空间局部性

在最近的未来要用到的信息(指令和数据),很可能与现在正在使用的信息在存储空间上是邻近的。因为指令通常是顺序存放、 顺序执行的,数据一般也是以向量、数组等形式簇聚地存储在一起的。

时间局部性

在最近的未来要用到的信息,很可能是现在正在使用的信息;因为程序中存在循环。

​ 高速缓冲技术就是利用局部性原理,把程序中正在使用的部分数据存放在一个高速的、容量较小的Cache 中,使CPU的访存操作大多数针对Cache进行,从而提高程序的执行速度。

例:假定数组元素按行优先方式存储,对于下面的两个函数:

1)对于数组a的访问,哪个空间局部性更好?哪个时间局部性更好?

​ A程序的访问数组a的顺序为a[0][0], a[0][1]…, a[0][N-1];a[1][0], a[1][1]…;访问顺序与存放顺序一致,空间局部性好。

​ B程序的访问数组a的顺序为a[0][0], a[1][0]…, a[M-1][0];a[0][1], a[1][1]…;访问顺序与存放顺序不一致,每次访问都要跳过N个数组元素,即4N个字节,若主存与Cache的交换单位小于4N,则每次访问都要重装Cache,因而没有空间局部性。

​ 两个程序时间局部性都差,因为每个数组元素都只被访问1次。

2)对于指令访问来说,for循环体的空间局部性和时间局部性如何?

​ 对于for循环体,程序A和B中访问局部性相同。因为循环体内指令按序连续存放,所以空间局部性好;内部循环体指令被重复执行,因此时间局部性好。

3.5.2 Cache 的基本工作原理
​ Cache位于存储器层次结构的顶层,通常由SRAM构成,其基本结构如图所示。

Cache特点

Cache块:Cache和主存都被划分为相等的块,Cache块又称Cache行,每块由若干字节组成,块的长度称为块长(Cache行长)。

由于Cache的容量远小于主存的容量,所以Cache中的块数要远少于主存中的块数,它仅保存主存中最活跃的若干块的副本。

Cache按照某种策略,预测CPU在未来一段时间内欲访存的数据,将其装入Cache。

Cache工作流程

当CPU发出读请求时,若访存地址在Cache中命中,就将此地址转换成Cache地址,直接对Cache进行读操作,与主存无关;
若Cache不命中,则仍需访问主存,并把此字所在的块一次性地从主存调入Cache。(地址映射)
若此时Cache已满,则需根据某种替换算法,用这个块替换Cache中原来的某块信息。(替换算法)
注意:某些计算机中也采用同时访问Cache和主存的方式,若Cache命中,则主存访问终止;否则访问主存并替换Cache

​ 整个过程全部由硬件实现。值得注意的是,CPU与Cache之间的数据交换以字为单位,而Cache与主存之间的数据交换则以Cache块为单位。

Cache性能分析

命中率:CPU欲访问的信息已在Cache中的比率称为Cache的命中率。

设一个程序执行期间,Cache的总命中次数为N c N_cN 
c

 ,访问主存的总次数为N m N_mN 
m

 ,则命中率H HH为
H = N c / ( N c + N m ) H=N_c/(N_c+N_m)
H=N 
c

 /(N 
c

 +N 
m

 )

可见为提高访问效率,命中率H越接近1越好。

平均访问时间:设t c t_ct 
c

 为命中时的Cache访问时间,t m t_mt 
m

 为未命中时的访问时间,1 − H 1-H1−H表示未命中率,则Cache-主存系统的平均访问时间T a T_aT 
a

 为
T a = H t c + ( 1 − H ) t m T_a=Ht_c+(1-H)t_m

a

 =Ht 
c

 +(1−H)t 
m

 

根据Cache的读、写流程,实现Cache时需解决以下关键问题:

1)数据查找。如何快速判断数据是否在 Cache 中。
2)地址映射。主存块如何存放在 Cache 中,如何将主存地址转换为Cache 地址。
3)替换策略。Cache满后,使用何种策略对Cache块进行替换或淘汰。
4)写入策略。如何既保证主存块和Cache 块的数据一致性,又尽量提升效率。
例:假设Cache的速度是主存的5倍,且Cache的命中率为95%,则采用Cache后,存储器性能提高多少(设Cache和主存同时被访问,若Cache命中则中断访问主存)?

解:设Cache存取周期为t,主存存取周期为5t,使用Cache的平均访问时间为:
T a = 95 % × t + ( 1 − 95 % ) × 5 t = 1.2 t T_a=95\%×t+(1-95\%)×5t=1.2t

a

 =95%×t+(1−95%)×5t=1.2t

因此,采用Cache后,性能提升至5t/1.2t≈4.17倍

3.5.3 Cache和主存的映射方式
​ Cache 行中的信息是主存中某个块的副本,地址映射是指把主存地址空间映射到Cache地址空间,即把存放在主存中的信息按照某种规则装入Cache。

​ 由于Cache行数比主存块数少得多,因此主存中只有一部分块的信息可放在Cache中,因此在Cache中要为每块加一个标记,指明它是主存中哪一块的副本。该标记的内容相当于主存中块的编号。为了说明Cache行中的信息是否有效,每个Cache行需要一个有效位。

全相联映射

​ 主存中的每一块可以装入Cache中的任何位置,每行的标记用于指出该行取自主存的哪一块,所以CPU访存时需要与所有Cache行的标记进行比较。

优点:比较灵活,Cache块的冲突概率低,空间利用率高,命中率也高

缺点:标记的比较速度较慢,实现成本较高,通常需采用昂贵的按内容寻址的相联存储器进行地址映射。

全相联映射的地址结构为

直接映射

主存块只能放到特定的某个Cache行,若这个位置已有内容,则产生冲突,原来的块被替换(无需替换算法)

​ 直接映射的关系可定义为:
C a c h e 行号 = 主存块号 % C a c h e 总行数 Cache行号=主存块号\%Cache总行数
Cache行号=主存块号%Cache总行数

​ 假设Cache有2c行,主存有2m块,在直接映射方式,主存的第0块、第2c块、第2c+1块…只能映射到第0行

​ 由此看出,主存块号低c位正好是要装入Cache的行号。给每个Cache设置长为t=m-c的标记(tag),当主存某块调入Cache后,就将其块号的高t位设置在对应Cache行的标记中,如图(a)所示。

直接映射的地址结构为:

​ CPU访存过程如图(b)所示,

首先根据访存地址中间的c位,找到对应的Cache行,将对应Cache行中的标记和主存地址的高t位标记进行比较,若相等且有效位为1,则访问Cache“命中”,此时根据主存地址中低位的块内地址,在对应的Cache行中存取信息;

若不相等或有效位为0,则“不命中”,此时CPU从主存中读出该地址所在的一块信息送到对应的Cache行中,将有效位置1,并将标记设置为地址中的高t位,同时将该地址中的内容送CPU。

组相联映射

主存块可以放到特定分组中的任意位置。常用的有2路组相联映射,如下图所示。

组相联映射的关系可以定义为
C a c h e 组号 = 主存块号 % C a c h e 组数( Q ) Cache组号=主存块号\%Cache组数(Q)
Cache组号=主存块号%Cache组数(Q)

​ 路数越大,即每组Cache行的数量越大,发生块冲突的概率越低,但相联比较电路也越复杂。选定适当的数量,可使组相联映射的成本接近直接映射,而性能上仍接近全相联映射。

组相联映射的地址结构为:

CPU访存过程如下:

首先根据访存地址中间的组号找到对应的Cache组;
将对应Cache组中每个行的标记与主存地址的高位标记进行比较;
若有一个相等且有效位为1,则访问Cache命中,此时根据主存地址中的块内地址,在对应Cache行中存取信息;
若都不相等或虽相等但有效位为0,则不命中,此时CPU从主存中读出该地址所在的一块信息送到对应Cache组的任意一个空闲行中,将有效位置1,并设置标记,同时将该地址中的内容送CPU。
3.5.4 Cache中主存块的替换算法
​ 全相联映射和组相联映射需要,直接相连映射不需要。从主存向Cache传送一个新块,当Cache或Cache组中的空间已被占满时,就需要使用替换算法置换Cache行。而

随机算法(RAND)

算法:若Cache已满,则随机选择一块替换。

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

先进先出算法(FIFO)

算法:若Cache已满,则替换最先被调入Cache的块

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

近期最少使用(LRU)

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

①命中时,所命中的行的计数器清零,比其低的计数器加1,其余不变;
②未命中且还有空闲行时,新装入的行的计数器置0,其余非空闲行全加1;
③未命中且无空闲行时,计数值最大的行的信息块被淘汰,新装行的块的计数器置0,其余全加1。
Cache块的总数=2n,则计数器只需n位。且Cache装满后所有计数器的值定不重复

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

若被频繁访问的主存块数量>Cache行的数量,则有可能发生“抖动”,如:[1,2,3,4,5,1,2,3,4,5,1,2…)

​ 假定采用四路组相联映射,有5个主存块{1,2,3,4,5}映射到Cache的同一组,对于主存访问{1,2,3,4,1,2,5,1,2,3,4,5},采用LRU算法的替换过程如图。

最近不经常使用(LFU)

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

新调入的块计数器=0,之后每被访问一次计数器+1。需要替换时,选择计数器最小的一行

若有多个计数器最小的行,可按行号递增或FIFO策略进行选择

特点:曾经被经常访问的主存块在未来不一定会用到(如:微信视频聊天相关的块),并没有很好地遵循局部性原理,因此实际运行效果不如LRU

3.5.5 Cache写策略
​ 因为Cache中的内容是主存块副本,当对Cache中的内容进行更新时,就需选用写操作策略使Cache内容和主存内容保持一致。此时分两种情况。

写命中

写回法:当CPU对Cache写命中时,只修改Cache的内容,而不立即写入主存,只有当此块被换出时才写回主存
减少了访存次数,但存在数据不一致的隐患。

每个Cache行必须设直一个标志位(脏位),以反映此块是否被CPU修改过。

全写法:当CPU对Cache写命中时,必须把数据同时写入Cache和主存,一般使用写缓冲(write buffer)

访存次数增加,速度变慢,但更能保证数据一致性


写不命中

写分配法:当CPU对Cache写不命中时,把主存中的块调入Cache,在Cache中修改。
通常搭配写回法使用。
非写分配法:当CPU对Cache写不命中时,只写入主存,不调入Cache。
搭配全写法使用。
只有“读”未命中时才调入Cache
多级Cache

现代计算机常采用多级Cache离CPU越近的速度越快,容量越小离CPU越远的速度越慢,容量越大。

各级Cache之间常采用**“全写法+非写分配法”**

Cache-主存 之间常采用**“写回法+写分配法”**

3.6 虚拟存储
​ 主存和辅存共同构成了虚拟存储器,二者在硬件和系统软件的共同管理下工作。对于应用程序员而言,虚拟存储器是透明的。虚拟存储器具有主存的速度和辅存的容量。

3.6.1 虚拟存储器的基本概念
​ 虚拟存储器将主存或辅存的地址空间统一编址,形成一个庞大的地址空间,在这个空间内,用户可以自由编程,而不必在乎实际的主存容量和程序在主存中实际的存放位置。

地址空间

逻辑地址:又称虚地址,用户编程允许涉及的地址。虚地址要比实地址大很多。

程序空间:又称虚拟空间,虚地址对应的存储空间。虚拟存储器的地址空间如下图所示。

物理地址:又称实地址,实际的主存单元地址。

主地址空间:又称实地址空间,实地址对应的存储空间。

虚拟地址工作流程

​ CPU使用虚地址时,由辅助硬件找出虚地址和实地址之间的对应关系,并判断这个虚地址对应的存储单元内容是否已装入主存。

若已在主存中,则通过地址变换,CPU可直接访问主存指示的实际单元;
若不在主存中,则把包含这个字的一页或一段调入主存后再由CPU访问。
若主存已满,则采用替换算法置换主存中的交换块(即页面)。
映射方式与写机制

虚拟存储机制采用全相联映射,每个虚页面可以存放到对应主存区域的任何一个空闲页位置。

当进行写操作时,不能每次写操作都同时写回磁盘,因而,在处理一致性问题时,采用回写法。

3.6.2 页式虚拟存储器
​ 页式虚拟存储器以页为基本单位。虚拟空间与主存空间都被划分成同样大小的页。

概念

实页:主存的页,又称页框。
虚页:虚存的页。
虚拟地址:虚页号+页内地址。
页表:页表是一张存放在主存中的虚页号和实页号的对照表,它记录程序的虚页调入主存时被安排在主存中的位置。页表一般长久地保存在内存中。虚拟地址到物理地址的转换是由页表实现的。
页表

下图为主存中页表示例。

有效位:又称装入位,用来表示对应页面是否在主存,
若为1,则表示该虚拟页已从外存调入主存,此时页表项存放该页的物理页号;
若为0,则表示没有调入主存,此时页表项可以存放该页的磁盘地址。
脏位:又称修改位,用来表示页面是否被修改过,虚存机制中采用回写策略,利用脏位可判断替换时是否需要写回磁盘。
引用位:又称使用位,用来配合替换策略进行设置,例如是否实现最先调入(FIFO位)或最近最少用(LRU位)策略等。
页表的使用:

CPU执行指令时,需要先将虚拟地址转换为主存物理地址。下图为页表地址转换过程。

页表基址寄存器存放进程的页表首地址,然后根据虚拟地址高位部分的虚拟页号找到对应的页表项,

若装入位为1,则取出物理页号,和虚拟地址低位部分的页内地址拼接,形成实际物理地址;
若装入位为0,则说明缺页,需要操作系统进行缺页处理。
快表(TLB)

问题:由地址转换过程可知,访存时先访问一次主存去查页表,再访问主存才能取得数据。如果缺页,那么还要进行页面替换、页面修改等,因此采用虚拟存储机制后,访问主存的次数更多了。

解决:将近期访问的页表项放入更高速的存储器组成的快表(TLB),可加快地址变换的速度。相应的把放在主存中的页表称为慢表。在地址转换时,首先查找快表,若命中,则无须访问主存中的页表。

结构:快表通常采用全相联或组相联方式。每个TLB项由页表表项内容加上一个TLB标记字段组成,

TLB标记用来表示该表项取自页表中哪个虚页号对应的页表项,
全相联方式:TLB标记对应该页表项的虚页号;
组相联方式:TLB标记对应虚页号的高位部分,而虚页号的低位部分用于选择TLB组的组索引。
注意区别:快表中存储的是页表项的副本;Cache中存储的是主存块的副本

具有TLB和Cache的多级存储系统

下图为一个具有TLB和Cache的多级存储系统,其中Cache采用二路组相联方式。CPU给出一个32位的虚拟地址,TLB采用全相联方式。

CPU利用虚页号查询快表TLB。TLB每一项都有一个比较器,查找时将虚页号与每个TLB标记字段同时进行比较,

若有某一项相等且对应有效位为1,则TLB命中,此时可直接通过TLB进行地址转换;
若未命中,则TLB缺失,需要访问主存去查页表。
地址转换指,将虚拟地址转换为物理地址

TLB未命中查询页表(慢表)。图中所示的是两级页表方式,虚页号被分成页目录索引和页表索引两部分,由这两部分得到对应的页表项,从而进行地址转换,并将相应表项调入TLB,

若TLB已满,则还需要采用替换策略。
根据物理地址查询Cache。完成由虚拟地址到物理地址的转换后,Cache机构根据映射方式将物理地址划分成多个字段,然后根据映射规则找到对应的Cache行或组,

将对应Cache行中的标记与物理地址中的高位部分进行比较,若相等且对应有效位为1,则Cache命中,此时根据块内地址取出对应的字送CPU。
查找时,快表和慢表也可以同步进行,若快表中有此虚页号,则能很快地找到对应的实页号,并使慢表的查找作废,从而就能做到虽采用虚拟存储器但访问主存速度几乎没有下降。

​ 在一个具有Cache和TLB的虚拟存储系统中,CPU一次访存操作可能涉及TLB、页表、Cache、主存和磁盘的访问,访问过程如下图所示。

​ 可见,CPU访存过程中存在三种缺失情况:

①TLB缺失:要访问的页面的页表项不在TLB中;
②Cache缺失:要访问的主存块不在Cache中;
③Page缺失:要访问的页面不在主存中。这三种缺失的可能组合情况如下表所示。


最好的情况是第1种组合,此时无须访问主存;
第2种和第3种组合都需要访问一次主存;
第4种组合需要访问两次主存;
第5种组合发生“缺页异常",需要访问磁盘,并且至少访问两次主存。Cache缺失处理由硬件完成;
缺页处理由软件完成,操作系统通过“缺页异常处理程序”来实现;

而TLB缺失既可以用硬件又可以用软件来处理。

3.6.3 段式虚拟存储器
​ 段式虚拟存储器中的段是==按程序的逻辑结构(功能模块)==划分的,各个段的长度因程序而异。

虚拟地址

虚拟地址=段号+段内地址

段表:是程序的逻辑段和在主存中存放位置的对照表,实现虚拟地址到实地址之间的变换。

段表的每行记录与某个段对应的段号、装入位、段起点和段长等信息。由于段的长度可变,所以段表中要给出各段的起始地址与段的长度。

访存方式

CPU根据虚拟地址访存时,首先根据段号与段表基地址拼接成对应的段表行,
然后根据该段表行的装入位判断该段是否已调入主存
装入位为“1",表示该段已调入主存;
装入位为“0",表示该段不在主存中。
已调入主存时,从段表读出该段在主存中的起始地址,与段内地址(偏移量)相加,得到对应的主存实地址。下图为段式虚拟存储器的地址变换过程。


特点

优点:段的分界与程序的自然分界相对应,因而具有逻辑独立性,使得它易于编译、管理、修改和保护,也便于多道程序的共享
缺点:因为段长度可变,分配空间不便,容易在段间留下碎片,不好利用,造成浪费。
3.6.4 段页式虚拟荐储器
定义

​ 把程序按逻辑结构分段,每段再划分为固定大小的页,主存空间也划分为大小相等的页,程序对主存的调入、调出仍以页为基本传送单位,这样的虚拟存储器称为段页式虚拟存储器。

内存布局

​ 在段页式虚拟存储器中,每个程序对应一个段表,每段对应一个页表,段的长度必须是页长的整数倍,段的起点必须是某一页的起点。

地址转换

​ 虚地址分为段号、段内页号、页内地址三部分。

CPU根据虚地址访存时,首先根据段号得到段表地址;
然后从段表中取出该段的页表起始地址,与虚地址段内页号合成,得到页表地址;
最后从页表中取出实页号,与页内地址拼接形成主存实地址。
特点

优点:兼具页式和段式虚拟存储器的优点,可以按段实现共享和保护。
缺点:在地址变换过程中需要两次查表,系统开销较大。
3.6.5 虚拟存储器与Cache的比较
相同点
1)最终目标都是为了提高系统性能,两者都有容量、速度、价格的梯度。
2)都把数据划分为小信息块,并作为基本的传递单位,虚存系统的信息块更大。
3)都有地址的映射、替换算法、更新策略等问题。
4)依据程序的局部性原理应用“快速缓存的思想”,将活跃的数据放在相对高速的部件中。
不同点
1)Cache主要解决系统速度,而虚拟存储器却是为了解决主存容量。
2)Cache全由硬件实现,是硬件存储器,对所有程序员透明;而虚拟存储器由OS和硬件共同实现,是逻辑上的存储器,对系统程序员不透明,但对应用程序员透明。
3)对于不命中性能影响,因为CPU的速度约为Cache的10倍,主存的速度为硬盘的100倍以上,因此虚拟存储器系统不命中时对系统性能影响更大。
4)CPU与Cache和主存都建立了直接访问的通路,而辅存与CPU没有直接通路。也就是说在Cache不命中时主存能和CPU直接通信,同时将数据调入Cache;而虚拟存储器系统不命中时,只能先由硬盘调入主存,而不能直接和CPU通信。
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/weixin_48024605/article/details/132556084

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值