操作系统(2)[上]:进程、线程、调度

1 进程与线程

1.1 进程的概念、组成、特征

1. 进程的概念


 ① 进程是什么 ?

​ 答:进程是 进程实体 的运行过程,是系统进行 资源分配和调度 的一个独立单位;

​ 其中,进程实体 (进程映像) 包括:PCB + 程序段 + 数据段 三部分;

在这里插入图片描述

可执行文件:指令的集合!

2. 进程的组成

​ 进程的组成部分:PCB - 进程控制块 、程序段、数据段;

  • 创建进程 的本质是 创建进程实体的 PCB ;
  • 撤消进程 的实质是 撤消进程实体的 PCB ;

在这里插入图片描述

PID肯定是不重复的!

PCB进程存在的唯一标志!

在这里插入图片描述

【问题】程序是如何运行的 ?

在这里插入图片描述

程序编译流程如下:

  • 编译:把 源程序(高级语言) 翻译成 目标程序(机器语言);
  • 连接:将目标文件 连接成 可执行文件;
  • 装入 - 执行;

​ 很重要的一句话:进程实体 反应了 进程在 动态执行 的 某一时刻状态 (进程实体静态,进程动态);

在这里插入图片描述

在进程运行的过程中 进程实体是不断的发生变化的!

​ 进程的三大组成部分:PCB + 程序段 + 数据段;

​ 进程的定义:进程 是进程实体的 运行过程 , 是系统进程 资源分配 和 调度 的一个独立单位;

​ 进程调度 ,就是指 让哪个进程在CPU上运行;

在这里插入图片描述

PCB给操作系统使用的,程序段和数据段是给自己使用的!

进程是进程实体的运行过程 是系统进行资源分配和调度的独立单位!

3. 进程的特征

在这里插入图片描述

但是需要进程之间相互配合 这样就有了“进程同步”!

小结

​ 本节的知识点就三部分:进程的 概念、组成、特征 ;

在这里插入图片描述

在引入线程 之后 进程就不是独立调度的基本单位了,但是还是独立获得资源的基本单位 !!

1.2 进程的状态与转换

在这里插入图片描述

1. 进程的状态

① 创建态 +  ② 就绪态

​ 创建状态的步骤:

  • 申请空白PCB;
  • 向空白PCB中填写相关信息;
  • 为该进程分配 除CPU以外 必要的资源;

​ 已就绪的进程会在 就绪队列 按照 优先级策略 排队,等待CPU ;

在这里插入图片描述

将可执行文件调入内存 然后操作系统会给进程创建一个PCB

③ 运行 (Running) 态

​ 进程在CPU上运行;

在这里插入图片描述

④ 阻塞态

​ 阻塞(Block)状态 = 等待状态 = 封锁状态;

​ 进程因某一事件暂停运行,即使CPU空闲也不能执行。阻塞的进程会在 阻塞队列 里排队等待;

​ 注意!就绪态仅缺CPU,而阻塞态缺其它资源 (除了CPU) 或等待某一事件;

在这里插入图片描述

⑤ 终止态

在这里插入图片描述

下cpu回收资源 

2. 进程状态的转换

​ P42里引入了 挂起、激活原语 之后的进程状态转换,课程 2.2.1 调度的概念 里简单提了提,保险起见去课本里看看;

​ 注意!一个进程,运行 -> 阻塞 是主动的行为,阻塞 -> 就绪 是被动的行为,需要协助;

三个基础状态CPU 资源其它资源
就绪态×
运行态
阻塞态××

在这里插入图片描述

在这里插入图片描述

运行到阻塞是主动选择的!!阻塞到就绪是被动的【比如缺少打印机 但是打印机资源的分配进程说了不算 因此什么时候结束堵塞也不是进程本身能决定的!】

运行态也可以到就绪态!

小结

在这里插入图片描述

多个程序处于运行态 说明 这些程序是并行的!

在这里插入图片描述

1.3 进程的组织方式

为了对同一状态下的各个进程进行统一的管理,操作系统会将各个进程的PCB组织起来!

为了对同一状态下的各个进程进行统一的管理,操作系统会将各个进程的PCB组织起来!

组织方式:

  • 线性方式
  • 链接方式
  • 索引方式

1. 进程的组织方式 - 链接方式

​ 链接方式:将同一状态的PCB链接成一个队列;

在这里插入图片描述

2. 进程的组织方式 - 索引方式

​ 索引方式:将同一状态的进程组织在一个索引表中,索引表的表项指向相应的PCB;

在这里插入图片描述

大多数的操作系统使用的是链式存储的方式!

小结

在这里插入图片描述

操作系统怎么把处于同一状态的进程组织起来的问题!

1.4 进程控制

在这里插入图片描述

1. 进程控制的基本概念

① 什么是进程控制 ?

​ 进程控制的主要功能是对系统中的所有进程实施有效的管理,具有创建新进程、撤销已有进程、实现进程转台转换等功能 包含功能:

  • 进程的创建
  • 进程的终止
  • 进程的阻塞
  • 进程的唤醒
  • 进程状态的切换

简单的来说 进程控制就是实现进程状态的转换!

在这里插入图片描述

② 如何实现进程控制 ?

​ 使用 原语 实现进程控制,原语操作具有原子性,不可中断;

​ 通俗理解,把原语理解成一段封装好的功能函数,只不过具有原子性;

在这里插入图片描述

​ 思考:为什么进程控制的过程要 “一气呵成” ?

​ 下图中举例说明

在这里插入图片描述

【问题】如何实现原语的 “原子性” ?

​ 答:使用 关中断指令 和 开中断指令 这两个 特权指令 实现 原子性

在这里插入图片描述

在这里插入图片描述

当关中断指令开开的时候 运行到指令a是收到外部中断信号的时候先不管!

思考:如果在用户态就意味着我可以在我程序的开头就植入关中断指令 这样我的程序就会一直霸占CPU不会下来了!!!

2. 进程相关的原语

​ 各类原语的操作步骤,不需要死记硬背,只需要理解即可,不会让你默写;

① 进程的创建

​ 这里第一次遇到 作业调度 这个名词,解释一下。

作业 就是放在外存,还没有被运行的程序。作业调度就是 在外存中挑选一个程序放入内存让他运行!

在这里插入图片描述

② 进程的终止

在这里插入图片描述

进程自己请求终止:exit原语!

③ 进程的阻塞和唤醒

​ 保护进程运行现场( 重点内容,后面在填坑);

在这里插入图片描述

④ 进程的切换

​ 恢复进程运行环境信息( 重点内容,后面在填坑)

在这里插入图片描述

切换:此时处于运行态的下处理机 然后选一个在就绪态的上处理机!

​ 接下来举例介绍 运行环境信息

​ 学习完 ==进程控制相关的原语,==再来看看之前的问题:程序是如何运行的 ?

在这里插入图片描述

​ CPU里设置了很多 ==寄存器,==存储各类程序运行时需要的数据

在这里插入图片描述

PSW 处于 内核态还是用户态!

下面这个指令:定义了一个x的变量 并且实现了x++的操作!

在这里插入图片描述

PC 和IR是同时更新的!通用寄存器 放数

​ 很多的中间计算结果是暂时放在各类寄存器中

​ 例如执行指令3时,x=2,但此时它还没有被写回内存,执行完指令4,内存中的x才变成2;

​ 如果执行完指令3,另一个进程上CPU,他将通用寄存器里的数据改为250,切换回原来的进程,不就数据错误了?

在这里插入图片描述

​ 解决办法:在进程切换时先在PCB中保持这个进程的 ==运行环境,==进程重新运行时,通过PCB恢复当时的运行环境;

在这里插入图片描述

这样 就可以接着上次继续运行了

当指令4运行完之后 2写入内存!x++才真正完成了!

所以:进程环境信息就是 进程在运行的过程中 寄存器里存储的中间结果。

因此:保存运行环境和恢复运行环境是 进程可以并发执行的关键技术!!!!

小结

在这里插入图片描述

在这里插入图片描述

进程的创建和回收可能要用到3!

在这里插入图片描述

1.5 进程的通信(IPC)

在这里插入图片描述

【问题】什么是进程间通信 ?

​ 答:进程通信是指进程之间的数据交互!;

在这里插入图片描述

进程的通信需要 操作系统的支持!

【问题】为什么进程通信需要操作系统支持 ?

​ 答:为了进程安全;

在这里插入图片描述

进程p不可以访问进程Q的空间 出于安全的考虑!如果可以的话,就可以随意的修改其他进程的数据!

所以就是因为 进程不可以直接访问其他进程的空间 因此 需要有操作系统的支持才可以实现进程之间的通信 !

一共有三种进程通信的方式:共享存储、消息传递、管道通信。

1. 共享存储

​ 在共享存储器系统中,相互通信的进程 共享某些数据结构 

或 ==共享存储区,==进程之间能够通过 这些空间进行通信;

在这里插入图片描述

如果不是互斥的都往里写就会 出现数据的覆盖。互斥:PV操作

共享存储的两种类型:

  • 低级共享,基于 数据结构 的共享,速度慢、灵活性差;
  • 高级共享,基于 存储区 的共享,速度快、灵活性好;

在这里插入图片描述

基于存储器的共享 灵活性特别高!基于数据结构:可以理解为是一个特殊的 全局变量!(如果写代码的时候全局变量是局部与某一个进程的,但是这里的全局变量是可以被各个进程所共享的!!!)灵活性低 限制多 速度慢!

2. 消息传递

​ 在 信息传递机制 中,进程不必借助任何共享存储区或数据结构,而是以 格式化的信息 为单位,将通信的数据封装在信息中,并利用操作系统提供的一组 通信命令(原语)【发送消息和接受消息】,在进程间进行信息传递,完成进程间的数据交换;

​ 说白了,就是通过 写信 进行交流;

在这里插入图片描述

格式化的消息!

进程的 PID

① 直接通信方式:点名道姓的星信息传递

  • 进程P按要求准备好要发送的信息;【准备好msg(相当于一个赋值的过程!)】[msg里指明 接受进程的ID...]
  • 通过发送原语【send(msg,Q)】,将信息[msg]复制一份 放进 进程Q的消息队列里;
  • 进程Q【recieve(P,&msg)】 从消息队列找到P发来的msg;
  • 然后操作系统复制msg到Q中

操作系统的内核区 保存着各个进程的PCD(进程控制块!)【是由操作系统管理的数据结构!】

进程Q的消息队列:其他进程发给进程Q应该被进程Q接受的这些消息!

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

② 间接通信方式,又称为信息通信方式

​ 间接通信方式,进程P只是指明要发信息给信箱A,没有指明发给哪一个进程;

P通过系统调用 在内核申请一个 信箱A【也可以申请多个信箱!】

没有指明哪一个进程 只给明去哪个信箱

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3. 管道通信

一个管道 中数据的流动是单向的 ---半双工【同一时刻只支持单项的传输,但是这个“管道”是两头都可以用的!】【“全双工”两个方向同时进行!】

进程P通过系统调用申请管道文件【pipe文件】,操作系统会新建这个文件【文件的本质就是在内存中开辟一个大小固定的内存缓冲区!】 

这个管道里:数据是先进先出的!

在这里插入图片描述

5、管道里的数据没有指明要给那个进程,如果多个进程从同一个管道读数据的话 会很乱!应试的话:多个写进程,一个读进程!

共享存储和管道通信的区别​

共享存储方式,也是在内存开辟了一个大小固定区域,PQ但对共享区的读写很自由,额米有任何限制【头部尾部那里的数据都可以随便取!】;

​ 管道通信方式,读写数据有限制,和循环队列一样;【P写的时候只能顺着写 Q取数据的时候 只能从头部开始读取 不能随便读】【p写写写写到尾巴满的时候 如果头是空的,就可以在头上写!】

先进先出(FIFO!)

小结

这三种通信的功能都需要操作系统的底层来支持的!

在这里插入图片描述

1.6 线程和多线程模型

在这里插入图片描述

1. 什么是线程,为什么要引入线程 ?

串行的时候QQ和音乐是不能同时运行的!

进程是程序的一次执行!

在这里插入图片描述

进程只能串行的执行代码,传统的进程是程序执行流【调度】的最小单位!

引入线程增加系统的并发度,这时cpu调度的服务对象 不再是进程 而是线程

一个进程里可能包含多个线程 线程成了程序执行流【调度】的最小单位 

在这里插入图片描述

​ ==引入进程的目的:==使得多道程序并行执行,以提高资源利用率;

​ ==引入线程的目的:==减少程序在并发执行时所付出的时间开销,提高OS的并发性能;

线程可以理解为是轻量级的 进程 

注意:资源是分配给进程的 不是线程 因此 进程依然是系统资源的分配单元!

在这里插入图片描述

2. 引入线程机制后,有什么变化 ?

​ 课本P83还补充了从 拥有资源、独立性、支持多处理机系统 的角度,比较进程与线程的区别;(王道不提,应该不考)

在这里插入图片描述

3. 线程的属性

线程控制块也是为了控制线程而创建的数据结构!

可以共享进程的资源【I/O设备,内存地址空间等】

同一进程之间的线程信息通信甚至无需系统干预!【因为共享内存地址空间】

在这里插入图片描述

4. 线程的实现方式

① 用户级线程

早期的操作系统:只支持进程,不支持线程的时候使用的

在这里插入图片描述

在这里插入图片描述

一个线程就是一个代码逻辑,这里面包含三个代码逻辑!

​ 在上面qq的例子中,操作系统只能看见进程,程序员利用线程库创建逻辑上的线程,就是所谓的 用户级线程 ;

在这里插入图片描述

在这里插入图片描述

1、应用程序通过线程库完成的,并不是操作系统负责的

2、线程的切换发生在while循环里

3、不知道线程的存在 只知道进程 的存在是依托代码!

4、当while循环了某一行代码阻塞那么整个进程都被阻塞了;在这里操作系统是给进程分配时间的,因此在用户级线程里,进程依然是是调度的最小单位

② 内核级线程

​ 内核级线程,操作系统支持的线程

在这里插入图片描述

在这里插入图片描述

4、在这里:内核级线程处理机调度的基本单位!进程只作为分配资源的基本单位

5、线程是由内核管理的,所以线程之间的切换要通过内核...

5. 多线程模型

​ 学习了 用户级线程 和 内核级线程,==各自都有优缺点,下面的 三种多线程模型 就是把他们融合起来

① 一对一模型

在这里插入图片描述

线程的管理工作要将cpu 切换到内核态 变态时 会造成系统开销增大!

② 多对一模型

退化成之前讲的那个 纯粹的用户级线程!一个进程只被分配了一个内核级线程!

在这里插入图片描述

③ 多对多模型

在这里插入图片描述

如果 视频聊天要消费比较多的 cpu资源的话,可以让一个内核级线程专门负责这个

如果某个时刻 文件传输占较多的话,可以把文字聊天映射到别的内核级线程里!

当所有的内核级线程都被阻塞的时候,这个进程才会别阻塞!!!

内核级线程的数量比线程的数量小,管理开销就会小一点

比较容易考阻塞的问题!

6. 线程的状态与转换

在这里插入图片描述

在这里插入图片描述

7. 线程的组织与控制

在这里插入图片描述

线程切换的时候

一个进程一个线程表;多个进程在一个线程表里

小结

王道课本P66页有关于两种 线程调度 的内容

  • 用户级线程调度
  • 内核级线程调度

在这里插入图片描述

2 处理机的调度

2.1 调度的概念

在这里插入图片描述

1. 调度的基本概念

​ 处理机调度:进程数 > 处理机个数,需要对处理机进行分配;

在这里插入图片描述

调度:确定任务的顺序

2. 调度的层次

​ 一个作业从提交开始直到完成,往往需要经历三级调度;

高级调度

在这里插入图片描述

① 高级调度 (作业调度)

在这里插入图片描述

② 低级调度 (进程调度)

在这里插入图片描述

③ 中级调度 (内存调度)

在这里插入图片描述

3. 三级调度的联系

在这里插入图片描述

高级调度:作业调入的时候会创建PCB

​ 补充知识:进程的挂起态 与 七状态模型

在这里插入图片描述

小结

在这里插入图片描述


2.2 调度的实现

在这里插入图片描述

1. 进程调度的时机

进程调度又叫做 低级调度;作业调度 高级调度;内存调度 叫中级调度!

在这里插入图片描述

1、进程处于操作系统内核程序的临界区

不能进行进程的切换和调度!​ 

内核程序临界区 和 ==临界区,==这两个不是同一个概念

在这里插入图片描述

内核程序 临界区 如果这段代码要访问的是 就绪队列 ,访问之前会上锁 直到退出!

在这里插入图片描述

​ 当某个进程处于普通的临界区(eg:打印机)【或许可以进行程序的调度!】

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2、进程调度的方式​

根据 当前运行的进程是否可以被强行的剥夺处理机资源 对进程调度的方式分成两类,后面会具体介绍;

  • 非可剥夺调度:只允许进程主动的放弃处理机器。发生引起调度条件且当前进程无法继续运行下去时,可以马上进行调度与切换 ;
  • 可剥夺调度:中断处理结束或自陷处理结束后,返回被中断进程的用户态程序执行现场前,若置换请求调度标志,即可马上进行进程调度与切换 ;

在这里插入图片描述

3. 进程的切换与过程

在这里插入图片描述

进程切换是由代价的 因此不能简单的认为切换的越频繁 进程的并发度就越高!

4. 调度程序(调度器)【scheduler】

是一个程序模块!

​ 调度程序:用户调度和分派CPU的组件。调度程序是 操作系统内核程序 ;

​ 需要 调度程序 的调度时机:

  • 创建新进程 时,调度程序就会出来看下是否需要让他上处理机;
  • 进程退出 时,处理机空闲,调度程序就会出来看让谁接着上处理机;
  • 运行 进程阻塞 时,调度程序就会出来看让谁接着上处理机;
  • 发生 ==I/O中断时,==有可能使得某些阻塞进程回到就绪态里;

一旦就绪队列发生改变时,调度程序就会出来,根据调度算法,判断是否让他上处理机

在这里插入图片描述

非抢占式只能运行进程阻塞或者退出时才能出发调度程序工作;但是非抢占式不这样!

调度程序的三部分:

​ ① 排队器

​ 将系统中的 所有就绪进程 按照一定的策略排成一个或多个队列,以便进程调度;

​ ② 分派器

​ 将选中的进程从就绪队列取出,分配CPU;

​ ③ 上下文切换器

​ 处理机切换时,会发生两对上下文的切换操作:

  • 当前进程的上下文保存到其PCB中,再装入分派程序的上下文;
  • 移出分派程序的上下文,将新选进程的CPU现场装入处理机的各个相应寄存器;

​ 在上下文切换时,需要执行大量的 ==load 和 store指令,==以保存寄存器的内容;

在这里插入图片描述

5. 两种线程的调度

​ 对于支持线程调度的操作系统来说,分成两种调度 (简单了解、王道课上没提) :

  • 用户级线程调度:内核不知道线程的存在,内核选择一个进程,由进程的调度程序决定哪个线程运行;
  • 内核级线程调度:内核选择一个特定线程运行,不考虑该线程附属的进程;

​ 如果操作系统支持调度线程,那么 调度程序 的对象就是 内核级线程 ;

​ 如果操作系统不支持调度线程,那么 调度程序 的对象就是 进程 ;

​ 用户级线程 的线程切换在同一个进程中进行,仅需少量的机器指令;

​ 内核级线程 的 线程切换 需要完整的上下文切换、修改内存映像、使高速缓存失效,导致了若干数量级的延迟;

在这里插入图片描述

6. 闲逛进程

不让处理及空闲!

​ 闲逛进程,==无需CPU之外的资源。==说白的就是街溜子,CPU闲的没事干就闲逛;

在这里插入图片描述

0地址指令:不需要方访存,甚至不需要访问cpu里的任何寄存器!因此能耗就比较低!

指令周期末尾的终端就会 周期性的唤醒调度程序 看有没有其他的就绪进程已经就绪 如果有的话就让闲逛进程下处理机 其他进程上处理机!

小结

在这里插入图片描述

 2.3 调度的算法的评价指标

在这里插入图片描述

1. CPU利用率

在这里插入图片描述

2. 系统吞吐量

在这里插入图片描述

3. 周转时间

在这里插入图片描述

在这里插入图片描述

周转时间是总时间 作业实际运行的时间就是CPU上的时间 

带权周转时间越小说明越满意!!!! 11分钟里1分钟在上厕所 【满意度比】11分钟10分钟在上厕所低!!!

4. 等待时间

在这里插入图片描述

作业的等待时间个进程是不一样的

5. 响应时间

在这里插入图片描述

小结

在这里插入图片描述

2.4 典型的调度算法

适用于批处理

1. 先来先服务(FCFS)

在这里插入图片描述

等待时间不包括等待I/O设备操作的时间!

算法是否抢占 ?是否饥饿优点缺点
FCFS非抢占不会公平、简单对长作业有利,对短作业不利

在这里插入图片描述

2. 短作业优先(SJF)

在这里插入图片描述

当前已经到达的!一定标出来进成的到达时间!

在这里插入图片描述

按这个过程做:

在这里插入图片描述

在这里插入图片描述

算法是否抢占 ?是否饥饿优点缺点
FCFS非抢占不会公平、简单对长作业有利,对短作业不利
SJF/SPF非抢占对短作业有利,对长作业不利
SRTN抢占式对短作业有利,对长作业不利

在这里插入图片描述

对于先来先服务和短作业优先两个算法的思考

在这里插入图片描述

3. 高响应优先(HRRN)

在这里插入图片描述

在这里插入图片描述

算法是否抢占 ?是否饥饿优点缺点
FCFS非抢占不会公平、简单对长作业有利,对短作业不利
SJF/SPF非抢占对短作业有利,对长作业不利
SRTN抢占式对短作业有利,对长作业不利
HRRN非抢占不会

适用于交互式

4. 时间片轮转调度算法(RR)

时间片轮转调度算法是随着分时操作系统的诞生而诞生的!

时间片是处理机的时间片!一个作业只有被放入内存建立了相应的进程之后,只有作为进程,才能被分配相应的时间片!

分时操作系统不太关注周转时间等这些指标 比较关注的是响应时间!

在这里插入图片描述

每次运行完之后就会插入到 就绪序列的队尾!

在这里插入图片描述

在这里插入图片描述

等待队列!!!别写错了!

在这里插入图片描述

5. 优先级调度算法

在这里插入图片描述

在这里插入图片描述

当优先级相同时,先到的先运行!

在这里插入图片描述

在这里插入图片描述

系统进程的优先级高于用户 (管理的大于使用的) 前台大于后台(前台是现在能看见的当然要顺滑一点)

高响应比里(HRRN)其实也可以视为是优先级的一种,当等待时间长的时候 优先级也会增加!

算法是否抢占 ?是否饥饿优点缺点对象
FCFS(先来先服务)非抢占不会公平、简单对长作业有利,对短作业不利作业/进程
SJF/SPF(短作业优先)非抢占对短作业有利,对长作业不利作业/进程
SRTN(短时间优先)抢占式对短作业有利,对长作业不利作业/进程
HRRN(高响应比)非抢占不会作业/进程
RR(时间片轮换)抢占式不会公平、响应快额外开销进程
优先级都有实时、应急饥饿作业/进程

在这里插入图片描述

6. 多级反馈队列调度算法

不需要实现估计进程运行的时间 避免了作假的情况!

在这里插入图片描述

I/O阻塞就放回原来的队列

在这里插入图片描述

优先级高的 时间片小 ;优先级低的 时间片大

被抢占的进程放在原队列的队尾!重要的上面那个图片的右边的图!

7. 多级队列调度算法

在这里插入图片描述

交互式 需要得到及时的响应和反馈!

小结

算法是否抢占 是否饥饿优点缺点对象
FCFS(先来先服务)非抢占不会公平、简单对长作业有利,对短作业不利作业/进程
SJF/SPF(短作业优先)非抢占对短作业有利,对长作业不利作业/进程
SRTN(短时间优先)抢占式对短作业有利,对长作业不利作业/进程
HRRN(高响应比)非抢占不会作业/进程
RR(时间片轮转)抢占式不会公平、响应快额外开销进程
优先级都有实时、应急饥饿作业/进程
多级反馈队列抢占式进程
  • 14
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值