linux进程调度方法

linux内核学习9:Linux的进程调度 一、什么是进程调度 出现背景: 无论是在批处理系统还是分时系统中,用户进程数一般都多于处理机数、这将导致它们互相争夺处理机。另外,系统进程也同样需要使用处理机。这就要求进程调度程序按一定的策略,动态地把处理机分配给处于就绪队列中的某一个进程,以使之执行。 进程调度,是确保进程能有效工作的一个内核子系统。 调度程序负责决定将哪些进程投入到运行,何时进行以及运行多长时间。 进程调度程序(通常简称为调度程序)可看成是可运行态进程之间分配有限的处理器时间资源的内核子系统。 进程调度是对TASK_RUNNING状 阅读详情

 

 


linux 内核的三种调度方法:

1 , SCHED_OTHER 分时调度策略,

 

2 , SCHED_FIFO 实时调度策略,先到先服务

 

3 , SCHED_RR 实时调度策略,时间片轮转

 

http://www.myfaq.com.cn/2005September/2005-09-13/199638.html

 

 

 

linux 内核的三种调度方法:

1 , SCHED_OTHER 分时调度策略,

 

 

2 , SCHED_FIFO 实时调度策略,先到先服务

 

 

3 , SCHED_RR 实时调度策略,时间片轮转

 

 

实时进程将得到优先调用,实时进程根据实时优先级决定调度权值,分时进程则通过 nice 和 counter 值决定权值, nice 越小, counter 越大,被调度的概率越大,也就是曾经使用了 cpu 最少的进程将会得到优先调度。

 

SHCED_RR 和 SCHED_FIFO 的不同:

     当采用 SHCED_RR 策略的进程的时间片用完,系统将重新分配时间片,并置于就绪队列 尾。放在队列尾保证了所有具有相同优先级的 RR 任务 的调度公平。      

    SCHED_FIFO 一 旦占用 cpu 则一直运行。一直运行直到有更高优先级任务到达或自己放弃。

    如果有相同优先级的实时进程(根据优先级计算的调度权值是一样 的)已经准备好, FIFO 时必须等待该进程主动放弃后才可以运行这个优先级相同的任务。 而 RR 可以让每个任务都执行一段时间。

 

 

相同点:

    RR 和 FIFO 都只用于实时任务。

    创建时优先级大于 0(1-99) 。

    按照可抢占优先级调度算法进行。

    就绪态的实时任务立即抢占非实时任务。

 

所有任务都采用 linux 分 时调度策略时。

1 ,创建任务指定采用分时调度策略,并指定优先级 nice 值 (-20~19) 。

2 ,将根据每个任务的 nice 值 确定在 cpu 上的执行时间 (counter) 。

3 ,如果没有等待资源,则将该任务加入到就绪队列中。

4 ,调度程序遍历就绪队列中的任务,通过对每个任务动态优先级的 计算 (counter+20-nice) 结果,选择计算结果最大的一个去运行,当这个时间片用完后 (counter 减至 0) 或者主动放弃 cpu 时,该任务将被放在就绪队列末尾 ( 时间片用完 ) 或等待队列 ( 因等待资源而放弃 cpu) 中。

5 ,此时调度程序重复上面计算过程,转到第 4 步。

6 ,当调度程序发现所有就绪任务计算所得的权值都为不大于 0 时,重复第 2 步。

 

 

所有任务都采用 FIFO 时,

1 ,创建进程时指定采用 FIFO , 并设置实时优先级 rt_priority(1-99) 。

2, 如果没有等待资源,则将该任务加入到就绪队列中。

3 ,调度程序遍历就绪队列,根据实时优先级计算调度权值 (1000+rt_priority), 选择权值最高的任务使用 cpu ,该 FIFO 任务将一直占有 cpu 直到有优先级更高的任务就绪 ( 即使优先级相同也不行 ) 或者主动放弃 ( 等待资源 ) 。

4 ,调度程序发现有优先级更高的任务到达 ( 高优先级任务可能被中断或定时器任务唤醒,再或被当前运行的任务唤醒,等等 ) ,则调度程序立即在当前任务堆栈中保存当前 cpu 寄存器的所有数据,重新从高优先级任务的堆栈中加载寄存器数据到 cpu ,此时高优先级的任务开始运行。重复第 3 步。

5 ,如果当前任务因等待资源而主动放弃 cpu 使 用权,则该任务将从就绪队列中删除,加入等待队列,此时重复第 3 步。

 

所有任务都采用 RR 调度 策略时

1 ,创建任务时指定调度参数为 RR ,并设置任务的实时优先级和 nice 值 (nice 值将会转换为该任务的时间片的长度 ) 。

2 ,如果没有等待资源,则将该任务加入到就绪队列中。

3 ,调度程序遍历就绪队列,根据实时优先级计算调度权值 (1000+rt_priority), 选择权值最高的任务使用 cpu 。

4 ,如果就绪队列中的 RR 任务 时间片为 0 ,则会根据 nice 值设置该任务的时间片,同时将该任务放入就绪队列的末尾。重复步 骤 3 。

5 ,当前任务由于等待资源而主动退出 cpu , 则其加入等待队列中。重复步骤 3 。

 

系统中既有分时调度,又有时 间片轮转调度和先进先出调度

 

1 , RR 调度和 FIFO 调度的进程属于实时进程,以分时调度的进程是非实时进程。

2 ,当实时进程准备就绪后,如果当前 cpu 正 在运行非实时进程,则实时进程立即抢占非实时进程。

3 , RR 进程和 FIFO 进程都采用实时优先级做为调度的权值标准, RR 是 FIFO 的一个延伸。 FIFO 时,如果两个进程的优先级一样,则这两个优先级一样的进程具体执 行哪一个是由其在队列中的未知决定的,这样导致一些不公正性 ( 优先级 是一样的,为什么要让你一直运行 ?), 如果将两个优先级一样的任务的调度策略都设为 RR, 则保证了这两个任务可以循环执行,保证了公平。

 

 

基于STM32、HAL库的WF282A气压传感器 驱动程序设计 测量范围:0-2.5MPa(可根据需求选择其他量程)输出方式:I2C或SPI数字接口。温度补偿范围:-20℃~85℃。低功耗设计,适合电池供电应用。工作电压:3.3V/5V。精度:±0.1%FS。 阅读详情

相关推荐

ADS8681数据手册没讲透的细节:SPI时序、量程切换与电压换算的避坑指南

本文深入解析ADS8681数据手册未提及的SPI时序优化、量程切换陷阱与电压校准技巧。针对树莓派5与ADS8681的SPI通信问题,提供CPOL/CPHA配置建议;详解量程切换的位操作玄机与寄存器配置流程;并提出三步校准法应对非理想供电环境,帮助开发者提升ADC测量精度。

weixin_29178069的博客 518

linux进程的调度

进程状态 进程主要有7种状态:就绪状态、运行状态、轻度睡眠、中度睡眠、深度睡眠、僵尸状态、死亡状态。它们之间状态变迁如下: 进程描述符task_struct结构体中有个成员state专门用来描述进程的状态。 就绪状态:state为TASK_RUNNING,正在运行队列中等待调度器调度。 运行状态:state为TASK_RUNNING,被调度器命中,正在处理器中运行。 轻度睡眠:称为可打断的睡眠状态。state为TASK_INTERRUPTIBLE,可以被信号打断。 中度睡眠:state为TASK_KIL

m0_65931372的博客 6407

从Mule ESB到Apache Camel:手把手教你设计一个轻量级企业集成框架的‘心脏’

本文深入探讨了从Mule ESB到Apache Camel的轻量级企业集成框架设计实践,对比了两者在协议支持、消息处理能力和部署灵活性等方面的差异。通过实际代码示例和性能优化技巧,帮助开发者构建高效的核心模块,适用于现代微服务架构下的系统集成需求。

weixin_28738165的博客 374

Linux进程调度

转自:深入理解Linux进程调度(0.4)_进程调度 城_城中之城的博客-优快云博客一、进程调度概览进程调度是操作系统最重要的内容之一,也是学习操作系统的重点和难点。关于进程本身的实现和管理请参看《深入理解Linux进程管理》。关于进程调度,我们首先就会问出一些问题,什么是进程调度,为什么要进程调度,如何进行调度。下面我们用一幅图把这些问题关联起来: 在这里插入图片描述 这张图把进程调度的所有问题和知识点都关联了起来,本文后面所有的内容都是对这张图的解释和扩展延伸,下面让我们来一一讲解。1.1 什么是调度

wmzjzwlzs的专栏 1574

以太网测试用例(光模块线缆、网卡类设备、交换类设备)

LeCroy力科网络测试相关的测试用例分享:光模块/DAC/ACC/AEC/AOC测试,网卡类产品测试/GPU/DPU/SmartNIC,交换类产品测试。涉及物理层的FEC,SKEW,Tx/Rx Taps和Layer23层的网络性能测试/吞吐量延迟抖动丢包率背靠背性能,以及RDMA带状况的网络协议分析。同步提供400G高速的以太网的损伤,提供定量,可重复的负面压力测试环境。

专注有线以太网性能测试--丹麦信雅纳网络(Xena Networks) 1991

LVGL项目内存告急?试试把中文字库放到SD卡里(基于LvglFontTool V0.5)

本文详细介绍了在LVGL嵌入式项目中如何通过将中文字库存储到SD卡来优化内存使用。针对Flash资源有限的MCU,如STM32F103,提供了基于LvglFontTool V0.5的外部字库生成与动态加载方案,适用于多字号、多语言及OTA场景,显著减少固件体积并提升显示灵活性。

weixin_33726318的博客 456

【Linux内核系列】进程调度

Linux内核之进程管理

小鱼学编程 3194

MobaXterm结合SSH密钥对安全连接阿里云ECS的实战教程

本文详细介绍了如何使用MobaXterm结合SSH密钥对安全连接阿里云ECS的实战教程。通过对比传统密码登录的风险,重点讲解了密钥对的生成与配置、阿里云控制台的密钥绑定技巧,以及MobaXterm的高级设置和故障排查方法,帮助用户实现高效、安全的远程连接。

weixin_29208327的博客 466

【操作系统】_7种进程调度算法

书中一共描述了七种进程调度算法,为了学到这几种调度算法,后边做了几道练习题。 1. 先来先服务(FCFS)调度算法 先来先服务调度算法是最简单的调度方法。其基本原则是,按照进程进入就绪队列的先后次序进行选择。对于进程调度来说,一旦一个进程得到处理机,它就一直运行下去,直到该进程完成任务或者因等待某事件而不能继续运行,才会让出处理机。先来先服务调度算法属于非剥夺方式。 从表面上看,这个方法对于所有进程都是公平的,并且一个进程的等待时间是可以预先估计的。但是从另一方面来说,这个方法并非公平,因为当一个大进程先到

weixin_43916755的博客 2万+

车载以太网:PHY(物理层)介绍

本文以TJA1101芯片为实例介绍了车载以太网PHY(物理层)组成。

kevin1499的博客 6231

芒果YOLOv1改进35:主干Backbone篇之MobileViTv3:全网首发最新 MobileViTv3 系列最强改进版本(三)|轻量化Transformer视觉转换器,简单有效地融合了本地全局

芒果YOLOv1改进35:主干Backbone篇之MobileViTv3:全网首发最新 MobileViTv3 系列最强改进版本(三)|轻量化Transformer视觉转换器,简单有效地融合了本地全局

包括YOLOv5、YOLOv7、YOLOv8等模型改进 414

linux进程调度方法,Linux系统进程调度

主要参考:Linux manual page - sched概述自从linux内核2.6.23以来,默认的进程调度器就被设置为完全公平调度器(CFS,complete fair scheduler),取代了之前的O(1)调度器。每个线程都有一个静态调度优先级,即sched_priority字段。一个线程的调度策略决定了线程会被插入到同级静态优先级的线程队列的位置,以及它在队列中会怎样移动。所有的调...

weixin_39889642的博客 400

【100%通过率】2023华为od机试C卷【围棋的气】Python 实现

围棋棋盘由纵横各19条线垂直相交组成,棋盘上一共19 x 19 = 361 个交点,对奔双方一方执白棋,一方执黑棋,落子时只能将棋子置于交点上。 “气”是围棋中很重要的一个概念,某个棋子有几口气,是指其上下左右方向四个相邻的交叉点中,有几个交叉点没有棋子,由此可知:

MISAYAONE的博客 1857

linux进程调度方法简述

在 Linux2.6 中,仍有三种调度策略: SCHED_OTHER、SCHED_FIFO 和 SCHED_RR。   SCHED_ORHER:普通进程,基于优先级进行调度。   SCHED_FIFO:实时进程,实现一种简单的先进先出的调度算法。   SCHED_RR:实时进程,基于时间片的SCHED_FIFO,实时轮流调度算法。     前者是普通进程调度策略,后两者都是实时进程调度策略

laoniu_c的专栏 1329

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Linux中的进程调度方法简介

实时调度算法介绍  对于什么是实时系统,POSIX 1003.b作了这样的定义:指系统能够在限定的响应时间内提供所需水平的服务。而一个由Donald Gillies提出的更加为大家接受的定义是:一个实时系统是指计算的正确性不仅取决于程序的逻辑正确性,也取决于结果产生的时间,如果系统的时间约束条件得不到满足,将会发生系统出错。实时系统根据其对于实时性要求的不同,可以分为软实时和硬实时两种类型。硬实

lishitao_578的博客 924

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

操作系统 linux 内核的三种进程调度方法

1,SCHED_OTHER 分时调度策略; 2,SCHED_FIFO 实时调度策略,先到先服务; 3,SCHED_RR 实时调度策略,时间片轮转 。         实时进程将得到优先调用,实时进程根据实时优先级决定调度权值,分时进程则通过nice和counter值决定权值,nice越小,counter越大,被调度的概率越大,也就是曾经使用了 cpu 最少的进程将会得到优先调度。

稚枭天卓 2925

深度学习工具包 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进程调度方法(SCHED_OTHER,SCHED_FIFO,SCHED_RR)

转自:http://www.linuxdriver.cn/html/200712/387.htmlinux进程调度方法(SCHED_OTHER,SCHED_FIFO,SCHED_RR) linux内核的三种调度方法:1,SCHED_OTHER 分时调度策略,2,SCHED_FIFO实时调度策略,先到先服务3,SCHED_RR实时调度策略,时间片轮转 linux内核的三种调度方法:1,SCHED

loyal_baby的专栏 5259

Linux进程调度响应时间测试方法

目录Linux进程调度响应时间测试方法 Linux进程调度响应时间测试方法 环境:虚拟机Ubuntu18.04 内核版本:5.6.19 参考:linux内核添加模块

weixin_43739110的博客 1705

linux进程调度方法SCHED_OTHER,SCHED_FIFO,SCHED_RR

linux进程调度方法(SCHED_OTHER,SCHED_FIFO,SCHED_RR)linux内核的三种调度方法:1,SCHED_OTHER 分时调度策略,2,SCHED_FIFO实时调度策略,先到先服务3,SCHED_RR实时调度策略,时间片轮转linux内核的三种调度方法:1,SCHED_OTHER 分时调度策略,2,SCHED_FIFO实时调度策略,先到先服务3,SCHE

flyingqr的专栏 830
上一篇: Linux 进程调度原理
下一篇: TCP的建立和拆除
wunderup
博客等级 码龄20年 13粉丝 79原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值