操作系统期末复习

news/2024/7/24 11:05:29 标签: 操作系统

操作系统概论

文章目录

  • 操作系统概论
  • 操作系统的运行机制
    • 时钟管理
    • 中断机制:
    • 指令
    • 程序
    • 处理机状态
    • 原语:由若干指令组成的程序段,完成特定功能
    • 系统数据结构
    • 系统调用
    • 体系结构
    • 进程--资源分配和调度的基本单位
    • 线程
      • 进程和程序的区别:
      • 进程和线程的区别:线程降低了创建撤销和切换可执行实体的难度和成本
    • 处理机调度
      • 处理机调度层次:
      • 算法:
  • 进程通信
    • 进程同步
      • 进程同步实现方法:
    • 死锁
      • 解决死锁的方法
    • 内存管理
        • 进程运行的基本原理:
        • 用户程序的主要处理阶段
        • 连续分配管理方式:
        • 动态分区算法
        • 非连续分配管理方式:直接分散的装入不连续的分区
        • 分页与分段方式对比
  • 虚拟内存管理
    • 页面置换算法
      • 虚拟存储器的实现方法
  • 输入输出管理
    • I/O设备
      • I/O设备组成
        • I/O控制器的基本功能:
        • I/O控制器的组成
      • I/O通道
      • 假脱机系统组成
        • 假脱机系统特点
        • 假脱机打印实现
      • 缓冲的引入
      • 磁盘访问时间
        • 磁盘调度算法
  • 文件系统
      • 单级文件目录
      • 两级文件目录

操作系统:(OS)用于控制和管理计算机的硬件和软件资源的程序集合

计算机系统的构成:用户,应用程序,操作系统(OS),硬件(裸机)
在这里插入图片描述

OS->系统软件

管理与配置内存,决定资源供需的优先次序,控制输入与输出设备,提供网络与管理文件系统等基本事务,提供一个让用户与系统交互的操作界面。

  1. 硬件交互
  2. 对(硬件)资源共享进行调度管理
  3. 解决并发操作处理中存在的协调问题
  4. 数据结构复杂,外部接口多样,便于用户使用

操作系统的目标:

有效性(系统资源利用率,系统吞吐量)————管理系统(硬件)资源

方便性————用户

可扩充性

开放性————扩充机器

基本特征:

在这里插入图片描述

  1. 并发:时间段内执行多个程序,时刻上是单个程序(分时交替执行)

    并行:同一时刻执行二到多个程序

  2. 共享:计算机系统资源被多个进程共用

    1. 同时访问:同一时段允许多个程序同时访问共享资源
    2. 互斥访问:独占式,多个程序在同一个共享资源上独立而互不干扰的工作
    3. 共享硬件设备(打印机,音频,视频设备)

    并发与共享互为前提,资源共享,多道程序同时访问;多道程序,需要共享

  3. 异步:以不可预知的速度进行

    1. 运行时机
    2. 因何暂停
    3. 时间片
    4. 程序性能
  4. 虚拟:物理实体划分为多个逻辑实体

    1. 时分复用技术TDM
      1. 虚拟处理机
      2. 虚拟设备
    2. 空分复用技术SDM
      1. 虚拟磁盘
      2. 虚拟储存器

基本特征:并发,共享(互为存在条件)

主要功能

  1. 系统资源的管理
    1. 处理机管理:进程控制,同步,通信,死锁处理,处理机调度。
    2. 存储器管理:内存分配,内存保护,地址映射,共享,扩充
    3. 文件管理:文件存储空间的管理,目录管理,文件读写管理于保护
    4. I/O设备管理:缓冲管理,设备分配,设备处理,虚拟设备
  2. 用户接口
    1. 程序接口
    2. 命令接口
    3. GUI图形用户接口
  3. 对计算机资源的抽象
    1. 硬件资源抽象成软件资源,方便使用
    2. 开放简单的访问方式,隐藏实现细节

发展

  1. 手工操作阶段:人机速度矛盾,用户独占,CPU等待人工

    1. 脱机输入/输出:外围机,内存一次一个程序
  2. 批处理阶段:(出现操作系统

    1. 单道批处理:监督程序,缓解人机速度矛盾,系统资源利用率低,一道程序,CPU等待IO
    2. 多道批处理:调度程序,多道程序并发执行,资源利用率高(I/O时CPU不闲置),无人机交互,平均周转时间长
  3. 分时操作系统:(公平)提供人机交互,不可以优先处理紧急事务(不可以插队)(人与人的交互性)

    1. 多路性:时间片轮转
    2. 独立性:用户独立
    3. 及时性:短时间内响应
    4. 交互性:请求多种服务
  4. 实时操作系统:可以处理紧急事务(人与系统的交互性-资源共享),周期/非周期任务,硬实时:规定时间内完成,软实时:截止时间不严格

    1. 即时性:用户能接受的等待时间
    2. 可靠性:多级容错,保障系统和数据安全

    可靠性 实时>分时 交互性 分时>实时

  5. 微机操作系统:个人计算机

  6. 网络操作系统:资源共享,远程通信

  7. 分布式操作系统:分布性,并行性

操作系统的运行机制

在这里插入图片描述

时钟管理

  • 计时:提供系统时间
  • 时钟中断:比如进程切换

中断机制:

  • 提高多道程序环境下的CPU利用率
  • 内中断(异常,内部信号)
    自愿中断-指令中断
    强迫中断:硬件中断,软件中断
    • 陷入/应用程序:主动引发:陷入指令(访管指令)由CPU产生
    • 故障:由错误条件引发
    • 终止:由致命错误引发
  • 外中断(外部信号):外设请求,人工干预

中断处理过程:

  1. 产生中断:关中断(CPU不响应高级中断请求)–保存断点–引出服务程序–保存现场和屏蔽字–开中断
  2. 执行中断服务程序(此时CPU可以并发)
  3. 回收中断:关中断–恢复现场和屏蔽字–开中断–中断返回

指令

特权指令:(非用户指令)只允许操作系统使用。例:IO指令,中断指令

非特权指令:普通运算指令

(访管指令:用户自愿进入核心态)

程序

内核程序:系统管理者,执行一切指令,运行在核心态上

应用程序:普通用户程序,只能执行非特权指令运行在用户态上

处理机状态

用户态(目态):非特权指令

核心态(管态、内核态):所有指令

用户->核心:通过中断(硬件完成)

核心->用户:特权指令psw的标志位:0为用户,1为核心

原语:由若干指令组成的程序段,完成特定功能

  1. 处在操作系统最底层,最接近硬件
  2. 运行具有原子性,操作不可中断
  3. 运行时间短,,调用频繁

操作系统通过原语实现进程控制

系统数据结构

  1. 进程管理:作业控制块,进程控制块
  2. 存储器管理:存储器分配与回收
  3. 设备管理:缓冲区,设备控制块

系统调用

系统提供OS接口,在用户态发生,由核心态处理

  1. 操作系统实现,给应用程序调用
  2. 是一套接口的集合
  3. 应用程序访问内核服务的方式

体系结构

  1. 传统的操作系统结构-无结构OS

    1. 一系列程序的集合,过程将可以相互调用
    2. 结构复杂且混乱,难以调试、阅读和维护
  2. 模块化结构OS:模块-接口法OS

    1. 基于分解和模块化原则
    2. 按照功能划分模块/子模块,规定模块间的接口
    3. 模块独立性标准:高内聚、低耦合

    优点:提高OS设计的正确性,可理解性和可维护性,增强了适应性,加速开发过程

    缺点:男易扩展后续需求,设计没有统一标准,导致模块接口设计不可靠

  3. 分层式OS

    1. 有序分层:自顶向下依次依赖
    2. 自底向上设计,每一步基础可靠

    优缺点:易保正系统正确性,易扩充和维护,层次通信导致效率降低

  4. 微内核OS系统:

    1. 足够小的内核,只实现核心功能,进程调度,低级存储器管理,中断和陷入管理
    2. 应用机制与策略分离原理
    3. 采用面向对象技术

    优点:扩展性,可靠性,可移植性提高,支持分布式系统,融入了面向对象技术

    缺点:比早期的OS,降低了一定的效率

进程–资源分配和调度的基本单位

目的:更好的描述和控制程序并发执行,实现操作系统的并发性和共享性

定义:计算机程序关于某数据集合的一次运行活动,是系统进行资源分配和调度的基本单位。

组成

  1. PCB:保护进程运行期间相关的数据,是进程存在的唯一标志
    
  2. 程序段:能被进程调度到CPU的代码,可被多个进程共享
  3. 数据段:存放数据,存放原始数据和中间数据

特征:

  1. 动态性:创建生,撤销亡
  2. 并发性:多个进程同时运行
  3. 独立性:独立资源分配
  4. 异步性:相互独立,互不干扰

状态

  1. 运行态:进程占用CPU
  2. 就绪态:进程准备运行,获得了除处理机以外的一切资源,得到处理机即可运行
  3. 阻塞态:进程等待某一事件不能使用CPU
  4. 创建状态:进程正在被创建
  5. 结束状态:进程正在从系统消失

状态变化

  • 就绪->运行:就绪的进程获得处理机资源(时间片)
  • 运行->就绪:时间片用完或有更高级的进程进入
  • 运行->阻塞:进程所需资源未准备好
  • 阻塞->就绪:进程等待的事件到来
    在这里插入图片描述

线程

目的:更好的使用多道程序并发执行提高资源利用率和系统吞吐量

程序执行的最小单位(运算调度的最小单位)

进程和程序的区别:

进程是动态的,程序是静态的,程序是有序代码的集合

进程是程序的执行

进程是暂时的,程序是永久的,进程是状态变化的过程

进程的组成包括程序、数据、和进程控制块(进程状态信息)

通过多次执行,一个程序可对应多个进程

通过调用关系,一个进程可包括多个程序

进程和线程的区别:线程降低了创建撤销和切换可执行实体的难度和成本

  1. 调度:线程是调度的基本单位,不同线程的切换不影响进程的切换
  2. 进程是资源分配的基本单位
  3. 引入线程和进程都是为了提高系统的并发性
  4. 线程间的切换相比进程减少了系统的开销
  5. 进程之间的地址空间是相互独立的,同一进程的线程共享地址空间
  6. 线程间的通信比同一进程间的通信简单

处理机调度

概念:对处理机进行分配,即从就绪队列中按照既定的算法(公平、高效)选择一个进程并将处理机分配给它运行,以实现进程的并发执行

前提作业,进程数远大于处理机数

目的:提高资源利用率,减少处理及空闲时间

调度程序:快速响应,考虑系统效率(平均周转时间)和调度算法开销

处理机调度层次:

  • 高级调度(作业调度):后备作业调入内存,调入一次,调出一次
  • 中级调度(内存对换):进程在内,外存区的对换
  • 低级调度(进程调度):从就绪队列选择进程到处理机,基本调度,频率高(时间片)
    在这里插入图片描述

调度方式

  1. 剥夺(抢占)式:
    1. 暂停当前进程
    2. 分配给另一个进程
    3. 优先,短优先,时间片
  2. 非剥夺式
    1. 进程请求
    2. 等待当前进程完成或阻塞
    3. 缺:适用于批处理,不适用分时/实时

调度准则

CPU利用率=忙碌时间/总时间、
系统吞吐量=完成作业数/总时间、
周转时间=完成时间-提交时间  带权周转=周转时间/实际运行时间
等待时间=等待调度时间
响应时间=提交-第一次响应时间间隔

调度时机:运行完\时间片完\I/O操作\原语操作\高优先级(剥夺式)

调度过程:保存镜像->调度算法->进程切换(分配处理机)->处理机回收

算法:

  1. 先来先服务FCFS
    1. 队列,等待完成或阻塞
    2. 顺序执行
    3. 非抢占式
  2. 短作业优先、SJF:预估周转时间最短优先
    1. ,最少的平均(带权)周转
    2. 非抢占式
    3. 平均周转时间最少
  3. 优先级调度算法、HRRN:优先级高的先调度
    1. 静态/动态
    2. 系统>用户,交互>非交互,I/O>计算
  4. 高响应比调度算法、PSA:响应比高的优先
    1. 非抢占式
    2. (等待时间+服务时间)/服务时间>=1
    3. 长时间等待时间越久,更容易获得处理机
  5. 时间片轮转、RR:公平
    1. 队列顺序,轮流使用时间片,时钟中断
    2. 抢占式
    3. 进程调度
    4. 适用于分时系统
  6. 多级反馈队列调度算法MFQ:PSA+RR
    1. 多个优先级排序
    2. 优先级高->低,时间片小->大
    3. 未执行完的,降级一次,时间片扩大一次
    4. 进程调度,抢占式

进程通信

进程间的信息交换,进程是资源分配的基本单位,内存空间彼此独立,

  1. 共享存储
    1. 共享数据结构:
      1. OS提供并控制共用
      2. 用户负责同步
      3. 低级通信:少量数据,效率低
    2. 共享存储区:存在安全隐患
      1. 共用内存的一块区域
      2. 由进程控制数据的形式和方式
      3. 高级通信:大量数据,效率高
  2. 消息传递:
    1. 直接通信:
      1. 指明ID,使用send发送使用receive接受,
      2. 维护消息缓冲队列,消息:(消息头(双方ID)+消息类型+长度+消息体)
    2. 间接通信:原语操作
      1. 信箱媒介
      2. 可以广播
  3. 管道通信
    1. 用于读/写进程的共享文件,pipe文件
    2. 本质是固定大小的缓冲区
    3. 同时间段只能单向通信,双通信要两个管道
    4. 先进先出(FIFO)组织传输
    5. 系统调用read()和write()读写

在这里插入图片描述

进程同步

**引入原因:**协调进程之间的相互制约关系

制约关系

同步:直接制约,进程合作,因需要在某些位置上协调工作次序二等待,传递信息所产生

互斥:间接制约,排他性使用共享资源

临界资源:一次只允许一个进程访问的资源

临界区:在每个进程中访问临界资源的那段程序(代码)

临界区互斥

  1. 空闲让进:一次只允许一个进程进入临界区
  2. 忙则等待:由于临界区进程只能有一个,所以其他进程必须等待
  3. 有限等待:进入临界区的进程要在有限时间内退出,以便于其他进程能够及时进入
  4. 让权等待:若进程不能进入自己的临界区,则应让出CPU,避免”忙等“

互斥访问实现:进入加锁->访问共享资源->退出解锁->其余代码

进程同步实现方法:

  1. 软件实现
    1. 单标志:违背空闲让进
    2. 双标志先检查后赋值:违背忙则等待
    3. 双标志后检查先赋值:违背空闲让进,有限等待
    4. 皮特森算法:违背让权等待
  2. 硬件实现
    1. 中断屏蔽:
    2. TS指令:违背让权等待
    3. Swap指令:交换变量的值(原子操作),违背让权等待

信号量机制:PV操作(p-等待、v-唤醒)

  • 整形信号量:违背让权等待
  • 记录型信号量:进程阻塞不会忙等

信号量S 负几表示有几个等待进程,0没有可用资源,没有等待进程,正几表示有几个可用资源

管程???

死锁

原因:非剥夺资源的竞争和进程的不恰当推进顺序

定义:多个进程因争夺资源产生的僵局,没有外力,则无法推进

必要条件:

  1. 互斥:共享资源的排他访问
  2. 不剥夺:访问时不可剥夺
  3. 请求并保持:保持当前资源并请求访问另一个资源
  4. 循环等待:多个进程都在等待其他进程释放资源->等待链

解决死锁的方法

  1. 预防:
    1. 破坏互斥条件
    2. 破坏不剥夺条件
    3. 破坏请求和保持条件
    4. 破坏循环等待条件
  2. 避免:
    1. 安全状态:安全一定不死锁,不安全不一定死锁
    2. 银行家算法:判断是否会导致死锁,是则拒绝,否则允许
  3. 检测:死锁定理:资源分配图不可完全简化
    1. 资源分配图
  4. 解除:资源剥夺、撤销进程、进程回退

在这里插入图片描述

n个资源被x个进程竞争,每个进程最多要求m个资源,则系统不会发生死锁时。
x取值不超过?

x*(m-1)<= n

内存管理

目的:更好的支持多道程序并发执行

功能

  1. 内存空间的分配与回收存储的保护与共享:
  2. 各道作业互不干扰地址转换:
  3. 逻辑地址->相应的物理地址内存扩充:
  4. 虚拟存储技术和自动覆盖技术,从逻辑上扩充内存

存储器的结构:
在这里插入图片描述

进程运行的基本原理:

  • 程序的装入

    • 绝对装入:
      • 装入前知道装入位置,
      • 单道程序环境
    • 可重定位装入:
      • 不可预知位置
      • 多道程序环境

    以上均一次性全部装入

    • 动态运行装入
      • 一次只装入部分

用户程序的主要处理阶段

  1. 编辑:创建源文件
  2. 编译:编译,生成目标文件
  3. 链接:将所需库函数链接与目标模块链接,生成可执行文件
    1. 静态链接:装入前链接
    2. 装入时动态链接:
    3. 运行时动态链接
  4. 装入:装入内存执行
  5. 运行:得出结果

涉及到逻辑地址与物理地址的变化 以及 内存保护

内存扩充???

连续分配管理方式:

  1. 单一连续:用户区内存独占
    1. 实现简单,无外部碎片,不一定要内存保护
    2. 单用户单任务,内部碎片,存储利用率低
  2. 固定分区:多道程序,多个固定分区

以上都是预先分好分区

  1. 动态分区:
    1. 空闲分区表[分区号|大小|起始地址|状态]
    2. 回收相邻空间要合并,更新表或链的记录

动态分区算法

  1. 基于顺序的
    1. 首次适应:从低地址查找合适空间
    2. 循化首次适应:从上次查找的下一个开始
    3. 最佳适应:优先使用最小空闲空间
    4. **最坏适应:**优先使用最大连续空间
  2. 基于索引搜索的
    1. 快速适应
    2. 伙伴系统
    3. 哈希算法

以上作业必须连续

动态分区重定位:

紧凑:移动或重定位作业地址利用碎片空间

非连续分配管理方式:直接分散的装入不连续的分区

  1. 基本分页存储:大小相等的(逻辑)页或(物理)块-需要页表(PCB中)记录程序分了多少页,以及页号
  2. 基本分段存储:不同大小的段
  3. 段页式存储

计算

基本变换计算
物理地址=(页号->块号)+偏移量
页号p=逻辑地址A/页面长度(大小)L
偏移量W=逻辑地址A%页面长度L

分页与分段方式对比

同:

  1. 都是非连续分配(离散分配)
  2. 都通过地址映射实现地址变换

  1. 页是物理单位,段是逻辑单位
  2. 页大小固定由系统决定,段不固定由编译系统划分
  3. 页是一维的地址空间,段是二维的
  4. 分段有利于信息共享和保护

虚拟内存管理

概念:具备请求调入和置换的,从逻辑上对内存容量扩充的存储器系统

虚拟内存=内存+外存

局部性原理:

  • 时间
  • 空间

虚拟内存特征

  • 多次
  • 对换
  • 虚拟

常规存储器特证

  • 一次性
  • 驻留性

页面置换算法

  1. 最佳置换OPT:无法实现,最小缺页率
  2. FIFO先进先出置换:淘汰最早进入的
  3. 最近最久置换算法:淘汰最近最久未使用的页面
  4. 时钟置换NRU:设计访问位,访问后置为一,淘汰时置为零跳过,为零时淘汰
  5. 改进型时钟置换:

虚拟存储器的实现方法

  1. 请求分页系统=分页+请求调页+页面置换
  2. 请求分段系统=分段+请求调段+分段置换

缺页率:f=访问失败(需要调入)次数/总的访问次数

  1. 页面大小
  2. 进程所分配物理块的数目
  3. 页面置换算法
  4. 程序固有特性

输入输出管理

I/O设备

交互类,存储类,网络通信

I/O设备组成

机械部件:

电子部件:I/O控制器,设备控制器,CPU与硬件之间的桥梁

I/O控制器的基本功能:

  1. 接受并识别CPU命令
  2. 向CPU报告设备状态
  3. 数据交换
  4. 地址识别

I/O控制器的组成

在这里插入图片描述

  • CPU与控制器间的接口
  • I/O逻辑
  • 控制器与设备间的接口

I/O通道

概念:I/O通道是特殊的处理机,具备执行i/O指令的能力,并通过执行i/o通道程序来控制I/O操作

通道执行过程:

  1. cpu向通道发送I/O指令
  2. 通道收到指令取出并执行通道程序
  3. 完成任务后,通道向CPU发送中断信号

假脱机系统组成

  1. 输入输出井
  2. 输入输出缓冲区
  3. 输入输出进程
  4. 井管理程序

假脱机系统特点

  1. 提高i/o速度
  2. 独占设备改为共享设备
  3. 实现了虚拟设备功能

假脱机打印实现

  1. 磁盘缓冲区
  2. 打印缓冲区
  3. 假脱机管理进程和假脱机打印进程

缓冲的引入

  1. 缓和CPU与I/O设备速度矛盾
  2. 减少CPU中断频率,放宽响应时间限制
  3. 解决数据粒度不匹配问题
  4. 提高CPU和I/O设备并行性

磁盘访问时间

  1. 寻道时间=(磁盘速度*n条磁道)+磁臂启动时间k
  2. 平均旋转延迟时间=1/2*磁盘秒转速r
  3. 传输时间=读写字节数/r*磁道字节数
  4. 访问时间=寻道时间+延迟时间+传输时间

磁盘调度算法

  1. FCFS:请求时间顺序
  2. SSTF:最近

文件系统


单级文件目录

优点:

  1. 简单

缺点:

  1. 查找速度慢
  2. 不允许重名
  3. 不便于文件共享

两级文件目录

  1. 提高了检索速度
  2. 不同UFD中文件名可以相同
  3. 不同用户可以使用不同的文件名访问同一个共享文件

相对路径:当前目录到数据文件

绝对路径:从树根开始的路径


http://www.niftyadmin.cn/n/100681.html

相关文章

【经典蓝牙】蓝牙 A2DP协议分析

A2DP 介绍 A2DP(Advanced Audio Distribution Profile)是蓝牙高音质音频传输协议&#xff0c; 用于传输单声道&#xff0c; 双声道音乐&#xff08;一般在 A2DP 中用于 stereo 双声道&#xff09; &#xff0c; 典型应用为蓝牙耳机。 A2DP旨在通过蓝牙连接传输高质量的立体声音…

urho3D属性动画

属性动画是一种设置对象属性值动画的机制。从Animatable派生的对象可以使用属性动画&#xff0c;这包括Node类以及所有Component和UIElement子类。 这是使用属性动画的两种方法。用户可以使用代码创建属性动画&#xff0c;然后将其应用于对象的属性。以下是浅色动画的简单代码…

服务器部署—若依【vue】如何部署到nginx里面?nginx刷新页面404怎么办?【完美解决建议收藏】

服务器部署项目我们大家都会遇到&#xff0c;但是有些铁子会遇到很多的问题&#xff0c;比如前端部署nginx如何操作&#xff1f; 前端有单纯的静态页面、还有前后端分离的项目&#xff1b;这里博主直接分享最牛最到位的前后端分离项目的前端部署到nginx上面&#xff0c;以若依项…

vitepress 就这几步操作,博客就搭好啦?

Ⅰ、什么是vitepress &#x1f48e; vitepress 使用场景 简单的说 &#xff0c;只要 会用 markdown 语法&#xff0c;就能构建自己的 「博客、笔记、使用文档」等系统 &#xff1b; ✨ vitepress 优势 优势介绍傻瓜式操作只需要配置 菜单 和 对应的 markdown 就能实现博客、笔…

IndexDB 浏览器服务器

IndexDB 浏览器服务器 文章部分内容引用&#xff1a; https://www.ruanyifeng.com/blog/2018/07/indexeddb.html https://juejin.cn/post/7026900352968425486#heading-15 基本概念 数据库&#xff1a;IDBDatabase 对象对象仓库&#xff1a;IDBObjectStore 对象索引&#xff1…

零基础如何入门网络安全(黑客)

我经常会看到这一类的问题&#xff1a; 学习XXX知识没效果&#xff1b;学习XXX技能没方向&#xff1b;学习XXX没办法入门&#xff1b; 给大家一个忠告&#xff0c;如果你完全没有基础的话&#xff0c;前期最好不要盲目去找资料学习&#xff0c;因为大部分人把资料收集好之后&a…

C语言运算符赋值运算符杂项运算符运算符优先级

赋值运算符 下表列出了 C 语言支持的赋值运算符&#xff1a; 运算符 描述 实例 简单的赋值运算符&#xff0c;把右边操作数的值赋给左边操作数 C A B 将把 A B 的值赋给 C 加且赋值运算符&#xff0c;把右边操作数加上左边操作数的结果赋值给左边操作数 C A 相当于 C …

前端组件库自定义主题切换探索-02-webpack-theme-color-replacer webpack 的实现逻辑和原理-02

接上一篇&#xff1a;《前端组件库自定义主题切换探索-02-webpack-theme-color-replacer webpack 的实现逻辑和原理-01》 上一篇说到&#xff0c;在Handler.js的this.options下面的代码&#xff0c;this.assetsExtractor new AssetsExtractor(this.options)&#xff0c;表明op…