操作系统中进程的控制和描述(一)【前趋图和程序执行、进程的基本状态转换及进程的创建、终止、阻塞、唤醒、挂起与激活 】

操作系统中进程的描述与控制

操 作 系 统 所 具 有 的 四 大 特 征 也 都 是 基 于 进 程 而 形 成 的 , 并 从 进 程 的 角 度 对 操 作 系 统 进 行 研 究 。

(一)、前趋图和程序执行

1.1 前趋图

  • 前趋图(Precedence Graph),是指一个有向无循环图,可记为DAG(Directed Acyclic Graph),它用于描述进程之间执行的先后顺序。图中的每个结点可用来表示一个进程或程序段,乃至一条语句,结点间的有向边则表示两个结点之间存在的偏序(Partial Order)或前趋关系(Precedence Relation)
  • 进程(或程序)之间的前趋关系可用“→”来表示,如果进程Pi和Pj存在着前趋关系,可表示为(Pi,Pj)∈→,也可写成Pi→Pj,表示在Pj开始执行之前Pi 必须完成。此时称Pi是Pj的直接前趋,而称Pj是Pi的直接后继。
  • ①、在前趋图中,把没有前趋的结点称为初始结点(Initial Node)
    ②、把没有后继的结点称为终止结点(Final Node)。
    ③、此外,每个结点还具有一个重量(Weight),用于表示该结点所含有的程序量或程序的执行时间。

在这里插入图片描述

在图(a)所示的前趋图中,存在着如下前趋关系:
P1→P2,P1→P3,P1→P4,P2→P5,P3→P5,P4→P6,P4→P7,P5→P8,P6→P8,P7→P9,P8→P9
或表示为:P={P1, P2, P3, P4, P5, P6, P7, P8, P9} ={(P1, P2), (P1, P3), (P1, P4), (P2, P5), (P3, P5), (P4, P6), (P4, P7), (P5, P8), (P6, P8), (P7, P9), (P8, P9)}

  • 应当注意,前趋图中是不允许有循环的,否则必然会产生不可能实现的前趋关系。
  • 如图(b)所示的前趋关系中就存在着循环。它一方面要求在S3开始执行之前,S2必须完成,另一方面又要求在S2开始执行之前,S3必须完成。显然,这种关系是不可能实现的。S2→S3,S3→S2
    在这里插入图片描述

1.2 程序顺序执行

(1)程序的顺序执行
(2)程序顺序执行时的特征
  • ①、顺序性处理机的操作严格按照程序所规定的顺序执行,每一操作必须在下一个操作开始之前结束。

  • ②、封闭性在封闭环境下执行,独占全机资源,执行结果不受外界影响。

  • ③、可再现性只要程序执行时的环境和初始条件相同,当程序重复执行时,不论它是从头到尾不停顿地执行,还是“走走停停”地执行,都将获得相同的结果。

1.3 程序并发执行

(1)程序的并发执行

在这里插入图片描述
由图可以看出,存在前趋关系 Ii→Ci,Ii→Ii+1,Ci→Pi,Ci→Ci+1,Pi→Pi+1,而Ii+1和Ci及Pi-1是重叠的,即在Pi-1和Ci 以及 Ii+1之间,不存在前趋关系,可以并发执行。

(2)程序并发执行时的特征
  • ①、间断性相互制约导致并发程序具有“执行-暂停-执行”这种间断性的活动规律。
  • ②、失去封闭性多个程序共享系统中的各种资源,资源状态由多个程序来改变。
  • ③、不可再现性由于程序的并发执行,打破了由另一程序独占系统资源的封闭性,因而破坏了可再现性。
    在这里插入图片描述

(二)、进程的描述

2.1 进程的定义和特征

(1)进程的定义
  • 由程序段、相关的数据段和PCB三部分便构成了进程实体(又称进程映像),一般简称为进程。
  • 对于进程的定义,从不同的角度可以有 不同的定义,其中较典型的定义有:
    ①、进程是程序的一次执行。
    ②、进程是一个程序及其数据在处理机上顺序执行时所发生的活动。
    ③、进程是具有独立功能的程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位。
  • 进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。
(2)进程和程序的区别
  • 程序是指令的有序集合,其本身没有任何运行的含义,它是一个静态的概念。而进程是程序在处理机上的一次执行过程,它是一个动态概念。(例:书本,讲课)
  • 程序的存在是永久的。而进程则是有生命期的,它因创建而产生,因调度而执行,因得不到资源而暂停执行,因撤消而消亡。
  • 程序仅是指令的有序集合。而进程则由程序段、相关数据段、进程控制块(PCB) 组成。
  • 进程与程序之间不是一一对应。
    在这里插入图片描述
(3)进程的特征动态性
  • 动态性
    ①、进程的实质是程序在处理机上的一次执行过程,因此是动态的。所以动态性是进程的最基本的特征。
    ②、同时动态性还表现在进程是有生命期的,它因创建而产生,因调度而执行,因得不到资源而暂停执行,因撤消而消亡。

  • 并发性
    ①、指多个进程实体同时存在于内存中,能在一段时间内同时运行。
    ②、引入进程的目的就是为了使进程能并发执行,以提高资源利用率,所以并发性是进程的重要特征,也是OS的重要特征。

  • 独立性:
    指进程是一个能独立运行的基本单位,也是系统进行资源分配和调度的独立单位。

  • 异步性:
    指进程以各自独立的、不可预知的速度向前推进。

  • 程序是指令的集合。但进程不是

2.2 进程的基本状态及转换

(1)进程的三种基本状态

由于多个进程在并发执行时共享系统资源,致使它们在运行过程中呈现间断性的运行规律,所以进程在其生命周期内可能具有多种状态。一般而言,每一个进程至少应处于以下三种基本状态之一:

  • ①、就绪(Ready)状态。这是指进程已处于准备好运行的状态,即进程已分配到除CPU以外的所有必要资源后,只要再获得CPU,便可立即执行。
  • ②、执行(Running)状态。这是指进程已获得CPU,其程序正在执行的状态。
  • ③、阻塞(Block)状态。 这是指正在执行的进程由于发生某事件(如I/O请求、申请缓冲区失败等)暂时无法继续执行时的状态,亦即进程的执行受到阻塞。
(2)三种基本状态的转换

在这里插入图片描述

  • 可能导致一个进程从运行状态变为就绪状态的事件是出现了比现在进程优先级更高的进程
  • 一个进程从运行状态变为就绪状态必会引起进程切换
  • 在一个多道系统中,若就绪队列不空,就绪的进程数目多,处理器的效率不变
(3)创建状态和终止状态创建状态
  • ①、创建状态:

    • 如首先由进程申请一个空白PCB,并向PCB中填写用于控制和管理进程的信息;然后为该进程分配运行时所必须的资源;最后,把该进程转入就绪状态并插入就绪队列之中。
    • 但如果进程所需的资源尚不能得到满足,比如系统尚无足够的内存使进程无法装入其中,此时创建工作尚未完成,进程不能被调度运行,于是把此时进程所处的状态称为创建状态
  • ②、终止状态

    • 进程的终止也要通过两个步骤:首先,是等待操作系统进行善后处理,最后将其PCB清零,并将PCB空间返还系统。
    • 当一个进程到达了自然结束点,或是出现了无法克服的错误,或是被操作系统所终结,或是被其他有终止权的进程所终结,它将进入终止状态。
    • 进入终止态的进程以后不能再执行,但在操作系统中依然保留一个记录,其中保存状态码和一些计时统计数据,供其他进程收集。一旦其他进程完成了对其信息的提取之后,操作系统将删除该进程,即将其PCB清零,并将该空白PCB返还系统。
      在这里插入图片描述
  • ③、挂起操作

    • 当该操作作用于某个进程时,该进程被挂起,意味着此时该进程处于静止状态;如果该进程处于就绪状态,则该进程此时暂不接受调度。与挂起操作对应的操作是激活操作。

2.3 挂起操作和进程状态的转换

(1)挂起操作的引入
  • 终端用户的需要:终端用户在自己程序运行中发现问题要求使正在执行的进程暂停执行而使进程处于挂起状态。
  • 父进程的需要:父进程为了考查和修改某个子进程,或者协调各子进程间的活动,需要将该子进程挂起。
  • 负荷调节的需要:由于工作负荷较重,而将一些不重要的进程挂起,以保证系统能正常运行(实时操作系统)
  • 操作系统的需要:操作系统为了检查运行中的资源使用情况或进行记帐,而将某些进程挂起
(2)引入挂起原语操作后三个进程状态的转换
  • 活动就绪→静止就绪;静止就绪→活动就绪
    进程处于未被挂起的就绪状态就是活动就绪状态,此时进程可以接受调度。
    当使用挂起原语Suspend将该进程挂起后,该进程转变为静止就绪状态,此时进程不再被调度执行。
  • 活动阻塞→静止阻塞。静止阻塞→活动阻塞。
    当进程处于未被挂起的阻塞状态时,称为活动阻塞状态;
    当用Suspend原语 将活动阻塞状态挂起后,进程转变为静止阻塞状态,处于该状态的进程在其所期待的事件出现后,将从静止阻塞状态转变为静止就绪状态
    在这里插入图片描述
(3)引入挂起操作后五个进程状态的转换
  • NULL→创建:新进程产生时,该进程处于创建状态
  • 创建→活动就绪:在当前系统的性能和内存的容量均允许的情况下,完成对进程创建的必要操作后,相应的系统进程将进程的状态转换为活动就绪状态
  • 创建→静止就绪:考虑到系统当前资源状况和性能的要求,不分配给新建进程所需资源,主要是主存,相应的系统将进程状态转为静止就绪状态
  • 执行→终止:当一个进程已完成任务时,或是出现了无法克服的错误,或是被OS或是被其他进程所终结,此时将进程的状态转换为终止状态
注意:
  • 当进行处于就绪状态的情况下,可以被处理器调度执行。
  • 在任何时刻,一个进程的状态变化不一定引起另一个进程的状态变化。

2.4 进程管理中的数据结果

(1)操作系统中用于管理控制的数据结构
  • 在计算机系统中,对于每个资源和每个进程都设置了一个数据结构,用于表征其实体,我们称之为资源信息表或进程信息表,其中包含了资源或进程的标识、描述、状态等信息以及一批指针通过这些指针,可以将同类资源或进程的信息表,或者同一进程所占用的资源信息表分类链接成不同的队列,便于操作系统进行查找。
  • OS管理的这些数据结构一般分为以下四类:内存表、设备表、文件表和用于进程管理的进程表,通常进程表又被称为进程控制块PCB。
(2)进程控制块PCB的作用
  • ①、作为独立运行基本单位的标志。
    当一个程序配置了PCB后,就表示它已是一个能在多道程序环境下独立运行的合法的基本单位,也就是具有获得CPU的权利。
    当进程创建时就为它建立PCB,进程结束时又回收其PCB,进程也随之消亡。系统是通过PCB感知进程的存在的。

  • ②、能实现间断性运行方式。
    在多道程序环境下,程序是采用停停走走间断性的运行方式运行的。当进程因阻塞而暂停运行时,系统就可将CPU现场信息保存在被中断进程的PCB中,供该进程再次被调用执行时恢复CPU现场使用

  • ③、提供进程管理所需要的信息。
    当调度程序调度到某进程运行时,只能根据该进程PCB中记录的程序和数据在内存或外存中的起始指针,找到相应的程序和数据;
    在进程运行过程中,当需要访问文件系统中的文件或I/O设备时,也需要借助于PCB中的信息。
    可根据PCB中的资源清单了解到该进程所需的全部资源

  • ④、提供进程调度所需要的信息。
    在PCB中提供了进程处于何种状态的信息:包括进程的优先级、进程的等待时间和已执行时间等。

  • ⑤、实现与其它进程的同步与通信
    在采用信号量机制时,它要求在每个进程中都设置有相应的同步的信号量。在PCB中还具有用于实现进程通信的区域或通信队列指针等。

注意:
  • 操作系统是根据进程控制块来对并发执行的进程进行控制和管理的
(3)进程控制块中的信息
  • ①、进程标识符
    • 进程标识符用于唯一地标识一个进程。一个进程通常有两种标识符:
      1.外部标识符。由创建者提供,通常由字母数字组成,为了描述进程的家族关系,还应设置父进程标识及子进程标识,还可设置用户标识指示拥有该进程的用户
      2.内部标识符。赋予每一个进程一个唯一的数字标识符,它通常是一个进程的序号。
  • ②、处理机状态
    • 处理机状态信息也称为处理机的上下文,主要是由处理机的各种寄存器中的内容组成的。这些寄存器包括
      1.通用寄存器:又称为用户可视寄存器,它们是用户程序可以访问的,用于暂存信息。
      2.指令计数器:存放下一条指令的地址
      3.程序状态字PSW:状态信息等。
      4.用户栈指针:指向栈顶
  • ③、进程调度信息
    在OS进行调度时,必须了解进程的状态及有关进程调度的信息,这些信息包括:
    1.进程状态,指明进程的当前状态,它是作为进程调度和对换时的依据;
    2.进程优先级,是用于描述进程使用处理机的优先级别的一个整数,优先级高的进程应优先获得处理机;
    3.进程调度所需的其它信息,它们与所采用的进程调度算法有关,比如,进程已等待CPU的时间总和、进程已执行的时间总和等;
    4.事件,是指进程由执行状态转变为阻塞状态所等待发生的事件,即阻塞原因
  • ④、进程控制信息
    是指用于进程控制所必须的信息,它包括:
    1.程序和数据的地址,进程实体中的程序和数据的内存或外存地(首)址,以便再调度到该进程执行时,能从PCB中找到其程序和数据;
    2.进程同步和通信机制,这是实现进程同步和进程通信时必需的机制,如消息队列指针、信号量等,它们可能全部或部分地放在PCB中;
    3.资源清单,在该清单中列出了进程在运行期间所需的全部资源(除CPU以外),另外还有一张已分配到该进程的资源的清单;
    4.链接指针,它给出了本进程(PCB)所在队列中的下一个进程的PCB的首地址。
(4)进程控制块的组织方式
  • 在一个系统中,通常可拥有数十个、数百个乃至数千个PCB。为了能对它们加以有效的管理,应该用适当的方式将这些PCB组织起来。目前常用的组织方式有三种:线性方式、链接方式、索引方式。
    • ①、线性方式,即将系统中所有的PCB都组织在一张线性表中,将该表的首址存放在内存的一个专用区域中。该方式实现简单、开销小,但每次查找时都需要扫描整张表,因此适合进程数目不多的系统。图示出了线性表的PCB组织方式。
      在这里插入图片描述
    • ②、链接方式,即把具有相同状态进程的PCB分别通过PCB中的链接字链接成一个队列。这样,可以形成就绪队列、若干个阻塞队列和空白队列等。
    • 对就绪队列而言,往往按进程的优先级将PCB从高到低进行排列,将优先级高的进程PCB排在队列的前面
    • 同样,也可把处于阻塞状态进程的PCB根据其阻塞原因的不同,排成多个阻塞队列,如等待I/O操作完成的队列和等待分配内存的队列等。
      在这里插入图片描述
    • ③、索引方式即系统根据所有进程状态的不同,建立几张索引表,例如,就绪索引表、阻塞索引表等,并把各索引表在内存的首地址记录在内存的一些专用单元中。
    • 在每个索引表的表目中,记录具有相应状态的某个PCB在PCB表中的地址。
      在这里插入图片描述

(三)、进程控制

  • 进程控制是进程管理中最基本的功能,主要包括创建新进程、终止已完成的进程、将因发生异常情况而无法继续运行的进程置于阻塞状态、负责进程运行中的状态转换等功能。
  • 进程控制一般是由OS的内核中的原语来实现的
(1)操作系统的内核
  • 将它们常驻内存,即通常被称为的OS内核。
  • 这种安排方式的目的在于两方面:一是便于对这些软件进行保护,防止遭受其他应用程序的破坏;二是可以提高OS的运行效率。
  • 相对应的是,为了防止OS本身及关键数据(如PCB等)遭受到应用程序有意或无意的破坏,通常也将处理机的执行状态分成系统态和用户态两种:
    • 系统态:又称为管态,也称为内核态。它具有较高的特权,能执行一切命令,访问所有寄存器和存储区,传统的OS都在系统态运行。
    • 用户态:又称为目态。它是具有较低特权的执行状态,仅能执行规定的指令,访问指定的寄存器和存储区。一般情况下,应用程序只能在用户态运行,不能去执行OS指令及访问OS区域,这样可以防止应用程序对OS的破坏。
  • (1)支撑功能
    该功能是提供给OS其它众多模块所需要的一些基本功能,以便支撑这些模块工作。其中三种最基本的支撑功能是:中断处理。时钟管理。原语操作
    • 进程创建和控制等都是由OS的内核中的原语来实现的
    • 原语:是由若干条指令组成的,用于完成一定功能的一个过程。
      它们是原子的操作。所谓原子的操作是指一个操作中的所有动作要么全做,要么全不做。
      原语是一个不可分割的基本单位,在执行过程中,不允许被中断
      原子操作在管态下执行,常驻内存。
  • (2)资源管理功能:①、进程管理。②、存储器管理。③、设备管理。
(2)进程的创建
  • (1)进程的层次结构

    • 子进程可以继承父进程所有的资源。当子进程被撤销时,应将其从父进程那里获得的资源归还给父进程。此外,再撤销父进程时,也必须同时撤销其所有的子进程
      在这里插入图片描述
    • 在windows中不存在任何进程层次结构的概念,所有的进程都具有相同的地位。
  • (2)进程图

    • 可用一条由进程Pi指向进程Pj的有向边来描述它们之间的父子关系。创建父进程的进程称为祖先进程,这样便形成了一棵进程树,把树的根结点作为进程家族的祖先(Ancestor)。
      在这里插入图片描述
  • (3)引起创建进程的事件

    • ①、用户登录:在分时OS中,用户在终端键入登录命令后,如是合法用户,则系统为该终端创建一进程,并插入就绪队列。
    • ②、作业调度:在批处理OS中,当按某算法调度一作业进内存,系统为之分配必要资源,同时为该作业创建一进程,并插入就绪队列。
    • ③、提供服务:在程序运行中,若用户需某种服务,则系统创建一进程为用户提供服务,并插入就绪队列。例如:打印进程
    • ④、应用请求:在运行中,由于应用进程本身的需求,自己创建一进程,并插入就绪队列。
  • (4)进程的创建

    • 在系统中每当出现了创建新进程的请求后,OS便调用进程创建原语Creat按下述步骤创建一个新进程:
      ①、申请空白PCB,为新进程申请获得唯一的数字标识符,并从PCB集合中索取一个空白PCB。
      ②、为新进程分配其运行所需的资源,包括各种物理和逻辑资源,如内存、文件、I/O设备和CPU时间等。
      ③、初始化进程控制块(PCB)。
      ④、如果进程就绪队列能够接纳新进程,便将新进程插入就绪队列。
      在这里插入图片描述
注意:1. 进程的标识符和进程控制块的分配发生在进程的创建阶段
2. 由调度程序为进程分配CPU的步骤不是创建进程所必须的。
(3)进程的终止
  • (1)引起进程终止(Termination of Process)的事件
    • 正常结束,表示进程的任务已经完成,准备退出运行。

    • 异常结束,是指进程在运行时发生了某种异常事件,使程序无法继续运行。常见的异常事件有:越界错、保护错、非法指令、特权指令错、运行超时、等待超时、算术运算错、I/O故障等。
      越界错误:这是指程序所访问的存储区已越出该进程的区域。
      保护错:指进程试图去访问一个不允许访问的资源或文件,或者以不适当的方式进行访问。
      非法指令:指程序试图去执行一条不存在的指令。出现该错误的原因,可能是程序错误的转移到数据区,把数据当成了指令。
      特权指令错:是指用户进程试图去执行一条只允许OS执行的指令。
      运行超时:是指进程的执行时间超过了指定的最大值
      等待超时:是指进程等待某事件的时间超过了指定的最大值
      算术运算错:是指进程试图去执行一个被禁止的运算,例如被0除
      I/O故障:是指在I/O过程中发生了错误等

    • 外界干预,是指进程应外界的请求而终止运行。这些干预有:操作员或操作系统干预、父进程请求、因父进程终止等。
      操作员或操作系统干预。由于某种原因,例如,发生了死锁,由操作员或操作系统终止该进程
      父进程请求:由于父进程具有终止自己的任何子孙进程的权利,因而当父进程提出请求时,系统将终止该进程
      父进程终止。当父进程终止时,OS也将它的所有子孙进程终止

  • (2)进程的终止过程
    如果系统中发生了要求终止进程的某事件,OS便调用进程终止原语,按下述过程去终止指定的进程:
    • ①、根据被终止进程的标识符,从PCB集合中检索出该进程的PCB,从中读出该进程的状态;
      ②、若被终止进程正处于执行状态,应立即终止该进程的执行,并置调度标志为真,用于指示该进程被终止后应重新进行调度;
      ③、若该进程还有子孙进程,还应将其所有子孙进程也都予以终止,以防它们成为不可控的进程;
      ④、将被终止进程所拥有的全部资源或者归还给其父进程,或者归还给系统;
      ⑤、将被终止进程(PCB)从所在队列(或链表)中移出,等待其它程序来搜集信息。
      在这里插入图片描述
(4)进程的阻塞与唤醒
  • (1)引起进程阻塞和唤醒的事件

    • ①、向系统请求共享资源失败。进程在向系统请求共享资源时,由于系统已无足够的资源分配给它,此时进程因不能继续运行而转变为阻塞状态。
      ②、等待某种操作的完成。当进程启动某种操作后,如果该进程必须在该操作完成之后才能继续执行,则应先将进程阻塞起来,以等待操作完成。
      ③、新数据尚未到达。对于相互合作的进程,如果一个进程需要先获得另一进程提供的数据后才能对该数据进行处理,只要其所需数据尚未到达,进程便只有阻塞。
      ④、等待新任务的到达。在某些系统中,特别是在网络环境下的OS,往往设置一些特定的系统进程,每当这种进程完成任务后便把自己阻塞起来,等待新任务的到来。
  • (2)进程阻塞过程

    • 正在执行的进程,如果发生了上述某事件,进程便通过调用阻塞原语block将自己阻塞。可见,阻塞是进程自身的一种主动行为
  • (3)进程唤醒过程

    • 当被阻塞进程所期待的事件发生时,比如它所启动的I/O操作已完成,或其所期待的数据已经到达,则由有关进程(比如提供数据的进程)调用唤醒原语wakeup,将等待该事件的进程唤醒。
    • wakeup执行的过程是:首先把被阻塞的进程从等待该事件的阻塞队列中移出,将其PCB中的现行状态由阻塞改为就绪,然后再将该PCB插入到就绪队列中。
      在这里插入图片描述
注意:一个进程被唤醒,意味着该进程可以重新竞争CPU
(5)进程的挂起与激活
  • (1)进程的挂起
    当系统中出现了引起进程挂起的事件时,OS将利用原语suspend将指定进程或处于阻塞状态的进程挂起。
    Suspend的执行过程是:
    首先检查被挂起进程的状态,若处于活动就绪状态,便将其改为静止就绪;
    对于活动阻塞状态的进程,则将之改为静止阻塞;

为了方便用户或父进程考查该进程的运行情况,而把该进程的PCB复制到某指定的内存区域; 最后,若被挂起的进程正在执行,则转向调度程序重新调度。

  • (2)进程的激活过程
  • 当系统中发生激活过程的事件时,OS将利用激活原语active,将指定进程激活。
    激活原语先将进程从外存调入内存,检查该进程的现行状态,若是静止就绪,便将之改为活动就绪;若为静止阻塞,便将之改为活动阻塞。
引入挂起状态的原因:

①、终端用户的需要:终端用户在自己程序运行中发现问题要求使正在执行的进程暂停执行而使进程处于挂起状态。
②、父进程的需要:父进程为了考查和修改某个子进程,或者协调各子进程间的活动,需要将该子进程挂起。
③、操作系统的需要:操作系统为了检查运行中的资源使用情况或进行记帐,而将某些进程挂起。
④、对换的需要:为了提高内存的利用率,将内存中某些进程挂起,以调进其它程序运行。
⑤、负荷调节的需要:由于工作负荷较重,而将一些不重要的进程挂起,以保证系统能正常运行(实时操作系统)
在这里插入图片描述

注意:当一个进程被终止、挂起、唤醒、阻塞时,可能会发生处理器的调度。

为使进程由活动就绪转变为静止就绪,应利用 suspend原语;
为使进程由执行状态转变为阻塞状态,应利用 block 原语;
为使进程由静止就绪变为活动就绪,就应利用 active 原语;
为使进程从阻塞状态变为就绪状态,应利用 wakeup 原语。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值