操作系统期末复习

操作系统实例5个?

windows、linux、unix、macOS、Chrome OS

类Unix(Linux系):Linux、Ubuntu、CentOS、Debian、RedHat

Unix:macOS,FreeBSD,OpenBSD

windows:win xp,win7,win 10…

什么是操作系统?

操作系统是管理计算机硬件与软件资源的计算机程序,是一种运行在内核态的软件。

操作系统演化过程?

1.1945-1955第一代数字计算机使用真空管构建,还没有操作系统的概念,带了后期出现了穿孔卡片。

2.1955-1965第二代计算机使用晶体管构建,计算机可以完成一些有用的工作,出现了批处理系统

3.1965-1980第三代计算机使用集成电路芯片,出现了多道程序设计和分时系统假脱机技术,UNIX诞生。

4.1980-present第四代计算机被称为个人计算机,网络操作系统和分布式操作系统增长。

5.1990-present第五代移动计算机

操作系统结构?

整体式结构、模块化结构、层次式结构、微内核结构。

计算机硬件组成?

运算器、控制器、存储器、输入设备、输出设备。

为什么分为内核态和用户态?

由于需要限制不同程序的访问能力,防止它们获取别的程序的内存数据,或者获取外围设备的数据,并发送到网络。

用户态切换到内核态的三种方式?

  • 系统调用:用户进程主动切换到内核态的一种方式,用户态进程通过系统调用申请使用操作系统提供的服务程序完成工作。系统调用的核心是使用了操作系统为用户特别开放的一个中断来实现。
  • 中断
  • 异常

什么是假脱机(SPOOLing)技术?举一个实例。

SPOOLing技术是低速输入设备与主机交换的一种技术,通常也称作“假脱机真联机”,它的核心思想是以联机的方式获得脱机的效果。通过SPOOLing技术可将一个物理I/O设备虚拟成多台逻辑I/O设备,同样允许多个用户共享一台物理I/O设备。

实例:将一台独享的打印机改造成多个用户共享的打印机。具体做法是:系统为用户的打印输出在输出井上申请一块空闲区,并将数据送入其中,然后将作业挂在打印队列上,如果打印机空闲,输出程序从打印队列取出作业,将要打印的数据从输出井传送到内存缓冲区,在进行打印。

操作系统的特征?

共享、并发、异步、虚拟化

进程和线程的区别和联系(异同)?

线程是进程的一个实体,也是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。进程在运行过程中有自己独立的内存单元,而线程自己基本上不拥有系统资源,也没有自己的地址空间,只有一点在运行中必不可少的资源。线程的改变只代表了CPU执行过程的改变,而没有发生进程所拥有的资源变化。主要区别在于,操作系统并没有将多个线程看作多个独立的应用,来实现进程的管理调度以及资源分配。

进程是操作系统动态执行的基本单元,线程是操作系统能够进行运算调度的最小单位

为什么引入了进程?

为了程序的并发执行。

进程有几种状态?

就绪状态:存在于处理机调度队列中所有进程,他们已经准备就绪,一旦得到CPU,就可以立即进行

运行状态:正在运行的进程所处状态

阻塞状态:进程因等待某件事发生,即使给他cpu也不能运行

关于有限状态机。

阻塞式系统调用:单进程,请求IO未达预期就会被阻塞

用户级线程和内核级线程的区别及优点

用户级线程:

​ 必须使用非阻塞式调用,由用户程序自己控制内核切换,不需要内核干涉

​ 优点:线程的调度不需要内核直接参与,控制简单

​ 可以在不支持线程的操作系统实现

​ 允许每个进程定制自己的调度算法,线程管理比较灵活

​ 创建和销毁线程、线程切换代价等线程管理的代价比内核线程少得多

​ 线程能够利用的表空间和堆栈空间比内核级线程多

​ 缺点:资源调度按照进程进行,多个处理机下,同一个进程的线程只能在同一个处理机下分时复用

内核级线程:

​ 内核做线程间的调用,一个内核级线程可以对应多个应用及线程。切换由内核控制,当线程进行切换时,由用户态转化为内核态。

​ 优点:当有多个处理机时,一个进程的线程可以同时执行

​ 缺点:由内核进行调度

区别:

​ (1用户级线程的创建、撤销和调度不需要OS内核的支持,而内核级线程需要

​ (2用户级线程是OS内核不可感知的,内核级线程是可感知的

​ (3用户级执行系统调用指令时将导致所属进程被中断,而内核级调用指令时只导致该线程被中断

​ (4在用户级进程内,CPU调度以进程为单位;内核级则以县城为单位

​ (5用户级线程的程序实体是运行在用户态下的程序,而内核级线程可以运行在任何态下

进程调度算法

先来先服务(FCFS):谁先到谁先获得资源

最短作业优先:(SJF)

  • 抢占式:只要新来的作业时间比正在运行的少,就中断正在运行的,先执行新来的
  • 非抢占式:到达后就会执行完,同时到达的情况下才会根据谁的作业时间短来决定谁先执行

时间片轮转(RRS):一个线程会一直运行直到:自愿放弃控制权;被更高优先级的线程抢去;时间片用完

多级优先级调度(MQS):高优先级时间片短,若给定时间片内未完成,则降低优先级,延长时间片

竞态的概念

两个或多个进程同时读或写一些共享数据,最终的结果取决于哪个进程运行的更精确。

避免竞态的前提

  1. 不能同时访问临界区
  2. 不能对CPU的数量和速度进行假设
  3. 运行在临界区外的进程不能阻塞其他进程
  4. 所有进程都是有限等待的

进程间互斥的手段有?

严格轮换法:

优点:可实现互斥访问,

缺点:当a进入临界区一次后必须等待b进入临界区后,a才能第二次进入临界区。

适用:速度相近的进程

Peterson的解决方法

TSL方法(测试并加锁)

Swap方法

信号量

原语

由若干条指令组成的程序段,用来实现某个特定的功能,在执行过程中不可被中断

为什么产生死锁?(产生死锁的4个必要条件)如何破解?

产生原因:竞争资源引起进程死锁(资源分配策略)(可剥夺/非可剥夺资源);进程推进顺序不当引起死锁

产生死锁的4个必要条件:

1. 互斥条件:设计的资源是非共享的
2. 持有并等待:进程在等待一新资源时继续占有已分配的资源
3. 不可抢占条件:不能强行剥夺进程拥有的资源
4. 循环等待:存在一种进程的循环链,链中的每一个进程已获得的资源同时被下一个进程所请求

处理死锁的方法:

  • 预防死锁:通过某些限制条件,破环死锁的四个必要条件

  • 避免死锁:在资源动态分配的过程中,用某种方法防止系统进入不安全的状态

  • 检测死锁:允许死锁发生,但可通过检测机构及时检测出死锁的发生,并精确确定与死锁有关的进程和资源,然后采取适当的措施,将系统中已发生的死锁清除掉

  • 解除死锁:与检测死锁相配套,用于将进程从死锁状态中解脱出来。常用的方法是撤销或挂起一些进程,以回收一些资源,再将它们分配给处于阻塞状态的进程,使之转为就绪状态

存储器的层次结构?

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VoA4EY2v-1641287377172)(C:\Users\狼渊\AppData\Roaming\Typora\typora-user-images\image-20220103081723276.png)]

局部性原理?

cpu访问存储器时,无论存取指令还是存取数据,所访问的存储单元都趋向于聚集在一个较小的连续区域中。

时间局部性:如果一个信息项正在被访问,那么在近期他很可能还会被再次访问。

空间局部性:在最近的将来用到的信息很可能与正在使用的信息在空间地址上是临近的。

交换技术

将不用(或很少再用)的进程换出内存,只在内存空间不够或有不够的危险时换出。

交换时需要做的工作:换出和换入的过程,需要一个磁盘交换区,必须足够大以存放用户程序内存映像的拷贝,必须对内存映像直接存取。

虚拟存储(时间局部、空间局部例子)

时间局部:web浏览器将最近被请求的文档放在本地磁盘上;计算机变量访问

空间局部:老师提问;计算机存储多维数组一般是按照行优先的方式进行的,行优先遍历就是依次访问相邻位置的数据

抖动原因和解决方法

在请求分页存储管理中,从主存中刚刚换出到某一页面后,根据请求马上又换入该页,这种反复换入换出的现象,叫做系统抖动。

  • 产生原因:

    • 系统花费大量时间忙于分页而不是执行 ,致使系统效率很低
    • 分配给进程的存储块数量小于进程所需要的最小值
  • 解决方法:用局部性原理优化置换算法,减少运行的进程数,增大内存

  • 页面置换算法:目标是把未来不再使用或短期内较少使用的页面调出,通常只能在局部性原理指导下依据过去的统计数据进行预测

    • 最佳页面算法(OPT):选择未来不再使用的或在离当前最远位置上出现的页面被置换

      • 是一种理想情况,用作其他算法性能评价的依据
    • 先进先出页面置换算法(FIFO):选择建立最早的页面被置换,可以通过链表来表示各页建立时间先后

      • 特点:性能较差。有Belady现象
      • Belady现象:如果一个进程未分配它所要求的所有页面,有时就会出现分配的页面数增多,缺页率反而提高的异常现象
      • Belady现象的描述:一个进程P要访问M个页,OS分配N个内存页面给进程P;对于一个访问序列S,发生缺页的次数为PE(S,N),当N增大时,PE(S,N)时而增大时而减小
      • Belady现象的原因:FIFO算法的置换特征与进程访问内存的动态特征是矛盾的,即被置换的页面并不是进程不会访问的。
      image-20220103100414983
image-20220103100442579
  • LRU(最久未使用):选择最后一次访问时间距离当前时间最长的一页并淘汰。
    • 特点:局部性原理的合理近似,性能接近OPT算法,实现代价很高
  • NFU(轮转算法,最近未使用):增加一个时钟中断,为每个页面设置一个访问位,被使用了该位就置1,置换访问位为0的页,若全为1则全部置0再扫描一次,最多扫描两次能出结果
  • LFU(最不经常使用):选择当前时间为止访问最少的页面被置换
  • 工作集算法:工作集是在最近k次内存访问所使用过的页面的集合,在实现时给每个页面一个计时器,同实际时间进行对比,R为1,更新到现在时间,R为0,在规定阈值外的页面可被置换

例:用上面那个题,3块,算FIFO\LRU\OPT(结果是:9,10,7)

异常解释

基本分页管理

分页地址是一维地址空间

把用户程序按逻辑页划分为大小相等的部分,称为页。从0开始编页号,页内地址是相对于0编址

页表:页号,块号(相应的页所对应的块号),其他(与存储信息保护有关的信息)

页号=int[逻辑地址/页大小](余数为页内地址)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u9nYKTgp-1641287377174)(C:\Users\狼渊\AppData\Roaming\Typora\typora-user-images\image-20220103084205211.png)]

分段管理

二维地址空间<段号,段内偏移量>

分成若干个逻辑部分,段内是连续存储的

分段后没有内碎片,外碎片可能有

查找某个数据:短号+基址+段内偏移量

动态分配内存算法

  • FirstFit(FF,首次适应法):第一次找到可用的就分配
  • NextFF(NF,下次适应法):从当前位置继续搜索(不每次都从head开始)
  • BestFit(BF,最佳适应算法):找到大小最合适的空闲块,问题:会形成很多外碎片
  • WorstFit(WF,最坏适应法):找最大块的
  • Buddymemoryallocation(伙伴式的内存管理)x一直除以2,直到使值刚好大于需要的内存大小

文件物理结构(文件的分配方式)(I节点计算)

连续结构、链表结构、索引结构

ppt p37

例:在UNIX中,每个i节点中有10个直接地址和一、二、三级间接索引。若每个盘块512B,每个盘块地址4B,则一个1MB的文件分别占用多少间接盘块?25MB的文件呢?

10个直接盘块存放的容量为:10*512B/1024 = 5KB

一个盘块中可放的盘块地址数为:512B/4B = 128

一次间接索引存放的容量为:128*512B/1024 = 64KB

二次间接索引存放的容量为:128128512B/1024 = 8192KB

三次间接索引存放的容量为:128128128*512B/1024 = 1048576KB

则1MB为1024KB,1024KB-64KB-5KB=955KB,955×1024B/512B=1910,所以1MB的文件分别占用128个一次间接盘块和1910个二次间接盘块。

解释:乘除1024只是为了在KB和B间进行单位转换

空闲块管理

  • 位图法:用位图来表示磁盘的空闲空间列表,每一个物理块用一个位来表示。空闲则相应位为1,否则为0
  • 链表法:用链表来表示磁盘的空闲空间列表。在每一个空闲的物理块上都有一个指针,然后把所有的空闲块通过这个指针连接起来,从而形成一条链表。系统只要记住这条链表的首结点指针,就可以一个接一个地去访问所有空闲物理块
  • 索引法:单独预留少量的一些空闲物理块,把它们链接成一条链表

成组链接法的原理(怎么链接怎么释放的?)

如何分配

超级块:存放空闲块的信息

​ 需要一个空闲块:

  • 检查第一个分组的块数是否足够

  • 分配第一个分组中的1个空闲块,并修改相应数据

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fuvLbv4A-1641287377175)(C:\Users\狼渊\AppData\Roaming\Typora\typora-user-images\image-20220103145608632.png)]

    image-20220103145042682

如何回收?

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4FeU0P4I-1641287377176)(C:\Users\狼渊\AppData\Roaming\Typora\typora-user-images\image-20220103145842155.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v0Kw5mZL-1641287377176)(C:\Users\狼渊\AppData\Roaming\Typora\typora-user-images\image-20220103145855239.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ps31bm19-1641287377177)(C:\Users\狼渊\AppData\Roaming\Typora\typora-user-images\image-20220103145917214.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Wv7K4pg5-1641287377177)(C:\Users\狼渊\AppData\Roaming\Typora\typora-user-images\image-20220103150000924.png)]

磁盘调度算法

FCFS(先来先服务算法):根据进程请求访问磁盘的先后次序进行调度

SSF(最短寻道时间优先算法):其要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短

SCAN(扫描算法,又叫电梯算法):不仅考虑欲访问的磁道与当前磁道的距离,更优先考虑的是磁头的当前移动方向。例如,当磁头正在自里向外移动时,扫描算法所选择的下一个访问对象应是其欲访问的磁道既在当前磁道之外,又是距离最近的。这样自里向外地访问,直到再无更外的磁道需要访问才将磁臂换向,自外向里移动。

IO控制4种方法的区别和联系以及评价

  • 程序控制

    由用户进程直接控制主存或CPU和外围设备之间的信息传送。只适合于CPU执行速度较慢,且外围设备较少的系统。

  • 中断方式

    在需要IO服务时才中断cpu的现行工作,转去执行IO服务。一定程度上实现了cpu与io设备的并行工作。

  • DMA方式

    IO设备和内存之间开辟直接的数据交换通路。但IO指令的编码译码工作仍然需要CPU参与。

    DMA与中断方式的区别:

    • 中断方式在数据缓冲寄存器满后,发中断请求,cpu进行中断处理。而DMA在要求传送的数据块全部传送结束时要求cpu进行中断处理。
    • DMA数据传送由DMA控制器控制完成,中断方式则由CPU完成。

    特点:

    1. 基本单位是数据块
    2. 所传送的数据是从设备直接送入内存的或者相反
    3. 仅在传送一个或多个数据块的开始和结束时才需CPU的干预,整块数据的传送是在DMA控制器的控制下完成的
  • 通道方式

    独立于CPU的专门负责输入输出控制的处理机,他控制设备与内存直接进行数据交换。有自己的指令系统,但通道指令功能简单,使用面窄,与CPU共用一个主存,还不是独立的IO处理机

    IO通道与DMA的区别:

    • DMA方式需要CPU来控制传输数据块的大小、传输的内存位置,而通道方式中这些信息是由通道控制的。
    • 每个DMA控制器对应一台设备与内存传递数据,而一个通道可以控制多台设备与内存的数据交换。

中断机制

中断是用户态切换到核心态的唯一途径

中断的分类:

  • 内中断(陷阱):信号来自CPU内部,与当前执行的指令有关,是主动的中断。
  • 外中断:信号来自外部,与当前指令无关,异步。是被动的中断。

假脱机系统特点?

  • 将独占设备改为共享设备
  • 提高了IO速度
  • 实现了虚拟设备功能

操作系统设计的模型有?

结构:

  • 整体式结构:常被称为“大杂烩”,本质上无结构,也称为“无序模块结构、模块接口结构”。
  • 分层结构:将操作系统分解成若干个基本模块,并按照一定的原则将这些模块排列成若干层,各层之间只有单向依赖关系。
  • 全序结构:在层次结构OS中,不仅层间是单向依赖关系,而且同一层的各模块间也相互独立、单向依赖和不构成循环

模型:

  • 单片系统:是一个将电脑或其他电子系统集成到单一芯片的集成电路,常常应用在嵌入式系统中,整体结构
  • layered systems(分层系统):分层结构,全序结构,Dijkstra
  • 微内核:QNX,MINIX3
  • 客户-服务器系统结构:又称微内核的操作系统体系结构,主要思想:将代码一道更高层次,即尽可能多地从OS中去掉东西,只留下一个很小的内核
  • 虚拟机
  • 外核

传统的操作系统运行模式:

  • 宏内核
  • 微内核
  • 管程结构Monitor
  • 虚拟机模式

现代的操作系统运行模型

  • 客户/服务器模式
  • 对象模式
  • 多处理机模式

操作系统性能评价?

  • 系统效率:系统处理能力(吞吐量)、各种资源的使用效率以及响应时间等
  • 系统的可靠性R、可用性A和可维护性S:MTBF平均故障时间、MTTR平均故障修复时间、R=MTBF、A=MTBF/(MTBF+MTTR)、S=MTTR
  • 方便性:提供易学、易用、易开发的接口
  • 可移植性

操作系统未来发展趋势?

虚拟化

多核芯片

大型地址空间操作系统

联网

并行系统与分布式系统

多媒体

电池供电的计算机

嵌入式系统

自由软件运动(free software)与商业软件(commercial software)在新时代的价值

自由软件:使得更多的开发者可以发挥自己的能力,将软件变得富有活力和生机。它不仅仅是技术的协作,更是社会的协作。在软件领域,自由软件对开发者进行技术协作和知识共享有着显而易见的优势。

商业软件:虽然存在商业软件公司的垄断问题而且阻碍了技术的分享和交流,但它能够为专业软件开发者提供更加充足的资源,商业软件公司能够为公司内开发人员提供更好的开发环境和设备,有利于软件进行完善和升级。

比较进程模型与线程模型并探讨未来操作系统的执行体潜在形式

在传统的OS中,进程是调度和分派的基本单位,进程是能独立运行的基本单位,引入了线程的OS中,线程变为基本单位,线程切换的开销要小于进程。线程的引入,使得OS具有了更好的并发性,提高了系统的利用率和吞吐量。进程可以拥有资源,而线程不拥有系统资源。多个线程的独立性远低于不同进程建的独立性。线程对多处理机系统提供了很好的支持。

虽然线程在许多方面都有十足的优越性,但线程之间的同步和加锁控制比较复杂,而且一个线程的崩溃可能影响到整个程序的稳定性,且线程能够提高的总性能有限,因此线程并不会取代进程。未来的操作系统应当会将进程和线程的使用更好的融合在一起,综合两者的优点,发展的更为完善。

进程间通讯

  • 消费者-生产者问题

    #define N 100 /*缓存中空闲块的数量*/
    typedef int semaphore;
    semaphore mutex=1;
    semaphore empty=N;
    semaphore full=0;
    void producer(void){
    	int item;
    	while(TRUE){
    		produce_item(&item);
    		down(&empty);
    		down(&mutex);
    		enter_item(item);
    		up(&mutex);
    		up(&full);
    	}
    }
    void consumer(void){
    	int item;
    	while(TRUE){
    		down(&full);
    		down(&mutex);
    		remove_item(&item);
    		up(&mutex);
    		up(&empty);
    		consume_item(item);
    	}
    }
    
  • 哲学家进餐问题

    至多只允许N个哲学家同时进餐,以保证至少有一个哲学家能够进餐,最终总会释放出他所使用过的两支筷子,从而可使更多的哲学家进餐。以下将count 作为信号量,只允许N个哲学家同时进入餐厅就餐,这样就能保证至少有一个哲学家可以就餐,而申请进入餐厅的哲学家进入等待队列,根据FIFO 的原则,总会进入到餐厅就餐,因此不会出现饿死和死锁的现象。

    #define N 5
    #define LEFT (i+N-1)%N
    #define RIGHT (i+1)%N
    #define THINKING 0
    #define HUNGRY 1
    #define EATING 2
    typedef int semaphore;
    int state[N];
    semaphore mutex = 1;
    semaphore s[N];
    void philosopher(int){
    	while(TRUE){
    		think();
    		take_fork(i);
    		eat();
    		put_forks(i);
    	}
    }
    void take_forks(int i){
    	down(&mutex);
    	state[i]=HUNGRY;
    	test(i);
    	up(&mutex);
    	down(&s[i]);
    }
    void put_forks(int i){
    	down(&mutex);
    	state[i]=THINKING;
    	test(LEFT);
    	test(RIGHT);
    	up(&mutex);
    }
    void test(int i){
    	if(state[i]==HUNGRY&&state[LEFT]!=EATING&&state[RIGHT]!=EATING){
    	state[i]=EATING;
    	up(&s[i]);
    	}
    }
    
  • 读者写者问题

  • 访问规则:
    1、多个读者可以同时读数据
    2、任何时刻只能有一个写者写数据
    3、一个读者与一个写者不能同时在相应的临界区中
    实质: 一个写者不能与其它的读者或写者同时访问相
    应的临界资源。

#define int semaphore
semaphore mutex = 1;
semaphore wrt = 1;
int readcount = 0;
void writer(void){
	down(&wrt);
	Perform writing;
	up(&wrt);
}
void reader(void){
	down(&mutex);
	readcount=readcount+1;
	if(readcount==1)
		down(&wrt); /*保证读者后的写者不能进入db*/ 
	up(&mutex);
	Perform reading;
	down(&mutex);
	readcount=readcount-1;
	if(readcount==0)
		up(&wrt);
	up(&mutex)
}
  • 理发师问题

    1、5把供顾客等候的椅子
    2、一个理发师同时只能给一个顾客理发
    3、没有顾客,理发师进入睡眠状态。

    #define N 5
    #define int semaphore
    semaphore mutex=0;
    semaphore customers=0;
    semaphore barbers=0;
    int waiting=0;
    void barber(void){
    	while(TRUE){
    	down(&customers);
    	down(&mutex);
    	waiting=waiting-1;
    	up(&barbers);
    	up(&mutex);
    	cut_hair();
    	}
    }
    void customer(void){
    	down(&mutex);
    	if(waiting<N){
    		waiting=waiting+1;
    		up(&customers);
    		up(&mutex);
    		down(&barbers);
    		get_haircut();
    	}
    	else{
    		up(&mutex);
    	}
    }
    

银行家算法

安全状态前一定是安全状态,不安全状态是指一旦走出这块区域就会有死锁的可能

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YrQKoHI2-1641287377178)(C:\Users\狼渊\AppData\Roaming\Typora\typora-user-images\image-20220104170857285.png)]

并行和并发的区别?

并发:多件事在同一个时间间隔发生。在一台处理器上同时处理多个任务。

并行:多个事在同一时刻发生。在多台处理器上同时处理多个任务。

计算题:操作系统计算题 - 高炳涛 - 博客园 (cnblogs.com)

  • 4
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值