页面置换算法 【美团暑期实习一面】

OS之页面置换算法 之前几篇博客记录了OS内存管理的一些知识和技术,接下来将继续深入,介绍一些页面置换算法,这里包括一些我们大家都略有耳闻的算法。 置换算法 当出现缺页故障时,需要从外存调入新的页面到内存中去,而如果此时内存已满,于是就要按照一定策略置换一些物理页帧出来,这就是置换算法的目的。而置换算法的目标就是尽量减少页面的调入调出次数 页面置换算法主要可分为两大类: 局部页面置换算法 置换页面的选择范围仅限于... 阅读详情

简单回顾下虚拟内存技术,基于局部性原理来实现,总结起来就是两句话:

  1. 在程序执行过程中,当 CPU 所需要的信息不在内存中的时候,由操作系统负责将所需信息从外存(磁盘)调入内存,然后继续执行程序
  2. 如果调入内存的时候内存空间不够,由操作系统负责将内存中暂时用不到的信息换出到外存

整个请求调页的过程大概是这样的:

那么,到底哪些页面该被从内存中换出来,哪些页面又该被从磁盘中调入内存呢?

这就是『页面置换算法』干的事儿。

考虑这样一种情况:刚刚从内存中换出到磁盘的页面马上又要被重新换入到内存中,刚刚从磁盘中换入到内存的页面马上就要被换出来。这种频繁的页面调度行为称为抖动。这是页面置换过程中一种最糟糕的情形。

所以,一个好的页面置换算法应有较低的页面更换频率,也就是说,应将『以后不会再访问或者以后较长时间内不会再访问的页面』先调出。

常见的置换算法有以下五种:

  1. 最佳(Optimal, OPT)页面置换算法
  2. 先进先出(First-In First-Out, FIFO)页面置换算法
  3. 最近最久未使用(Least Recently Used, LRU)页面置换算法
  4. 时钟(CLOCK)页面置换算法
  5. 最少使用(Least Frequently Used, LFU)页面置换算法

最佳(Optimal, OPT)页面置换算法

最佳置换算法所选择的被淘汰页面将是以后永不使用的,或者是在最长时间内不再被访问的页面,这样可以保证获得最低的缺页率。

假定系统为某进程分配了三个物理块,并假设先后访问了以下这些页面号:

7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 2, 1, 2, 0, 1, 7, 0, 1

1)进程运行时,先将 7, 0, 1 三个页面依次装入内存(下图中的**『缺页』表示内存中没有该页面,需要从磁盘中调入**)

2)进程要访问页面 2 时,页面 2 不在内存中,需要从磁盘中装入内存,但是此时内存不够了,于是产生缺页中断。根据最佳置换算法,选择第 18 次访问才需调入的页面 7 予以淘汰(最长时间内不再被访问的页面)

 

3)然后,访问页面 0 时,因为已在内存中所以不必产生缺页中断。访问页面 3 时又会根据最佳置换算法将页面 1 淘汰

4)......

依此类推,釆用最佳置换算法时的情况如下图所示,可以看到,发生缺页中断的次数为 9,页面置换的次数为 6(图中 【】 标识的即为发生了页面置换)

这个算法的问题就是,谁能提前预知进程在内存下的若千页面中哪个是未来最长时间内不再被访问的?我自己都不知道我接下来会干什么你一个程序都能知道了?

所以这算法目前也就是说说而已,一个理想情况,当前无法实现。现阶段呢咱们可以用最佳置换算法的结果来评价其他算法。

先进先出(First-In First-Out, FIFO)页面置换算法

优先淘汰最早进入内存的页面,亦即在内存中驻留时间最久的页面。

该算法实现简单,只需把调入内存的页面根据先后次序链接成队列,设置一个指针总指向最早的页面。但该算法与进程实际运行时的规律不适应,因为在进程中,有的页面经常被访问。

还是上面的例子:

  • 进程访问页面 2 时,把最早进入内存的页面 7 换出
  • 然后访问页面 3 时,再把 2, 0, 1 中最先进入内存的页 0 换出
  • .......

利用 FIFO 置换算法时的置换图如下,可以看出,利用 FIFO 算法时进行了 12 次页面置换,比最佳置换算法正好多一倍。

FIFO 算法还会产生当所分配的物理块数增大而缺页次数不减反增的异常现象,这是由 Belady 于 1969 年发现,故称为 Belady 异常,如下图所示:

页面访问顺序为 1、2、3、4、1、2、5、1、2、3、4、5。当分配的物理块为 3 个时,缺页次数为 9 次;而当分配的物理块增加为 4 个时,缺页次数反而增加到了 10 次

最近最久未使用(Least Recently Used, LRU)页面置换算法

选择最近最长时间未访问过的页面予以淘汰,它认为过去一段时间内未访问过的页面,在最近的将来可能也不会被访问。

和 OPT 算法相比,LRU 算法根据各页以前的情况,是 “向前看” 的,而 OOT 算法则根据各页以后的使用情况,是 “向后看” 的。

对上面的实例釆用 LRU 算法进行页面置换,如下图所示:

  • 进程第一次对页面 2 访问时,内存已满,包含 7、0、1 三个页面,将最近最久未被访问的页面 7 置换出去
  • 然后访问页面 3 时,内存已满,包含 2、0、1 三个页面,将最近最久未使用的页面 1 换出
  • ......

OPT 算法向前看是无法实现了,那 LRU 这个向后看的算法具体该怎么实现呢?换句话说,这个过去一段时间内最久未被访问过的页面,操作系统是如何找出来的呢?

此处参考百度百科:https://baike.baidu.com/item/LRU

LRU 的具体实现需要有两类硬件之一的支持:寄存器或栈,这两种硬件也就对应着两种不同的方法:

方法一(使用寄存器):

为了记录某进程在内存中各页的使用情况,须为每个在内存中的页面配置一个移位寄存器,可表示为

 

当进程访问某物理块时,要将相应寄存器的 Rn−1​ 位置成 1,随后,定时信号将每隔一定时间 (例如 100 ms) 将寄存器右移一位。

举个例子,假设内存中有 8 个物理块,能够装 8 个页面,假设这 8 个内存页面的序号分别定为 1~8,操作系统需要为每个内存页面配置一个 8 位寄存器 ​,初始化为 0000 0000

 

  • 假设某个进程访问了页面 2,那么就把 Rn−1​ 即 R1 寄存器的值设置为 1,得到 0000 0010
  • 随后一段时间内,如果页面 2 没被访问,那么定时信号会将寄存器右移一位 0000 0001
  • 如果随后页面 2 又被访问了,那么寄存器的值就会由 0000 0001 变成 0000 0011

所以如果某个页面最近一段时间一直不再被访问,那么这个页面对应的寄存器的值就会越来越小,具有最小数值的寄存器所对应的页面,就是最近最久未使用的页面。

看下面这张图,第 3 个内存页面的 R 值 0000 0100 最小,当发生缺页时,首先将它置换出去。

 

 

方法二(使用栈):

还可以利用一个特殊的栈来保存当前使用的各个页面的页面号。每当进程访问某页面时,便将该页面的页面号从栈中移出,将它压入栈顶。因此,栈顶始终是最新被访问页面的编号,而栈底则是最近最久未使用页面的页面号。假定现有一进程所访问的页面的页面号序列为:

4,7,0,7,1,0,1,2,1,2,6

随着进程的访问, 栈中页面号的变化情况如下图所示。 在访问页面 6 时发生了缺页,此时页面 4 是最近最久未被访问的页,应将它置换出去

总结下,LRU 性能较好,但实现起来较为困难,需要寄存器和栈的硬件支持 ,属于堆栈类的算法,开销较大

时钟(CLOCK)置换算法

对比下上面 3 种页面置换算法:OPT、FIFO 和 LRU

  • OPT 算法性能(效果)最好,但无法实现
  • FIFO 算法实现简单,但性能差
  • LRU 算法的性能接近于 OPT,但是实现起来比较困难,且开销大

所以操作系统的设计者尝试了很多算法,试图用比较小的开销接近 LRU 的性能,这类算法都是 CLOCK 算法的变体

简单的 CLOCK 算法

回顾下请求分页管理的页表:

其中:

  • 状态位:该页面是否已调入内存(0 表示不在内存中,访问该页面会引起缺页中断;1 表示已在内存中)
  • 访问位(也称为参考位/引用位,referenced bit,简写 R):该页面是否被访问过(0 表示被访问过;1 表示未被访问过),不论是读还是写,操作系统都会在该页面被访问时将其访问位设为 1
  • 修改位(modified bit,简写 M):该页面调入内存后是否被修改过(0 表示未被修改过;1 表示已经被修改过,被修改过的页面必须被写回磁盘)
  • 外存地址:该页面在外存中的存放地址(通常是物理块号,供调入该页时使用)

简单的 CLOCK 算法就和这个『访问位』息息相关,也有书中称之为『使用位』(use bit)

所谓简单的 CLOCK 算法到底有多简单,其实就是尽可能地淘汰掉未被访问过的页面,如下。

将内存中的页面都链接成一个『循环队列』:

1)当某页被访问时,其访问位置为 1

2)当需要从内存中换出一个页面时,只需遍历这个循环队列,依次检查页的访问位:

  • 如果是 0,就选择该页换出
  • 如果是 1,则将它置为 0,暂不换出,继续检查下一个页面

由于该算法循环地遍历检查各页面的情况,所以就形象地被称为 CLOCK 算法

另外,

  • 如果在遍历过程开始时,缓冲区中所有页面的访问位均为 0,则选择遇到的第一个页面替换
  • 如果所有页面的访问位均为 1,则指针会在循环队列中完整地循环一周,把所有使用位都置为 0,并且停留在最初的位置上,替换该页面

改进型的 CLOCK 算法

上述只使用了『访问位』的简单的 CLOCK 算法的性能比较接近 LRU,我们还可以进一步地通过『修改位』使得 CLOCK 算法更加高效。

这样,每一个页面都处于以下四种情况之一:

第 0 类:未被访问,未被修改 (Referenced bit = 0,Modified bit = 0)(最佳替换页面)

第 1 类:未被访问,被修改 (Referenced bit = 0,Modified bit = 1)(第二考虑的替换页面)

第 2 类:被访问,未被修改 (Referenced bit = 1,Modified bit = 0)(该页面可能再次被访问)

第 3 类:被访问,被修改 (Referenced bit = 1,Modified bit = 1)(该页面很有可能再次被访问)

其实

可能有小伙伴会困惑怎么会有第 1 类 “未被访问,被修改 (Referenced bit = 0,Modified bit = 1)” 这种情况,其实是这样的,一个第 3 类 “被访问,被修改 (Referenced bit = 1,Modified bit = 1)” 的页面在它的 Referenced bit 位被时钟中断清零后就成了第 1 类。时钟中断不会清除 Modified bit,因为一个被修改过的页面是需要被写回磁盘的,这就需要 Modified bit 这个信息。

改进型的 CLOCK 算法步骤如下:

1)从指针的当前位置开始,扫描循环队列。在这次扫描过程中,对访问位不做任何修改。选择遇到的第一个是第 0 类 “未被访问,未被修改 (Referenced bit = 0,Modified bit = 0)” 的页面用于替换

2)如果第 1) 步失败,则重新扫描,查找第一个是第 1 类 “未被访问,被修改 (Referenced bit = 0,Modified bit = 1)” 的页面用于替换。在这次扫描过程中,对每个跳过的页面,和简单的 CLOCK 算法一样,把它的访问位设置成 0

3)如果第 2) 步失败,指针将回到它的最初位置,并且集合中所有页面的访问位都已经被设置为 0 了。重复第 1 步,并且如果有必要,重复第 2 步。这样一定可以找到供替换的页面。

流程图如下:

总结起来也很简单,简单 CLOCK 算法不就是尽可能地淘汰掉未被访问过的页面嘛,那改进的 CLOCK 算法就是在此基础上,对未被访问过的页面进一步细分,修改过和未被修改过,优先替换『未被修改过的页面』。因为修改过的页在被替换之前必须写回,因而这样做会节省时间。

最少使用(Least Frequently Used, LFU)页面置换算法

LFU 核心思想就是对每个页面设置一个访问计数器,每当一个页面被访问时,该页面的访问计数器就累加 1。在发生缺页中断时,淘汰计数器值最小的那个页面。

看起来很简单,但是操作系统为此需要为每个页面设定一个『计数寄存器』,显然成本是非常高的。

另外还有个问题,就是有些页在开始时使用次数很多,但最近一段时间就没有使用过了,这类页面由于计数较大,会长时间留在内存中。而当前频繁访问的页面由于没有这些页面总共访问的次数高,在发生缺页中断时,就可能会被淘汰掉

因此可以参考 LRU 的做法,定时将引用计数寄存器右移一位,形成指数衰减的平均使用次数,也就说,随着时间的增加,以前的高访问次数的页面的计数寄存器对应的值会慢慢减少,相当于加大了被淘汰的概率

 

  作者:飞天小牛肉
链接:https://leetcode.cn/circle/discuss/Tt24Uk/

 

 

 

 

页面置换算法要点和难点实际应用 OrderedDict保持了元素被插入时的顺序,因此我们可以将最近访问的页面移到字典的开头,并在需要时淘汰末尾的页面。当需要替换页面时,算法会遍历链表,查找第一个引用位为0的页面进行替换。算法优化:如何在保持算法有效性的同时降低其实现开销和复杂度,提高系统的整体性能,是页面置换算法研究的重要方向之一。核心目标:页面置换算法的核心目标是在发生缺页中断时,选择适当的页面从内存中移出,以便为即将调入的页面腾出空间。OPT算法:由于需要预知未来的页面访问序列,所以实际上无法实现,只能作为其他算法的评价基准。 阅读详情

相关推荐

《操作系统 - 清华大学》6 -3:局部页面置换算法:最近最久未使用算法 (LRU, Least Recently Used)

局部页面置换算法:最近最久未使用算法 (LRU, Least Recently Used)

weixin_44399845的博客 2349

操作系统-最近最久未使用置换算法

思想:赋予每个页面一个访问字段,用来记录相应页面自上次被访问以来所经历的时间t,当淘汰一个页面时,应选择所有页面中其t值最大的页面,即内存中最近一段时间内最长时间未被使用的页面予以淘汰 优点:由于考虑程序访问的时间局部性,一般能有较好的性能,实际应用多 缺点:实现需要较多的硬件支持,会增加硬件成本 LRU的硬件支持-栈:可利用一个特殊的栈来保存当前使用的各个页面的页面号。每当进程访问某页面时,便将该页面的页面号从栈中移出,将它再压入栈顶。即栈顶始终是最新被访问页面的编号,而栈底则是最近最久未使用页面的

qq_51781828的博客 9005

面经分享:看非科班研究生如何转行斩获 ATM 大厂的 Offer ?(附干货分享)

前言 先介绍一下自己的情况吧,本科和研究生都是通信专业,本科是某 Top2,研究生是香港某大学。了解了通信行业的就业情况和工作内容后,大概今年3月份的时候开始想转互联网。 本人相关的基础情况是:学校学了C++、数据结构与算法以及计算机网络,做大作业和毕业设计用的 python,毕业设计有接触机器学习。 当时是投递暑期实习,没有什么经验,以刷 LeetCode、复习计算机网络和看面经为主,最终面试的情况是: 字节视频架构实习3面挂 阿里蚂蚁金服交叉面挂 腾讯TEG实习offer 因为参加过春招,所以我对秋

再下秃头,有何贵干的博客 2802

页面置换算法

页面置换算法

weixin_43743711的博客 1158

别玩了!你上真不行!大三双非一本,六面字节跳动艰难拿下Offer

本人就读某不知名双非一本,大三,软件工程, java,非acmer,普普通通的大学生 自3.25开始准备面试,时间紧迫,基础一般,幸得运气良好,最终也进了字节头条的后端开发进行暑期实习。 项目有三个,比较杂:微信小程序(未上线)、数据处理工具(C++)、android 写的类似pokemonGo的游戏 笔试 & 面试情况: 美团优选 : 倒在了笔试的槛 (2 / 5). 腾讯csig : 人生首次面试,一二面通过,复试挂(后来被捞了俩次的kpi面) 京东 :笔试很简单,没筛选力...

kxkxyzyz的博客 1111

夸克缓存视频合并小工具

原理 使用windows的命令行的copy命令来合并 copy /b 0+1+2+3 new.ts 分析缓存目录结构,发现都是一个m3u8文件带一个同名文件夹 所以分析m3u8并把原来的路径换成这个缓存文件夹路径并按顺序合并即可。 其中碰到的难点是Qprocess在windows不好使,索性直接存成.bat批处理文件再执行 还有就是中文问题,具体在代码里都说了。 代码 (环境Qt5.7.0) 这是mainwindow.h #ifndef MAINWINDOW_H #defin.

natural_Caduceus 1万+

震撼来袭!腾讯,美团,阿里春招面试总结,本人已拿到阿里P6岗offer!

前言 一直混迹于平台,看各种总结、面经和学习路线,收获很多,面经虽然不多,也算回报平台了。 教训:早点投简历 一、腾讯暑期实习提前批 1、腾讯PCG客户端实习一面(1.5h) 日期:2021/4/1 面呗面试 TCP的三次握手,为什么不能是两次握手 TCP的四次挥手,为什么time-wait是2MSL HTTPS,关于SSL的握手 如果第一次客户端的数据被截获 GET和POST的区别 HTTP的请求方法 依赖注入 进程和线程的区别 页面置换算法 堆和栈的区别 能不能自己申请一块栈的空间 二叉搜索树、平衡二叉

欢迎您访问我的公众号【前程有光】 1284

CCD 技术介绍(基于innovus引擎CCOpt)

CCD:全称是,并行优化clock和data path。CCOpt:全称是Clock的timing分为两种模式,和。preCTS并没有clock,因此需要建立一个,从clock端口到寄存器CK端的来自sdc中的设置;postCTSupdateIO latency,clock就会自动的转换成propagatedclock,这时就是实际时钟互连线网络的delay。在实际设计中,clock起始于ideal。

m0_61003348的博客 8975

看完他的经历,我自愧不如!985非科班的学弟是如何靠自己转行Java程序员-并斩获大厂Offer的?

当时是投递暑期实习,没有什么经验,以刷 LeetCode、复习计算机网络和看面经为主,最终面试的情况是:字节视频架构实习3面挂阿里蚂蚁金服交叉面挂腾讯TEG实习offer因为参加过春招,所以我对秋招的时间点很敏感:6月中旬阿里巴巴和字节跳动开启提前批7月中阿里开启正式秋招8月初腾讯开启秋招9月基本都是Hr面和谈offer了牛客网上看到很多人8月底才开始投递,在那边抱怨为什么很久没有面试,这是因为时间安排上出了问题。所以想去什么公司,就要尽早做好准备,关注对应的招聘公众号和牛客网信息。下面,我将按照如下提纲来

2401_83411843的博客 381

Windows 10/11 安装 HYSPLIT 气象模型全攻略(附必备工具包下载清单)

本文提供了一份详尽的Windows 10/11系统下HYSPLIT气象模型安装与配置全攻略。指南涵盖了从核心认知、必备工具包(Tcl/Tk、ImageMagick)下载,到分步安装、环境变量设置及首次运行验证的完整流程,旨在帮助研究者和学生高效部署这一用于大气轨迹模拟与污染物扩散分析的专业工具。

weixin_28335283的博客 608

深入解析TOM模块的PWM输出与ADC触发机制:从配置到DMA数据传输

本文深入解析了TOM模块在嵌入式系统中的核心应用,详细阐述了如何配置其PWM输出功能,并实现与ADC模块的硬件触发同步。重点介绍了通过DMA机制高效传输ADC采样数据的完整流程,涵盖时钟配置、工作模式选择、引脚映射及联调实战,为电机控制、数字电源等实时系统提供了一套硬件自动化的高效解决方案。

weixin_29227585的博客 367

安卓系统面经_安卓面经(13/20)SELinux框架超解析

没有去上海蔚来智能座舱部门的牛友,最近到了定offer的时候,这个能不能去,值不值得去。北京东坝地区招主播,文玩类,不露脸,要求手部无纹身,口齿伶俐,男女不限。#23届找工作求助阵地#更新一下动态,三月份到处奔波之后找到了一份工作,在某家上市公司做软件研发,因为太久没学,感觉一切都是。从三月份到现在老子该吃的苦都吃烂了,字节面了三个岗位都挂,快手面了三个岗位都挂,老子好不容易开始拿o。就是做一些小的电子产。之前报的二批,还去线下参加笔试了,昨晚收到短信了,看网上说最后要的都是研究生😢 我双非23届本感觉。

每天多一点干货 808

Ubuntu HackRF One、GNU Radio、Gqrx相关环境搭建

本文介绍Ubuntu HackRF One、GNU Radio、Gqrx相关环境搭建方法。

无线通信实验室 1万+

最近最久未使用页面置换算法

在一个请求分页系统中,采用最近最久未使用页面置换算法时,假如一个作业的页面走向为4、3、2、1、4、3、5、4、3、2、1、5,当分配给该作业的物理块数M分别为3和4时,试计算在访问过程中所发生的缺页次数和缺页率。请给出分析过程。 解析:所谓的最近最久未使用(LRU Least Recently Used)页面置换算法就是说 所淘汰的页面将是最近最久未使用的页面,只需要向前(左)看即可,谁最远淘汰谁。 缺页次数:发生缺页中断的次数 缺页率:发生缺页次数/总共的页面数 物理块数为3时: 4 3 2 1

beyond谚语的博客 1万+

我的AI学习 ai维护工具之langfuse

as_type: Optional[Literal[‘generation’]] = None, # 将记录定义为 Observation (LLM 调用)transform_to_string: Optional[Callable[[Iterable], str]] = None # 将输出转为 string。要用LangFuse的云服务,首先要在LangFuse官网上注册,注册完后将页面拉倒最后,点免费的SignUp,API文档:https://api.reference.langfuse.com/

liubaobin的博客 4095

ABAP CURR Data Type 深度解析与实战案例

CURR 数据类型是 SAP ABAP 中为处理货币金额而设计的一种特殊数据类型。CURR 数据类型能够自动根据关联的货币代码字段(例如 WAERS)确定小数位数,从而保证金额数据的精度与正确性。CURR 类型通常在 SAP 数据字典中使用,常见于各类业务数据表中,如会计凭证、销售订单等场景中,用于存储货币金额。CURR 数据类型底层实现上类似于 DEC 数据类型,但其特别之处在于与货币代码字段的绑定,这使得金额的格式化和显示可以自动匹配相应的货币规则。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 877

几种页面置换算法

地址映射过程中,若在页面中发现所要访问的页面不再内存中,则产生缺页中断。当发生缺页中断时操作系统必须在内存选择一个页面将其移出内存,以便为即将调入的页面让出空间。而用来选择淘汰哪一页的规则叫做页面置换算法。常见的置换算法有: 1)最佳置换算法(OPT)(理想置换算法) 这是一

wangsifu2009的专栏 4万+

具身智能 | 从具身智能出发谈多传感器融合技术

多传感器融合感知是具身智能系统突破“感知—认知—行动”闭环的核心使能技术。本文从具身智能的视角出发,对多传感器融合技术进行系统综述。首先阐述了具身智能对多传感器融合提出的独特需求,包括异构感知集成、跨模态语义对齐和实时闭环决策。其次,构建了多层级融合技术分类框架,从数据层融合、特征层融合、决策层融合、时序融合到多模态大语言模型(MLLM)融合,逐层梳理主流方法与演进脉络。在此基础上,分析了面向具身智能的通用融合架构设计,涵盖了感知—推理—执行三层架构及其关键组件。

尘世冰封的专栏 310

最近最久未使用页面置换算法(C语言)——大三操作系统实验

最近最久未使用页面置换算法:最近未访问的页面,将来一段时间也不会访问。利用局部性原理,根据一个进程在执行过程中过去的页面访问踪迹来推测未来的行为。最近的过去 → 最近的将来 思想:选择最近最久未使用的页面予以淘汰。利用页表中的访问字段,记录页面自上次被访问以来所经历的时间t,需要淘汰页面时,选择在内存页面中t值最大的,即最近最久未使用的页面予以淘汰。

weixin_58628068的博客 3796

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

上一篇: leetcode 110. 平衡二叉树 balanced binary tree
下一篇: leetcode 875. 爱吃香蕉的珂珂 koko eating bananas
wwwarewow
博客等级 码龄17年 4795粉丝 167原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wwwarewow

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值