操作系统第三章 内存管理

文章目录

3.1 内存管理概念

  1. 对主存储器的访问,以字或者字节为单位

3.1.1 内存管理的基本原理和要求

不可能将所有用户进程和系统所需要的全部程序和数据放入贮存,因此操作系统必须对内存空间进行合理的划分和有效的动态分配

内存管理的主要功能:

  1. 内存空间的分配和回收
  2. 地址转换。多道程序环境下,程序中的逻辑地址和内存中的物理地址不可能一致,必须提供地址变换功能,将逻辑地址转换为相应的物理地址
  3. 内存空间扩充。利用虚拟存储技术或自动覆盖技术,从逻辑上扩充内存
  4. 内存共享:允许多个进程访问内存的统一部分,支持对内存共享区域进行受控访问
  5. 存储保护:保证各道作业在格子存储空间内运行,互不干扰
  1. 内存可以存放数据。程序在执行前需要先放到内存中才能被CPU处理(缓和CPU和硬盘之间的速度矛盾
  2. 内存中有很多存储单元,内存地址从0开始,每个地址对应一个存储单元,一个存储单元能存储多少比特位取决于计算机
  3. 讨论内存时,​​​1​K​=​​2​10​​=​1024​​1K = 2^{10} = 1024​1K=210=1024、​​​1​M​=​​2​20​​​1M = 2^{20}​1M=220、​​​1​G​=​​2​30​​​1G = 2^{30}​1G=230

1. 程序的链接与装入

创建进程首先要将程序和数据装入内存,将用户源程序变为可在内存中执行的程序,通常需要以下几个步骤

  1. 编译:由编译程序将用户源代码编译成若干目标模块
  2. 链接:由链接程序将编译形成的一组目标模块以及他们所需的库函数链接在一起,形成一个完整的装入模块
  3. 装入:由装入程序将装入模块装入内存运行

在这里插入图片描述

程序链接方式

  1. 静态链接:在程序运行之前,将各个目标模块以及库函数连接成完成装配模块,不再拆开。将几个模块装配成一个模块时,需要解决两个问题:1.修改相对地址,编译后的所有目标模块都是从0开始的相对地址,当链接成一个装入模块时要修改相对地址 2. 变换外部调用符号,将每个模块中所用的外部调用符号也都变换为相对地址。
  2. 装入时动态链接:用户源程序编译得到的一组目标模块,装入内存时,采用边装入变链接的方式(优点:便于更改和更新,便于对目标模块的共享)
  3. 运行时都动态链接:在程序执行中需要该模块时才进行链接。凡是运行时暂未被用到的模块,都不会被调入内存和链接到装入模块上。(优点:加快程序的装入过程,还可节省大量的内存空间)。

装入内存方式

1. 绝对装入

  1. 在编译时,如果知道程序将放到内存中的哪个位置,编译程序将产生绝对地址的目标代码。装入程序按照装入模块中的地址,将程序和数据装入内存。程序的逻辑地址与实际地址完全相同,不需要对程序和数据地址进行修改。(程序中所用的绝对地址,可在编译或汇编时给出,也可由程序员直直接赋值。而通常在程序中采用的是符号地址,编译或汇编时在转换为绝对地址)。
  2. 绝对装入只适用于单道程序环境

2. 可重定位装入

  1. 又称静态重定位。编译连接后装入模块的地址都从0开始,指令中使用的地址都是相对于起始地址而言的逻辑地址。装入模块装入到内存的时候进行重定位
  2. 重定位:装入时对目标程序中指令和数据地址进行修改的过程

静态重定位的特点是:

  1. 在一个作业装入内存时,必须分配其要求的全部内存空间,否则就不能装入该作业
  2. 作业一旦进入内存,在运行期间就不能再移动,也不能再申请内存空间

3. 动态运行时动态重定位

编译链接后的装入模块的地址都从0开始。装入程序将模块装入内存后,并不会立即把逻辑地址转换为物理地址,而是在真正执行时才进行。这种方法需要一个重定位寄存器支持

特点:

  1. 可以将程序分配到不连续的存储区中
  2. 程序运行前只需要装入部分代码即可投入运行
  3. 在程序运行期间可以根据需要,动态申请分配内存
  4. 便于程序段的共享
  5. 可以向用户提供一个比存储空间大得多的地址空间
  6. 允许程序在内存中移动

在这里插入图片描述

2. 逻辑地址和物理地址

逻辑地址

  1. 编译后,每个目标模块都从0号单元开始编址,称为该目标模块的相对地址(逻辑地址
  2. 程序在运行时使用的是逻辑地址,内存管理的具体机制对程序员和用户程序是透明的
  3. 不同进程可以有相同的逻辑地址,可以映射到主存的不同位置
  1. (11 408) 虚拟内存管理中,形成逻辑地址的阶段:编译

物理地址

  1. 内存中物理单元的集合。
  2. 是地址转换的最终地址。指令和数据都需要通过物理地址从主存中存取
  3. 装入程序将可执行代码装入内存时,必须通过地址转换将逻辑地址转换为物理地址(地址重定位

3. 进程的内存映像

一个程序调入内存运行时,就构成了进程的内存映像。一个进程的内存映像一般包括以下要素:

  1. 代码段:程序的二进制代码,只读,可被多个进程共享
  2. 数据段:程序运行时加工处理的对象,包括全局和静态变量
  3. 进程控制块PCB:存放在系统区,os通过PCB控制、管理进程
  4. 堆:存放动态分配变量malloc函数动态地向高地址分配空间
  5. 栈:用来实现函数调用。从用户空间最大地址往低地址增长

在这里插入图片描述

4. 内存保护

确保每个进程都有一个单独的内存空间。内存分配前,需要保护操作系统不受用户进程的影响,同时保护用户进程不受其他用户进程的影响

内存保护可以采取两种方法:

  1. 在CPU中设置一对上下限寄存器,存放用户作业在主存中的下限和上限地址。每当CPU要访问一个地址时,分别和两个寄存器的值比较,检查是否越界。
  2. 采用重定位寄存器(基地址寄存器)和界地址寄存器(限长寄存器)重定位寄存器包含最小的物理地址值,界地址寄存器包含逻辑地址的最大值内存管理机构动态地将逻辑地址与界地址寄存器进行比较,若未发生越界,则加上重定位寄存器的值后映射成物理地址,再送交内存单元

注意:重定位寄存器是用来"加"的,逻辑地址加上重定位寄存器中的值就能得到物理地址;界地址寄存器是用来“比”的,通过比较界地址寄存器中的值与逻辑地址的值来判断是否越界。

在这里插入图片描述

加载重定位寄存器和界地址寄存器需要使用特权指令。因此只要操作系统内核才可以修改这两个寄存器的值,不允许用户程序修改

5. 内存共享

  1. 并非所有进程内存空间都适合共享,只有只读的区域才可以共享
  2. 可重入代码(纯代码):允许多个进程同时访问,但不允许被任何进程修改的代码

6. 内存分配和回收

3.1.2 覆盖和交换技术*

在这里插入图片描述

3.1.3 连续分配管理方式

  1. 连续分配:为用户进程分配一个连续的内存空间
  2. 内部碎片:分配给某个进程的内存区域中,有些部分没有用上
  3. 外部碎片:内存中的某些空闲分区因为太小,难以利用

连续分配方式主要包括:单一连续分配、固定分区分配和动态分区分配

1. 单一连续分配

  1. 内存被分为系统区和用户区
  2. 系统区用于存放操作系统相关数据,仅供操作系统使用,通常在低地址部分
  3. 用户区用于存放用户进程相关数据
  4. 用户区中只能有一道用户程序,用户程序独占整个用户区空间

优点:实现简单;无外部碎片

缺点:只能单用户、单任务;有内部碎片,存储器利用率极低

2. 固定分区分配

  1. 将用户空间划分为若干个固定大小的分区,每个分区中只装入一道作业。
  2. 当有分区空闲时,便可从外存的后备作业队列中选择适当大小的作业装入分区。

划分分区时的方法:

  1. 分区大小相等:缺乏灵活性,适用于一台计算机控制多个相同对象的场合
  2. 分区大小不等:增加了灵活性,可以满足不同大小的进程需求

**操作系统需要建立一个数据结构,实现各个分区的分配和回收。**每个表项需要包括分区的大小、起始地址、状态

在这里插入图片描述
优点:实现简单,无外部碎片

缺点:用户程序过大时可能分区不能满足需求,需要覆盖技术,这会降低性能;会产生内部碎片

3. 动态分区分配

又称可变分区分配不会预先划分内存区,而是进程装入内存时,根据进程大小动态建立分区,使得分区的大小正好适合进程的需要

在这里插入图片描述

  1. 使用空闲分区表或者空闲分区链记录内存的使用情况
  2. 作业装入内存时,必须按照一定的动态分区分配算法
  3. 动态分区分配没有内部碎片,但是有外部碎片
  4. 可以使用紧凑技术来解决外部碎片

动态分区分配算法

首次适应算法(First Fit

思想:每次都从低地址开始查找,找到第一个能满足大小的空闲分区

实现:空闲分区按地址递增次序排列,每次分配内存时顺序查找空闲分区链/表,找到第一个满足要求的空闲分区

邻近适应算法(循环首次适应算法

思想:在首次适应算法基础上查找时不从头查找,而是从上次查找结束的位置开始

最佳适应算法(Best Fit

思想:优先使用小的空闲区,留下大片连续空间

实现:空闲分区按照容量递增次序链接,找到第一个能满足要求且最小的空闲分区分配给作业

缺点:会产生很多的外部碎片

最坏适应算法(最大适应算法

思想:为了解决最佳适应算法的问题,优先使用最大的空闲分区

实现:空闲分区按照容量递减次序链接,找到第一个满足要求的,即最大的分区

缺点:导致容量较大的空闲内存被迅速用完,之后如果有大进程到达,就没有空闲分区可用了

 首先各个存储管理的逻辑地址结构以及表

分页的逻辑地址结构:页号页内偏移量
页表结构:页号(隐含的)块号=>对应内存中的块
具有TLB快表结构页号块号=>对应内存中的块
两级页表:一级页号二级页号页内偏移量

 

分段的逻辑地址结构:段号段内偏移量
段表机构:段号段长本段在主存的始址

段页式的逻辑地址结构:段号页号页内偏移量
段表结构:段号页表长度页表始址
页表结构:页号块号

3.1.4 基本分页存储管理

  1. 固定分区产生内部碎片,动态分区产生外部碎片,对内存利用率低
  2. 分页:将主存空间划分为大小相等且固定的块,块作为主存的基本单位,每个进程也以块为单位划分,进程执行时,以块为单位逐个申请主存中的块空间,这样,进程在为最后一个不完整的块申请一个主存空间时,才产生主存碎片(页内碎片)。

1. 分页存储的基本概念

页面和页面大小

  1. 页/页面(Page):进程中的块
  2. 页框/页帧/内存块/物理块/物理页面(Page Frame):内存中的块
  3. 块/盘块(Block):外存中的块

为了方便地址转换,页面大小应该为2的整数幂。

同时页面大小应该适中,页面太小会使进程的页面数过多,这样页表就会过长,占用大量内存,而且会增加硬件地址转换的开销,降低页面换入/换出的效率;页面过大又会使页内碎片增多,降低内存的利用率。

地址结构

在这里插入图片描述

页表

  1. 为了得知进程的每个页面在内存块中存放的物理位置,操作系统需要为每个进程建立一张页表,通常存放在PCB中
  2. 页表记录页面在内存中对应的物理块号

页表项连续存放,因此页号可以是隐含的,不占存储空间(类比数组

页表记录的是内存块号而不是内存块起始地址,J号内存块起始地址=J*内存块大小(从0开始

页表是由页表项组成的,初学者容易混淆页表项与地址机构,页表项与地址都由两部分组成,而且第一部分都是页号,但页表项的第二部分是物理内存中的块号,而地址的第二部分是页内偏移;页表项的第二部分与地址的第二部分共同组成物理地址。

在这里插入图片描述

  1. 每个进程拥有一张页表,进程的页表驻留在内存中

2. 基本地址变换机构

  1. 基本地址变换机构:将逻辑地址转换为内存中的物理地址
  2. 地址变换借助页表实现
  3. 以下地址变换过程是硬件自动完成的

在这里插入图片描述

  

  1. 页式存储管理中,页表的起始地址存放在寄存器
  2. 影响磁盘访问时间的主要因素通常不是页面大小,使用时优先考虑较大的页面

  

3. 具有快表的地址变换机构

若页表全部放在内存中,则存取一个数据或一条指令至少需要访问两次内存

  1. 第一次访问页表,确定存取的数据或指令的物理地址
  2. 第二次根据地址存取数据或指令

为了提高指令执行速度,在地址变换机构中增加一个具有并行查找能力的高速缓冲存储器——快表,又称相联存储器(TLB),用于存放当前访问的若干快表项

相对的,主存中的页表称为慢表
在这里插入图片描述

4. 两级页表

  1. 为页表再建立一张页表,称为页目录表(顶级页表、外层页表)
  2. 建立多级页表的目的在于建立索引,不用浪费主存空间去存储无用的页表项

在这里插入图片描述
在这里插入图片描述

 

 

  1. 多级页表优点:减少页表所占连续内存空间
  2. 已知系统32位实地址,48位虚拟地址,页面大小4KB,页表项8B,系统采用纯页式存储,则需要?级页表,页内偏移?位
    页面大小4KB,则页内偏移12位
    一页可以存4KB/8B=2^9个页目录
    剩余36位,需要4级页表

3.1.5 基本分段存储管理

  1. 分页管理方式从计算机角度考虑设计。通过硬件机制实现,对用户完全透明
  2. 分段管理考虑了用户和程序员,满足方便用户编程、信息共享和保护、动态增长以及动态链接

与分页最大的区别就是:离散分配时所分配的地址空间的基本单位不同

1. 分段

  1. 进程按照自身逻辑关系划分为若干个段,每个段都有一个段名,从0开始编址
  2. 内存分配规则:以段为单位进行分配,每个段在内存中占据连续空间,但各个段之间可以不相邻

在这里插入图片描述

  1. 段号的位数决定了每个进程最多可以分多少段
  2. 段内地址的位数决定了每个段的最大长度是多少

页式系统中,逻辑地址的页号和页内偏移量对用户是透明的;而段式系统中,段号和段内偏移量必须用户显式提供,在高级程序设计语言中,这个工作由编译程序完成。

2. 段表

每个进程都有一张逻辑空间与内存空间映射的段表,其中每个段表项对应进程的一段,段表项记录该段在内存中的始址和长度。

目的:从物理内存中找到各个逻辑段的存放位置,所以为每个进程建立一张段映射表

在这里插入图片描述

3. 地址变换机构

在这里插入图片描述

 

 

同样可以引入快表,加快访问

4. 段的共享和保护

在这里插入图片描述

  

 

 

3.1.6 段页式管理

在这里插入图片描述


在这里插入图片描述

 

根据课后题总结的知识点:

  1.  段页式系统中,进程首先划分为段,每段进一步划分为页。
  2. 内存保护由操作系统和硬件机构的合作完成。
  3. 静态装入是指在编程阶段就把物理地址计算好。  可重定位是指在装入时把逻辑地址转换成物理地址,但装入后不能改变。动态重定位是指在执行时再决定装入的地址并装入,装入后有可能会换出,所以同一个模块在内存中的物理地址是可能改变的。  动态重定位是指在作业运行过程中执行到一条访存指令时,再把逻辑地址转换为主存中的物理地址,实际中是通过硬件地址转换机制实现的。
  4. 分页存储管理有内部碎片。分段存储管理有外部碎片。固定分区存储管理有内部碎片,段页式存储管理方式有内部碎片
  5. 段式管理中有段地址越界保护。
  6. 内存分页管理是在硬件和操作系统层面实现的,对用户,编译系统,连接装配程序等上层是不可见的。
  7. 整个系统中设置一张重定位寄存器。
  8. 分段:方便编程,分段共享,分段保护,动态链接和动态增长。
  9. 分页,分段都是两次访存, 段页式是3次。
  10. 分页是一维的, 分段是二维的, 段页式是二维的。
  11. 最佳适应算法最容易产生最多的内存碎片。
  12. 页目录表就是一级页表。

3.2 虚拟内存管理

3.2.1 虚拟内存基本概念

1. 传统存储管理方式的特征和缺点

指的是上面一系列存储管理方式

  1. 许多暂时用不上的数据也会长期占用内存,导致内存利用率不高
  2. 一次性:作业必须一次性全部装入内存才能开始运行
    1. 作业很大时不能全部装入内存,导致大作业无法运行
    2. 大量作业需要运行时,由于内存无法容纳所有作业,因此只有少量作业能运行,导致并发度下降
  3. 驻留性:作业一但装入内存,就一直驻留在内存中直到运行结束。事实上一个时间段内只需要访问作业的一小部分数据即可正常运行,这就导致了内存中驻留大量的暂时用不到的数据

2. 局部性原理

  • 时间局部性:执行了程序中某条指令后,不久这条指令很可能再次执行;数据也是(原因是程序中存在大量循环
  • 空间局部性:访问了某个存储单元后,不久其相邻的存储单元也很可能被访问(原因是很多数据在内存中连续存放,指令也是顺序存放

广义上讲,快表、页高速缓存、虚拟内存技术都属于高速缓存技术,依赖的原理就是局部性原理

虚拟内存技术实际上建立了“内存-外存”的两级存储器结构,利用局部性原理实现高速缓存

3. 虚拟存储器的定义和特征

  1. 基于局部性原理,在程序装入时,将程序中很快会用到的部分装入内存,暂时用不到的部分留在外存,就可以让程序开始执行
  2. 在程序执行过程中,当访问的信息不在内存时,由操作系统负责将所需信息从外存调入内存,然后继续执行程序
  3. 此时用户看来似乎有一个比实际内存大得多的内存,称为虚拟存储器。

虚拟内存三个主要特征

  1. 多次性无需在作业运行时一次装入所有内存,而是分为多次调入内存。只需要将当前运行的那部分程序和数据装入内存即可开始运行,需要运行尚未调入的部分时再调入那部分,多次行是虚拟存储器最重要的特征。
  2. 对换性在作业运行时无需一直常驻内存,而是允许在作业运行过程中将作业换入换出
  3. 虚拟性从逻辑上扩充了内存容量,使用户看到的内存容量远大于实际的容量

4. 虚拟内存技术实现

需要建立在离散分配的内存管理方式基础上,分为以下三种方式

  • 请求分页存储管理
  • 请求分段存储管理
  • 请求段页式存储管理

均需要一定的硬件支持,一般包括

  • 一定容量的内存和外存
  • 页表/段表机制,作为主要的数据结构
  • 中断机构。用户程序需要访问的部分未调入内存时,产生中断
  • 地址变换机构。实现逻辑地址到物理地址的变换
  1. 虚拟存储器系统页表项中,决定是否发生页故障的是:合法位

3.2.2 请求分页管理方式

  1. 请求分页系统建立在基本分页系统基础上,增加请求调页功能和页面置换功能
  2. 只需要将当前需要的一部分页面装入内存,便可以启动作业运行
  3. 在作业执行过程中,需要访问的页面不在内存中时,通过调页功能将其调入内存
  4. 可通过置换功能将暂时不同的页面换出外存,腾出内存空间

为了实现请求分页,系统必须提供一定的硬件支持。除了需要一定容量的内存及外存的计算机系统,还需要页表机制,缺页中断机构和地址变换机构。 

1. 页表机制

  1. 系统需要知道页面是否已经调入;若没有调入,需要知道该页面在外存的位置。
  2. 没有修改过的页面不用浪费时间写回外存;操作系统需要记录各个页面是否被修改过的信息。

在这里插入图片描述

2. 缺页中断机构

  1. 要访问的页面不在内存时,产生一个缺页中断,然后由操作系统的缺页中断处理程序处理中断
  2. 此时缺页的进程阻塞,放入阻塞队列调页完成后唤醒,放回就绪队列
  3. 如果内存中有空闲块,则为进程分配一个空闲块,所缺页面装入,并修改页表中相应的页表项
  4. 如果没有空闲块,则由页面置换算法选择一个页面淘汰;若页面在内存期间被修改过,则写回外存
  • 缺页中断属于内中断故障类型(可能被故障处理程序修复
  • 一条指令在执行期间可能产生多次中断

3. 地址变化机构

在这里插入图片描述

 

3.2.3 页框分配

1. 驻留集大小

驻留集:给一个进程分配的物理页框的集合

  1. 分配给一个进程的页框越少,驻留在主存中的进程就越多,可以提高CPU利用率
  2. 若一个进程在主存中页面太少,则缺页率会提高
  3. 若分配的页框过多,由于局部性原理,对该进程的缺页率没有明显影响

2. 内存分配策略

内存分配:固定、可变分配策略
页面置换:全局、局部置换

组合出三种策略

1. 固定分配局部置换

  1. 为每个进程分配一定数量物理块,进程运行期间不改变
  2. 运行过程出现缺页,则从分配给该进程的内存中选择一页换出。保证分配给该进程的内存空间大小不变

难以确定应为每个进程分配的物理块数目,太少会频繁出现缺页中断,太多又会降低CPU和其他资源的利用率。 

2. 可变分配全局置换

  1. 为每个进程分配一定数量的物理块,在进程运行期间可根据情况适当增加/减少
  2. 进程运行期间发生缺页,os从空闲物理队列中选出一块分配给进程,缺页调入

这种方法比固定分配局部置换更加灵活,可以动态的增加进程的物理块,但也存在弊端,如他会盲目的给进程增加物理块,从而导致系统多道程序的并发能力下降。 

3. 可变分配局部置换

  1. 为每个进程分配一定数量的物理块,在进程运行期间可根据情况适当增加/减少
  2. 运行过程出现缺页,则只允许从分配给该进程的内存中选择一页换出

若进程在运行中频繁地发生缺页中断,则系统再为该进程分配若干物理块,直至该进程的缺页率趋于适当程度;反之,若进程在运行中的缺页率特别低,则可适当减少分配给该进程的物理块,但不能引起其缺页率的明显增加。 

3. 物理块调入算法

采用固定分配策略,将系统中的空闲物理块分配给各个进程,可采用以下几种算法

  1. 平均分配算法:将系统中所有可供分配的物理块平均分配给各个进程。
  2. 按比例分配算法:按照进程的大小比例分配物理块。
  3. 优先权分配算法:为重要和紧迫的进程分配较多的物理块。通常采用的方法是把所有可分配的物理块分成两部分:一部分按比例分配给各个进程;一部分则根据优先权分配。

4. 调入页面的时机

在这里插入图片描述

5. 从何处调入页面

在这里插入图片描述

6. 如何调入页面

在这里插入图片描述

3.2.4 页面置换算法

进程运行时,若其访问的页面不在内存中而需将其调入,但内存中已无空闲空间时,就需要从内存中调出一页程序或数据,送入磁盘的对换区。

页面的换入换出需要磁盘IO,开销较大,因此好的页面置换算法需要追求更少的缺页率

1. 最佳置换算法(OPT

  1. 淘汰以后永不使用,或者最长时间内不再被访问的页面保证最低缺页率
  2. 需要知道进程接下来访问哪些页面,然而这是无法预知的,因此最佳置换算法是无法实现的,但可以利用该算法评价其他算法
  3. 题目做法:内存满需要换页时,往后查找当前内存中的页面首次出现需要访问的位置,淘汰最后出现的页面

在这里插入图片描述

2. 先进先出置换算法(FIFO

  1. 每次淘汰的页面是最早进入内存的页面
  2. 实现:用一个队列,根据页面调入内存的时间根据先后次序链接
  3. Belady异常:为进程分配的物理块数增大时,缺页次数不减反增的异常现象只有FIFO算法会产生Belady异常
  4. 该算法与进程实际运行时的规律不相适,先进入的页面也有可能最常被访问,算法性能差

3. 最近最久未使用置换算法(LRU

  1. 过去一段时间内未访问的页面,在最近的将来也不会被访问。每次淘汰最近最久未使用的页面
  2. 需要寄存器和栈的硬件支持,实现难,虽然性能好(堆栈类算法不会出现Belady异常
  3. 做题:内存满需要换页时,向前查找当前内存中的页面最近一次被访问的时间,淘汰最早出现的页面

`1. 导致LRU算法实现起来耗费高的原因:需要对所有页进行排序

4. 时钟置换算法(CLOCK

1. 简单CLOCK置换算法

在这里插入图片描述

2. 改进型CLOCK置换算法

在这里插入图片描述

3.2.5 抖动和工作集

在这里插入图片描述

3.2.6 内存映射文件

 

3.2.7虚拟存储器性能影响因素

3.2.8 地址翻译 

 

3.2.9本节小结 

408 真题

(10 408)

  • 页面调度算法
  • 请求分页管理:先根据页面大小确定页内偏移位数、页号位数

(12 408)

  • 驻留集 在这里插入图片描述

(17 408)

  • 页式管理,地址结构
  • IO,中断控制
  • 进程状态变化
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值