NCQ TCQ 什么是NCQ 什么是TCQ 区别

大话存储(通俗解释版)(三)之磁盘原理与技术详解 《磁盘原理与技术详解》深入解析了硬盘的物理结构、数据组织方式和关键技术。从盘片制造、磁道扇区布局到ZBR技术,详细介绍了数据存储的精密设计。重点阐述了磁盘调度算法(如SCAN、NCQ)、缓存机制和性能影响因素(转速、寻道时间等),并对比了IDE、SATA、SCSI等接口技术的特点与演进。通过"磁性王国"的生动比喻,形象展示了硬盘读写流程,帮助读者理解这一复杂而精妙的存储系统。 阅读详情

TCQ:Tagged Command Queuing,标记命令队列,首先是用在SCSI接口的硬盘上面,不过传统的P-ATA或者新兴的S-ATA也可以实现TCQ功能。SCSI的TCQ要强大
得多,这主要表现在队列类型及深度。SCSI TCQ支持三种队列类型,分别是简单队列(Simple Queue)、有序队列(Ordered Queue)和队列头(Head of Queue)。而ATA命令排队(TCQ和NCQ)只是简单队列,即硬盘享有以任意顺序排列和优化命令的完全自主权。

TCQ的优点主要表现在:
1. 提高随机读取速度
2. 在多执行序( Multi-Threaded )环境及高随机读取负荷 (High Randum I/O
Workloadings) 下,仍能维持高性能表现。
3. 将重复性及相冲突之指令予以重新排序,提高硬盘效能

至于队列深度的规定,ATA命令排队最大为32级,SCSI TCQ为256级,对PC和入门级服务器、网络存储设备来说, ATA的32级深度已经足够,而SCSI面向的多主机/多设备应用环境则要求更深的队列深度。不过,由于队列越深(实现)成本也就越高,并且满深度利用队列时大量的待处理命令反倒可能成为性能瓶颈,因此并行SCSI硬盘通常只用到64级深度,256级的队列深度往往在磁盘阵列子系统中实现。

此外,ATA命令排队还有一些局限性,譬如排队命令与非排队命令不能混合使用、发生错误将导致硬盘放弃队列中的全部命令(主机必须管理恢复过程)。而我们需要记住的就是,ATA TCQ的概念要小于TCQ(NCQ也一样,因为它本身也是一种TCQ,只是称呼不同而已),两者间不能划等号。

什么是NCQ呢?

NCQ被称为“全速命令队列(Native Command Queuing,NCQ)”。全速命令队列是SATA II最先进和最令人期待的特性,是SATAⅡ规范中的重要组成部分,也是SATAⅡ规范唯一与硬盘性能相关的技术。NCQ是一项强大的接口/硬盘技术,它通过在硬盘内部优化作业的执行顺序来提升硬盘性能和使用寿命。  

首先让我们来看一下硬盘是怎样读写信息的。硬盘通过将信息写入磁盘磁道上的特定位置进行信息存储,硬盘访问磁盘上信息的过程如下:

● 寻找存储数据的目标磁碟(platter),访问该磁碟。

● 寻找磁碟上存储数据的目标磁道(track),访问磁道。

● 寻找磁道上存储数据的目标簇(cluster),访问簇。

● 寻找簇上存书数据的目标扇区(sector),访问扇区。

● 寻找目标数据,读取数据。

通过上面的步骤,硬盘即可获取所需要的数据信息。硬盘写入数据的步骤也是如此,区别仅仅在于读操作变为写操作。大多数情况下数据存入硬盘并非是顺序存入,而是随机存入,甚至有可能一个文件被分配在不同盘片上。对于不支持NCQ的硬盘来说,大量的数据读写需要反复重复上面的步骤,而对于不同位置的数据存取,磁头需要更多的操作,降低了存取效率。支持NCQ技术的硬盘对接收到的指令按照他们访问的地址的距离进行了重排列,这样对硬盘机械动作的执行过程实施智能化的内部管理,大大地提高整个工作流程的效率:即取出队列中的命令,然后重新排序,以便有效地获取和发送主机请求的数据,在硬盘执行某一命令的同时,队列中可以加入新的命令并排在等待执行的作业中。显然,指令排列后减少了磁头臂来回移动的时间,使数据读取更有效。


如图所示,如果新的命令恰好是处理起来机械效率最高的,那么它就是队列中要处理的下一个命令。举个例子:比如向硬盘下达一组数据传送指令,由于数据在磁盘上分布位不同,磁头可能会先读取260扇区,再读取7660扇区,然后又读取261扇区……如果我们对指令进行优化排列,可以先读260扇区,接着依次读261扇区,最后读取7660扇区……显然,指令排列后减少了磁头臂来回移动的时间,使数据读取更有效。并且有效的排序算法除了考虑目标数据的线性位置,也会考虑其角度位置,并且还要对线性位置和角度位置进行优化,以使总线的服务时间最小,这个过程也称做“基于寻道和旋转优化的命令重新排序”。

不过,要充分享用NCQ技术,光硬盘支持是不行的,还要对应的硬盘控制器(如南桥芯片中的磁盘控制器)支持才行。例如Intel从945芯片组的ICH7南桥开始支持NCQ技术,nVidia从nForce4 SLI芯片组开始支持NCQ技术。


下面是seagate官方关于支持NCQ硬盘的数据。

从seagate推出高端NCQ硬盘以来,一直深受广大用户拥戴,这次NCQ硬盘向低端

发展,体现了seagate对用户的全方位考虑。据相关媒体报道,拥有NCQ技术的新款硬盘相对没有NCQ技术的旧版硬盘产品。整体性能可以提升5%~20%,而拥有NCQ技术的这款低端产品的上市无疑是普及硬盘领域最新技术的最好途径。

virtuoso--DFF 27-实验课-std_cell2 阅读详情

相关推荐

Linux CentOS7文件系统(/dev/var)的容量扩充

原因是之前安装docker后,再想安装Nessus,系统说home、var文件系统的内存都不够。

JHoanna的博客 3224

NCQ与TCQ的区别及测试比较

硬盘指令队列NCQ/TCQ技术详解&性能测试 作者:Darren   NCQ(Native Command Queuing)与TCQ(Tagged Command Queuing)都是设计通过把计算机发向硬盘的指令做重新排序,从而提高硬盘性能的技术。NCQ技术在 300MB/s的Serial ATA II规格中引入,针对的是主流的硬盘...

hongbochen1223的专栏 961

【小程序】支付宝直付通解决方案

支付宝直付通是支付宝为小程序提供的一种支付解决方案,可以实现小程序中直接使用支付宝进行支付。以上是一个简单的支付宝直付通解决方案及相关代码示例。具体的使用还需要根据自己的业务需求进行定制化开发和调整。

qq_31532979的贺公子之数据科学与艺术博客,致力于科技向善,拥抱开源,要用技术的影响力来领导团队,而不是威权和职位! 1281

大幅度提高电脑性能,开启AHCI、NCQ详解

1、AHCI ,全称为Serial ATA Advanced Host Controller Interface(串行ATA高级主控接口/高级主机控制器接口),本质是一种PCI类设备,在系统内存总线和串行ATA设备内部逻辑之间扮演一种通用 接口的角色。AHCI通过包含一个PCI BAR(基址寄存器),来实现原生SATA功能。由于AHCI统一接口的研发成功,使得支持串行ATA产品的开发工作...

CURSED! 1536

AstrBot插件开发全攻略:从零编写一个天气查询插件(Python实战)

本文提供了一份详细的AstrBot插件开发实战指南,手把手教你使用Python从零编写一个智能天气查询插件。内容涵盖插件系统核心设计、开发环境搭建、API调用与数据处理、自然语言交互实现以及插件打包发布全流程,帮助你快速掌握基于AstrBot框架的聊天机器人功能扩展技能。

weixin_29212867的博客 1082

基于51单片机的智能灌溉系统

基于51单片机的智能灌溉系统

jiejiezuishuai的博客 2101

SATA系列专题之六:浅析NCQ原生指令序列

所以,我们可以看到在上面的sata trace中,分16次发送Data FIS。所以,我们可以看到在上面的sata trace中,分4次发送Data FIS来实现32768 bytes数据的传输。如果硬盘同时间内完成多组命令,这些命令完成所引起的中断就可以聚集在一起,大幅减少中断的数目,这对于降低中断延迟有极大的贡献。在Device端,当Queued Commands(最多32)中的一个write或者read准备好传输数据时,通过发送。当Drive收到一个Command,是要将其重新排列?

yundanfengqing_nuc的专栏 2344

OpenDataLab 大模型训练数据集下载记录

大模型 训练数据集

u013558123的博客 3341

硬盘基础参数

IOPS:每秒的IO读写次数。一般来说,一块15K转速的SATA盘一次IO平均大约5.5ms,包括2ms的寻道时间和3.5毫秒的磁头读写时间,这样IOPS大概180左右Bandwith Per Second:每秒的读/写的数据量RPM:每秒转速,当然越大说明硬盘越快咯LUN,HB

majieyue的专栏 1948

YOLOv8改进策略【注意力机制篇】| CVPRW-2024 分层互补注意力混合层 H-RAMi 针对低质量图像的特征提取模块

许多证据表明层次化网络对图像恢复(IR)任务通常不太有效,因为IR的目标是逐个预测像素值(密集预测),而缩小特征图会丢失重要的像素级信息。然而,层次化结构有降低时间复杂度以及学习语义级和像素级特征表示的优点。为了弥补缺点并利用优点,设计了H - RAMi层。

Limiiiing的博客 377

qt医疗信息系统(HIS)

**UI 组件**: QWidget、QTextBrowser、QTableWidget、QGraphicsView 等。- **网络通信**: Qt Network (TCP/IP)- **DICOM 处理**: DCMTK 3.6.7。- **数据库**: SQLite (轻量、跨平台)**数据库文件**: `hospital.db`- **开发框架**: Qt 6 (C++)- 医疗影像 (DICOM) 查看器。**医疗影像 (DICOM) 查看器****电子病历 (EMR) 浏览器**

寒寒豆豆软件公司的博客 336

什么是NCQ

NCQ被称为“全速命令队列(Native Command Queuing,NCQ)”。全速命令队列是SATA II最先进和最令人期待的特性,是SATAⅡ规范中的重要组成部分,也是SATAⅡ规范唯一与硬盘性能相关的技术。NCQ是一项强大的接口/硬盘技术,它通过在硬盘内部优化作业的执行顺序来提升硬盘性能和使用寿命。全名 Advanced Host Controller Interface,中译:进阶...

kwame211的博客 3919

基于YOLO的智能视频监控异常行为检测研究:从算法原理到落地部署的全栈实践

本文深入探讨如何利用 YOLO(You Only Look Once)系列算法构建一套端到端的异常行为检测系统。文章首先回顾 YOLOv8 在时空建模上的局限,然后提出“YOLO-STA(Spatio-Temporal Aggregation)”轻量级改进框架,在公开数据集 UCF-Crime 上将异常行为检测的 mAP@0.5 从 72.4 提升到 80.1;接着给出完整训练、推理、部署的 Python 代码(PyTorch + TensorRT),并介绍如何仅用 4 GB 显存的 Jetson Xavi

博客 1320

linux aio工作队列处理,异步-Linux上POSIX AIO和libaio之间的区别?

在linux上,这两个AIO实现根本不同。POSIX AIO是一种用户级别的实现,可以在多个线程中执行常规的阻塞I / O,因此给人一种I / O异步的错觉。 这样做的主要原因是:它适用于任何文件系统它可以(基本上)在任何操作系统上工作(请记住,gnu的libc是可移植的)它适用于启用了缓冲的文件(即未设置O_DIRECT标志)主要缺点是队列深度(即实际上可以执行的未完成操作的数量)受您选择拥有的...

weixin_33093323的博客 202

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

队列深度拷贝 java_性能测试时,也要注意一下队列深度(queue depth)

在做性能测试的时候,主机端有时会成为瓶颈,所以测试的时候往往拿很牛B的主机,然后再插上无数个HBA卡来测试。有时,可能即使弄了很猛的主机,但是测试结果还是达不到最优,可以注意一下主机端对于挂过来的卷的queue depth设置。下面的文章是将硬盘的NCQ技术的,有涉及到这方面的一些基础东西:------------------------------------------------------...

weixin_42515295的博客 765

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

linux 找不到libaio.h,POSIX AIO和Linux上的libaio之间的区别?

小编典典在linux上,这两个AIO实现根本不同。POSIX AIO是一种用户级别的实现,可以在多个线程中执行常规的阻塞I / O,因此给人一种I / O异步的错觉。这样做的主要原因是:它适用于任何文件系统它可以(基本上)在任何操作系统上工作(请记住,gnu的libc是可移植的)它适用于启用了缓冲的文件(即未设置O_DIRECT标志)主要缺点是队列深度(即实际上可以执行的未完成操作的数量)受您选择...

weixin_33997127的博客 302

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

linux aio工作队列处理,Linux上的POSIX AIO和libaio之间的区别?

在linux上,两个AIO实现是根本不同的。POSIX AIO是在多个线程中执行正常阻塞I / O的用户级实现,因此给出了I / O是异步的错觉。做到这一点的主要原因是:>它适用于任何文件系统>它在任何操作系统(基本上)工作(记住,gnu的libc是可移植的)>它适用于启用缓冲的文件(即没有设置O_DIRECT标志)主要的缺点是你的队列深度(即在实践中可以拥有的未完成操作的数量)...

weixin_39949894的博客 156

linux aio工作队列处理,Linux上的POSIX AIO和libaio的区别?

在Linux上,两个AIO实现是根本不同的。POSIX AIO是一个用户级别的实现,它在多个线程中执行正常的阻塞I / O,因此给出I / Oasynchronous的错觉。 这样做的主要原因是:它适用于任何文件系统它(基本上)在任何操作系统上工作(请记住,gnu的libc是便携式的)它在启用缓冲的文件上工作(即没有设置O_DIRECT标志)主要的缺点是你的队列深度(也就是你在实际中可能遇到的未完...

weixin_35678674的博客 285

POSIX AIO及libaio的区别

POSIX AIO及libaio的区别 libaio是原生的 linux aio,行为更为低级;POSXI AIO是在用户空间模拟异步IO的功能,不需要内核的支持。 具体解释: On linux, the two AIO implementations are fundamentally different. The POSIX AIO is a user-level implem

学徒人生 3698

服务器基础知识:SATA盘和SAS盘的区别(图示)

注:随着NVMe SSD的普及,SAS/SATA在高速场景逐渐被替代,但SAS仍在中端企业存储中占重要地位。

学亮编程手记 6478
上一篇: 北京的长途押运高薪招聘骗局
下一篇: 初学编写linux内核模块
Iphone4
博客等级 码龄17年 17粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值