【第三章:存储系统】

知识框架

No.0 引言

前面已经知道了数据如何在计算机内部进行表示和计算。

这一章节主要是:这些二进制的数据在计算机内部如何存储

即考虑各个存储器的:容量和速度。

在学习这个章节之前,首先把下面这个图给背回。

No.1 存储器概述

一、存储器的层次结构

华为手机内存8GB,也就是主存8GB;机身存储128GB,即辅存128GB.

平时手机里安装的app就是存储在我们的辅存里面。

因为辅存的读取速度比较慢,因此CPU不能直接和辅存进行数据的交互。

​ 因为CPU的读取速度很快,会被拉低拖后腿。

即当我们要启动一个app的时候:过程如下:

​ 启动微信的时候,需要把微信这个程序相关的数据从辅存调到主存里面

​ 打开微信的时候,有个页面停留2秒大概,就是在调调数据、

​ 然后手机的CPU就可以调用主存里面的代码。

主存和辅存之间的调换数据,需要:硬件+操作系统(需要软件工程师)

主存和Cache层之间的调换数据,需要:硬件自动完成(不需要软件工程师)

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

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

有的教材把安装在电脑内部的磁盘称为“辅存”,把U盘、光盘等称为“外存”

  1. 增加高速缓存存储器有什么作用呢?
  2. 原因:虽然我们的主存的存取速度已经很快了,但是还是不行
  3. 为了缓解这种速度矛盾,将近阶段频繁访问到的给放到Cache里面
  4. 举个例子就是:当你使用微信,先调数据到主存,当你在微信视频的时候,关于视频的那些代码被调到Cache。

在这里插入图片描述

二、储存器的分类

1、按照层次结构进行分类

高速缓存(Cache)

主存储器(主存、内存)

辅助存储器(辅存、外存)

2、按照存储介质

无论什么样的存储器,都是到最后存储二进制位信息。

  1. 半导体存储器:以半导体器件存储信息:主要是主存+Cache
  2. 磁表面存储器: 以磁性材料存储信息:主要是磁盘+磁带
  3. 光存储器:以光介质存储信息:主要是光盘+dvd+vcd

3、按照存取方式

存储器分为一个一个的存储单元:每个存储单元都有一个地址编号

  1. 随机存取存储器(RandomAccess Memory,RAM):读写任何一个存储单元所需时间都相同,与存储单元所在的物理位置无关
  2. 顺序存取存储器(SequentialAccess Memory,SAM):读写一个存储单元所需时间取决于存储单元所在的物理位置
  3. 直接存取存储器(Direct AccessMemory,DAM) :既有随机存取特性,也有顺序存取特性。先直接选取信息所在区域,然后按顺序方式存取。

4、信息的可更改性

有的存储器即可以读数据又可以写数据。

  1. 读写存储器(Read/Write Memory)-―即可读、也可写(如:磁盘、内存、Cache)
  2. 只读存储器(Read Only Memory)—―只能读,不能写(如:实体音乐专辑通常采自cD-ROM实体电影采用蓝光光碟,BIOs通常写在ROM中);;事实上现在的很多ROM都可以更改的,但是比较麻烦、

5、信息的可保存性

比如你的手机没电关机之后,再次充电开机就会一段时间,那是因为需要将操作系统等软件程序从辅存调到主存。

  1. 断电后,存储信息消失的存储器――易失性存储器(主存、Cache)
  2. 断电后,存储信息依然保持的存储器――非易失性存储器(磁盘、光盘)
  3. 信息读出后,在储信息被破坏–破坏性读出(DRAM芯片读出数据后要进行重写)
  4. 信息读出后,原存储信息不被破坏)―非破坏性读出(如SRAM芯片磁盘、光盘)

三、存储器的性能指标

1、存储容量

==存储字数*存储字长;(1M✖8位)

MAR的长度反映了存储字数的多少

MDR的长度反映了存储字长的大小

2、单位成本

每个bit位需要付出的金钱成本是多少。

==总成本/总容量

3、存储速度

又叫数据传输率:

==数据的宽度/存储周期Tm

数据的宽带即存储字长;

即每个存储周期我们可以读或者写这么个存储字的数据

下面详细介绍下存储周期:

  1. ①存取时间(Ta):存取时间是指从启动一次存储器操作到完成该操作所经历的时间,分为读出时间和写入时间。
  2. 存取周期(Tm):存取周期又称为读写周期或访问周期。它是指存储器进行一次完整的读写操作所需的全部时间,即连续两次独立地访问存储器操作(读或写操作)之间所需的最小间间隔。

在这里插入图片描述

No.2 主存储器的基本组成

一、基本的半导体元件和原理

三者会在时序控制逻辑的控制下,有条不紊的进行各种工作

存储体就是用来存放实际的二进制数据0和1的、

一个存储体有多个存储单元构成;

每个存储单元有多个存储元件来构成。

每个存储元存储一位的二进制数据。

在这里插入图片描述

1、存储元介绍

两大部分:电容+MOS管(注: 可理解为一种电控开关′输入电压达到某个阈值时,MOS管就可以接通)

我们可以根据电容保存的电荷两种状态的信息来对应二进制的0和1.

在这里插入图片描述

2、存储单元

如果我们把多个存储元连接,那么

就可以同时读出多个二进制数据或者同时写入多个二进制数据。

如果我们给红色的线加一个5V的电压,那么就这一行的MOS管导通,

然后通过绿色的线条输出数据。

我们一次可以读出的这些二进制位就是一个存储字。(也就是说一行的数据)

即存储器每一次读或者写的单位都是一个存储字。因为MOS管是接了同一根红线的。

如果要接通,那么那么就是整个字的所有这他存储单元同时接通

所以一个存储字是多少个bit要看我们的存储体的结构是怎么样的。

在这里插入图片描述

3、存储体

由于多个存储单元就构成了我们的存储体。

二、存储芯片的基本原理

那么如何根据地址来确定我们要读or要写哪个存储字呢??即选择哪一行呢?

涉及到译码器的使用。:n位地址就会对应到2^n的个存储单元。

即译码器会根据MAR里面的n位地址,进而选择把它转变成某一条选通线的高电平信号

连通对应的那个红线,使得那一行导通。

总之每一个地址会对应译码器的一条输出线。

即通过译码器:一个地址信号会转为某一条的输出线的高电平信号。

然后就是用MDR来存储读出的每一位的二进制位信息。

然后接下来cpu会通过数据总线

  1. 那么CPU读数据的总流程如下:
  2. 首先CPU传递地址到MAR;
  3. 然后MAR的地址通过译码器转化为一条片选线的高电平
  4. 然后这条红线通了之后,将一个存储字的数据存放到MDR;
  5. 然后MDR的数据通过数据总线传走。

在这里插入图片描述

对于左上角部分还可以继续细节:

即:片选线+读写控制线+数据线+地址线

而存储体以后的常见描述:

8K✖8位即 13位的8bit的。

在这里插入图片描述

三、如何实现不同的寻址方式

对于存储矩阵即存储体:当一个小方格表示一个字节的时候即1B;

然后一整行表示 一个存储字;即几个B;

假设总容量为1KB,字长为4B;那么就是有256个字,即存储矩阵256行。

那么就引入了 如何编址的问题:

1:按照字节编址:每个字节会对应一个地址即,1B一个地址。那么就有1K个地址。

好像是没有按照字编址的。现代计算机按照字节编址(byte addressing)进行内存寻址,也叫做字节可寻址(byte-addressable)。这意味着内存中每个单元的地址都是一个字节(8位)的倍数。例如,在一个32位体系结构中,内存中的每个地址都代表一个4个字节(32位)的块。

那么在解决了如何编址的问题就是如何寻址的问题了。

1:虽然是按照字节编址的,但是也支持按照存储字来寻址。

2:按照字节寻址:有10根地址线:2^10;

在这里插入图片描述

No.3 SRAM和DRAM

两种特定类型的存储芯片。(RAM:随机存取存储器)

DRAM:即动态的RAM;主要用于制造 主存

SRAM:即静态的RAM;主要用于制作 Cache

一、存储元件不同导致的特性差异

两种的核心区别就是 存储元件不同:

DRAM芯片使用栅极电容存储信息

SRAM芯片:使用双稳态触发器存储信息

对应DRAM的话:

  1. 给字选择线加5v,那么使得MOS管导通;然后数据线上面也加5V,即给了二进制的1;
  2. 上面所说的话也就是相当于 写入 数据线传入的 1 了。
  3. 那么数据线传入的5V使得与接地的形成电势差,然后存储电荷。代表存储了二进制数据1;
  4. 同理存储数据0的话,也就是没有电势差,没有存储电荷,然后代表 数据 0;

在这里插入图片描述

对应SRAM的双稳态触发器:

  1. 有两个稳定的状态
  2. 并且相对于上面的一条数据线,有两条数据线。

在这里插入图片描述

两种对比的话:

  1. 对于DRAM::电容放电信息被破坏,是破坏性读出。读出后应有重写操作,也称“重生”(读写速度慢)
  2. 对于SRAM::读出数据,触发器状态保持稳定,是非破坏性读出,无需重写(读写速度快)
  3. 对于DRAM::每个存储元制造成本更低,集成度高,功耗低。
  4. 对于SRAM::每个存储元制造成本更高,集成度低,功耗大。

在这里插入图片描述

二、DRAM的刷新

那什么是刷新呢?

对于DRAM,虽然电容可以存储电荷,但是电荷会慢慢的流失;过一段时间会消失。

电容内的电荷只能维持2ms。即便不断电,2ms后信息也会消失

即2ms之内必须“刷新”一次;(给电容充电)

多久需要刷新一次? 刷新周期:一般为2ms

因为计算机是按照字节编址的。然后一个存储单元是8bit;//不知道对不对。

现代计算机那么64位的计算机是指存储单元为64位吗?

64位计算机是指使用64位数据总线来进行数据传输和处理的计算机。其中的存储单元也通常是64位宽,也就是说,CPU一次读取或写入操作可以同时处理64位的数据。这样做可以大大提高计算机的处理能力和吞吐量,同时还可以支持更大的物理地址空间和更高的内存容量。需要指出的是,存储单元的大小和计算机的位数是不同的概念,计算机的位数指的是CPU的寄存器大小,而不是存储单元的大小。

那么刷新就需要那么多行;即2^n跟选通线去刷新。很明显不合理的。即存储器的简单模型是不合理的;

进而拆分成行列地址。也就是把存储单元的摆放方式从竖列变成了矩阵。

存储器的简单模型:假设20位地址,那么就是2^20那么多根线;太多了。

在这里插入图片描述

进而改变:从一维的排列,变成二维的排列。即选通线的根数再次开方。

一次刷新就刷新了一大行:图片中圈住的,。

在这里插入图片描述

在这里插入图片描述

三、DRAM的地址线复用技术

引脚减半,然后大概就是 先给行地址使用,再给列地址使用。

对于送行列地址DRAM是分两次送。

什么是送地址啊:就是把地址丢给行地址译码器和列地址译码器。

假设32位地址的,那么需要32根如果同时送的话,但是如果分开送就仅仅需要16根就行了。

第一次把行地址送到行地址缓冲器里面,然后再送给对应的行地址译码器

第二次把列地址送到列地址缓冲器里面,然后再送给对应的列地址译码器

在这里插入图片描述

No.4 只读存储器ROM

RAM芯片―一易失性,断电后数据消失

ROM芯片一―非易失性,断电后数据不会丢失

一、各种ROM

在这里插入图片描述

二、计算机内的重要ROM

计算机的主存是用来存储一系列的指令和数据的;

计算机的CPU是用来到主存中取指令并执行指令的,

但是呢主存是RAM是一种容易失性的芯片,那么断电后RAM内的数据全部丢失。

拿电脑来说呢就是:电脑关机之后,主存里面的数据全部丢失;当开机的时候将一些基础的数据和指令重新调入主存里面。

但是呢,但是呢,在最开始CPU在执行命令的时候也需要一些我们给它提供的指令序列;就是最一开始的

那么这些从哪开始呢,毕竟一开始主存是没有东西的,所以我们在主板上的ROM处先预先存好,然后最开始CPU从这里读取;

根据ROM这里面的程序指令,指引着CPU将辅存里面的数据和指令调入到主存里面去。

逻辑上主存用RAM+ROM组成,且二者常统一编址

在这里插入图片描述

No.5 主存储器和CPU的连接

一、单块存储芯片与CPU的连接

单块存储芯片 会暴露出来的接口。

虽然下面的图里面有MDR,MAR按道理来说也确实要属于存储器;但现代计算机两者是在CPU内部的。

即CPU里面集成了MDR,MAR;MDR根据数据总线与主存交互,MAR根据地址总线与主存交互。

绿色的线是 通常与数据总线连接,宽度=存储字长

红色的线是 传送访问地址的 通常会通过地址总线和cpu进行连接

棕色的线 是 一些控制线,CPU通过控制总线来发送控制信号;

下面的是8*8位的存储芯片:8个字,字长为8bit。

在这里插入图片描述

二、多块存储芯片与CPU的连接

1、位扩展法

数据总线宽度>存储芯片字长,怎么办?——位扩展

现代计算机的大都是64bit了。所以字长为8bit的太少了,进行位扩展即达到数据总线宽度一致。

假设现在是有 8K*1位的存储芯片;那么如何连接呢??

首先 8K 是2^13 即从A0~A12; 1位是D0;

同理顺下:

在这里插入图片描述

在这里插入图片描述

2、字扩展法

想要扩展主存字数怎么办?—字扩展

我们可以连接多块存储芯片来护展储存的字数。

防止 数据总线得到的数据冲突,所以要有片选线的设计

进而使得整个主存的地址空间是连续的;从全0到全1;

即使用译码器来处理CPU的高位地址部分;:译码片选法:n条线:2^n个片选信号。

即两种方法:

线选法:就是一个线负责一个CS,n条线→n个选片信号,电路简单,地址空间不连续

译码片选法:n条线→2^n个选片信号,电路复杂,地址空间可连续

在这里插入图片描述

3、字位扩展法

在这里插入图片描述

三、关于译码器知识的补充

No.6 双端口RAM和多模块存储器

这两种主存的优化技术。

首先回顾下概念:存取周期:可以连续的读/写的最短时间间隔。

存取时间:CPU从内存里面读出这一个字只需要存取时间那么多的时间。但必须等恢复时间进而进行下一个字的读取。

那么多核的CPU都要访问内存,该怎么办呢??(恢复是主存独家)

::毕竟当一个CPU访问主存后,有那么多的恢复时间,第二个CPU访问需要等那么长的恢复时间才可以。

即使是单核的CPU,CPU的读取速度依然比主存快很多,主存的恢复时间过长怎么办?

  1. 注:DRAM芯片的恢复时间比较长,有可能是存取时间的几倍(SRAM的恢复时间较短),如:存取时间为r,存取周期为T,T=4r

  2. 对于DRAM芯片的读操作是破坏性的读;因为是电容存储恢复较慢。

在这里插入图片描述

一、多核CPU的双口RAM

那么多核的CPU都要访问内存,该怎么办呢??(恢复是主存独家即内存条是一条)

::毕竟当一个CPU访问主存后,有那么多的恢复时间,第二个CPU访问需要等那么长的恢复时间才可以。

我们使用双端口RAM:作用:优化多核CPU访问一根内存条的速度

两个端口进行并行的访问。需要有两组完全独立的数据线、地址线、控制线。CPU、RAM中也要有更复杂的控制电路

两个端口对同一主存并行访问出现的操作有以下4种情况:

1.两个端口同时对不同的地址单元存取数据。(允许的)

2.两个端口同时对同一地址单元读出数据。(允许的)

3.两个端口同时对同一地址单元写入数据。(出现写入错误)
4.两个端口同时对同一地址单元,一个写入数据,另一个读出数据。(可能出现读出错误)

那么如何解决上面的3、4呢?

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

在这里插入图片描述

二、多模块存储器

即使是单核的CPU,CPU的读取速度依然比主存快很多,主存的恢复时间过长怎么办?

当CPU想要读取一段连续的数据的时候就必须等待它的恢复时间:我们使用多模块存储器来解决。

大概意思:相当于把你的一个内存条逻辑上变为N条大小一致的内存条。

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

  1. 当我们的CPU访问内存的时候,先给出访问内存地址:
  2. 使用更高位/低位的几位bit来区分我们想要访问的是哪一个存储体
  3. 首先是4*8=32个存储单元;为5个bit位;然后再分几块存储体;继而决定体号的bit位。
  4. 下面是是个实例:
  5. 假设每个存储体存取周期为T,存取时间为r,假设T=4r,
  6. 那么CPU从一个存储体里面取走一个字的数据需要r那么长的时间,然后如果CPU想要再次访问这个存储体就需要等3r那么长的时间。
  7. 对于高位交叉编址的存储器:如果要连续访问这样的地址:00000 00001 00010 00011 00100
  8. ::::也就是说当访问了00000这个地址耗费r时间,若想访问00001这个地址就需要等待3r的时间,因为这俩地址在逻辑上的同一个存储体,虽然高位交叉编址将之逻辑上分为了4个存储体;但是连续地址仍在同一个逻辑上的存储体。
  9. ::::即总工程我们连续读取了五个存储字,那么耗时就是5T.(显然)::耗时nT(公式)
  10. 对于高位交叉编址的存储器:如果要连续访问这样的地址:00000 00001 00010 00011 00100
  11. ::::也就是说当访问了00000这个地址耗费r时间(这个存储体的恢复时间可以在那里自己恢复),若想访问00001这个地址直接访问,且读完00011 之后,正好过了4r时间,即第一个存储体的恢复好了,然后继续在该存储体读00100即可。
  12. ::::即总工程我们连续读取了五个存储字,那么总耗时就是T+4r.(显然)存取的话5r时间就结束了。即连续读取n个存储字总耗时:公式:T+(n-1)r;n-1个都是直接读的,最后一个存储字要包括恢复时间在内才算是总耗时。

在这里插入图片描述

在这里插入图片描述

思考:为什么要探讨“连续访问”的情况?

在实际应用中,许多就是存储在连续的存储单元内的。连续存放。

还有就是:既然低位交叉编址的方案使得我们CPU访问内存的效率提高,那么我们应该取几个存储体呢??

也叫做:存取的流水线方式并行存取。

宏观上,一个存储周期内,m体交叉存储器可以提供的数据量为单个模块的m倍。

为了使流水线上不间断:即存取周期为T,存取时间为r,为了使流水线不间断,应保证模块数m≥T/r

在这里插入图片描述

No.7 外存储器:磁盘存储器

一、磁盘存储器

计算机的外存储器又称为辅助存储器,目前主要使用磁表面存储器。
所谓“磁表面存储”,是指把某些磁性材料薄薄地涂在金属铝或塑料表面上作为载磁体来存储信息。磁盘存储器、磁带存储器和磁鼓存储器均属于磁表面存储器。

原理:磁带划过磁头下方的时候,磁头就可以1bit1bit的往里面写/读数据。只能串行一个一个的,读写不能同时操作。

磁表面存储器的优点:
①存储容量大,位价格低;②记录介质可以重复使用;
③记录信息可以长期保存而不丢失,甚至可以脱机存档;④非破坏性读出,读出时不需要再生。
磁表面存储器的缺点:
①存取速度慢;②机械结构复杂;
③对工作环境要求较高。

在这里插入图片描述

磁盘的性能指标:

①磁盘的容量:一个磁盘所能存储的字节总数称为磁盘容量。磁盘容量有非格式化容量和格式化容量之分。

非格式化容量是指磁记录表面可以利用的磁化单元总数。
格式化容量是指按照某种特定的记录格式所能存储信息的总量。

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

道密度是沿磁盘半径方向单位长度上的磁道数;
位密度是磁道单位长度上能记录的二进制代码位数;

面密度是位密度和道密度的乘积。

补充:磁盘上的每一个扇区所能存储的二进制数据是一样的,大小相同。

对于一个扇区,最外的磁道和最内部的磁道所能存储的容量相同

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

在这里插入图片描述

③平均存取时间:是以每个扇区为单位的。

平均存取时间=寻道时间(磁头移动到目的磁道)+旋转延迟时间(磁头定位到所在扇区)+传输时间(传输数据所花费的时间)

④数据传输率:磁盘存储器在单位时间内向主机传送数据的字节数。称为数据传输率。

假设磁盘转数为r(转/秒),每条磁道容量为N个字节,则数据传输率为D,=rN

在这里插入图片描述

那么主机是如何指明 要读取的哪一个扇区的呢??

过程如下:

在这里插入图片描述

二、固态硬盘:SSD

No.8 Cache

一、Cache的基本概念和原理

之前我们学习了存储系统的一些优化策略、

对于主存:双端口RAM、多模块存储器提高存储器的工作速度

优化后速度与CPU差距依然很大;;那么如何解决这个问题呢?

可以设计更高速的存储单元,比如将DRAM更改成SRAM,但是这也意味着存储器的价格更高。

那么又如何解决呢?:基于程序的局部性原理,对存储系统进行改善:“Cache-主存”层次。

用这样的方式来缓和CPU和主存之间的速度矛盾。

下面是Cache的运行情况:

1:在没有Cache下:

在这里插入图片描述

2:在有Cache的情况下:

Cache的集成度较低,也就是说有钱也不能有效的体积变小。

在这里插入图片描述

3:局部性原理

空间局部性:在最近的未来要用到的信息(指令和数据),很可能与现在正在使用的信息在存储空间上邻近的(数组元素、顺序执行的指令代码)

时间局部性:在最近的未来要用到的信息,很可能是现在正在使用的信息(循环结构的指令代码)

基于局部性原理,不难想到,可以把CPU目前访问的地址“周围”的部分数据放到cache中

4:性能分析

如果CPU要找的数据可以在Cache中找到,那么称之为Cache命中,

命中率H:CPu欲访问的信息已在Cache中的比率,缺失(未命中)率M=1-H

CPU会优先去Cache去找数据,找到的概率为H,找不到概率为1-H。

CPU是先去Cache找,找不到再去主存去找的。当然也可以同时查找。

那么平均访问时间就是:

在这里插入图片描述

在这里插入图片描述

5:如何确定Cache的界定范围

基于局部性原理,不难想到,可以把CPU目前访问的地址“周围”的部分数据放到cache中。如何界定“周围”?

将主存的存储空间“分块”,如:每1KB为一块.主存与cache之间以“块”为单位进行数据交换
比如访问了一个地址,那么可以先判断这个地址所属于的块。然后把这个块复制到Cache。

但是如何确定Cache和主存的映射关系呢??

如何区分Cache 与主存的数据块对应关系? —Cache和主存的映射方式
Cache很小,主存很大。如果cache满了怎么办? —替换算法
CPu修改了cache中的数据副本,如何确保主存中数据母本的一致性?一一Cache写策略

在这里插入图片描述

二、Cache和主存的映射方式

如何区分Cache 与主存的数据块对应关系? —Cache和主存的映射方式

如何如何区分Cache中存放的是哪个主存块? ----给每个cache块增加一个“标记”,记录对应的主存块号?

那么如何标记呢? 增加 “有效位”,然后如果有效的话就看标记用二进制表示的是位于主存块的哪个??

当然这些都是直接使用硬件电路来实现的。

1.全相联映射

意味着:主存里面的块可以复制到Cache中的任意一个位置去。

主存块可以放在Cache的任意位置

Cache里面的块可以来自主存里面的任意一个位置。

CPU访问主存地址 101001110:
①主存地址的前22位,对比Cache中所有块的标记;
②若标记匹配且有效位=1,则Cache命中,访问块内地址为001110的单元。
③若未命中或有效位=0,则正常访问主存

在这里插入图片描述

2.直接映射

意味着:储存里的某一个主存块,它只能存放在cache当中某一个规定的位置

那么如何确认位置呢?

每个主存块只能放到一个特定的位置:Cache块号=主存块号% Cache总块数

3.组相联映射

将Cache进行分组,对于主存的任意一个主存块,

Cache块分为若干组,每个主存块可放到特定分组中的任意一个位置;组号=主存块号%分组数。

三、替换算法

四、Cache写策略

No.9 虚拟存储系统

一、页式存储器

二、虚拟存储器

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值