计算机操作系统重点概念整理-第二章 进程管理【期末复习|考研复习】
第二章 进程管理 【期末复习|考研复习】
计算机操作系统系列文章传送门:
第一章 计算机系统概述
第二章 进程管理
第三章 进程同步
第四章 内存管理
第五章 文件管理
第六章 输出输出I/O管理
文章目录
- 第二章 进程管理 【期末复习|考研复习】
- 前言
- 二、进程管理
- 2.1进程的定义,组成,组织方式,特征
- 2.2 进程的转换
- 2.3 进程控制
- 2.4进程通信
- 2.4.1 共享存储
- 2.4.2 管道通信(pipe文件)
- 2.4.3 消息传递
- 2.5线程
- 2.5.1 线程概念
- 进程、程序、线程、作业之间的区别
- 2.5.2 线程分类
- 2.5.3 多线程模型
- 2.6 处理器调度的概念及层次
- 2.6.1 高级调度
- 2.6.2 中级调度
- 2.6.3 低级调度
- 2.6.4 三种调度对比
- 2.7 进程调度的时机,切换过程和方式
- 2.7.1 进程调度的时机
- 2.7.2 进程调度的方式
- 2.8 调度评价标准
- 2.9 调度算法
- 2.9.1 先来先服务调度算法(FCFS,First Come First Serve)
- 2.9.2 短作业优先调度算法(SJF,Shortest Job First)
- 2.9.3 高响应比优先(HRRN,Highest Response Ratio Next)
- 2.9.4 时间片轮转调度(RR,Round-Robin)
- 2.9.5 优先级调度算法
- 2.9.6 多级反馈队列调度算法
- 下一章 第三章 进程同步
前言
给大家整理了一下计算机操作系统中的重点概念,以供大家期末复习和考研复习的时候使用。
参考资料是王道的计算机操作系统和西电的计算机操作系统。
二、进程管理
2.1进程的定义,组成,组织方式,特征
引入多道程序(CPU可以并发执行多个程序,失去了封闭性,并且具有间断性和不可再现性)之后,为了方便操作系统进行管理,引入了进程,进程实体的概念,以便更好地的描述和控制程序的并发执行,实现操作系统的并发性和共享性(最基本的两个特性)。
PCB,程序段,数据段三部分构成了进程实体(也叫作进程映像)。一般情况下,我们把进程实体简称为进程。PCB是进程存在的唯一标识。
进程的组织方式分为链接方式和索引方式。链接方式为按照进程状态将PCB分为多个队列。索引方式为根据进程状态不同,建立几张索引表。
进程的特征是动态性(最基本的特征)、并发性、独立性(进程是资源分配、接受调度的基本单位)、异步性、结构性。
2.2 进程的转换
2.3 进程控制
进程控制由原语实现。所谓原语,一般是指由若干条指令组成的程序段,用来实现某个特定功能,在执行过程中不可被中断。原语采用 “关中断指令” 和 “开中断指令” 来实现。 注意: 原语运行在核心态。
进程创建过程:1、申请空白PCB。2、为新进程分配所需资源(若资源不足则处于阻塞态)。3、初始化PCB(包括标志信息、处理器状态信息、处理器控制信息、进程优先级等等)。4、将PCB插入就绪队列。
进程终止过程:1、从PCB集合中找到终止进程PCB。2、若在运行中则立刻剥夺CPU并分配给其他进程。3、终止其所有子进程。4、将其所拥有的资源还给父进程或操作系统。5、从PCB链表中删除其PCB。
进程阻塞过程:1、找到要阻塞的PCB。2、若在运行中则保护现场后转为阻塞态停止运行。3、将PCB插入阻塞队列中,将处理器资源分配给其他就绪进程。
进程唤醒过程:1、在等待队列中找到对应进程PCB。2、将其从阻塞队列中移出,并置其状态为就绪态。3、把PCB插入就绪队列,等待调度程序调度。
进程切换过程:1、保存处理机上下文,包括PC程序计数器和其他寄存器。2、更新PCB信息。3、把进程的PCB移入相应阻塞队列。4、选择另一个进程执行,并更新PCB。5、更新内存管理的数据结构。6、恢复处理及上下文。
进程切换与处理机模式切换不同,模式切换时处理机逻辑上可能在同一进程中运行,若进程因中断或异常进入核心态时,执行完又回到被中断的程序中运行,OS只需要恢复进程进入内核时的CPU现场即可,无需改变当前进程的环境信息。但若要切换进程,则当前进程的环境信息也会变化。“调度”是一种决策行为,“切换”是一种实际分配的执行行为,先有调度后又切换。
2.4进程通信
进程通信就是进程之间的信息交换。因为内存的地址相互独立,为了保证安全,一个进程不能直接访问另一个进程的地址空间。操作系统提供了三种方法:共享存储,消息传递,管道通信。
2.4.1 共享存储
对于共享空间的访问必须是互斥的,通过同步互斥工具来实现(P操作、V操作),低级的共享存储是数据结构的共享,高级的共享存储是基于存储区的共享。允许非血缘关系的进程间使用。
2.4.2 管道通信(pipe文件)
原理:内核使用环形队列机制,借助内核缓冲区(大小为4K)实现。只允许有血缘关系的进程间使用。
1、管道只能采用半双工通信,某一时间段内只能实现单向的传输。如果要实现双向同时通信,则需要设置两个管道。2、各进程要互斥地访问管道。3、数据以字符流的形式写入管道,当管道写满时,写进程的write()系统调用将被阻塞,等待读进程将数据取走。当读进程将数据全部取后,管道变空,此时读进程的read()系统调用将被阻塞。4、如果没写满,就不允许读。如果没读空,就不允许写。5、数据一旦被读出,就从管道中被抛弃,这就意味着读进程最多只能有一个,否则可能会有读错数据的情况。
2.4.3 消息传递
进程间的数据交换以格式化的消息为单位。进程通过操作系统提供的“发送消息/接收消息” 两个原语进行数据交换。分为直接通信方式和间接通信方式,直接通信方式直接将消息发送给接收进程,间接通信方式则是发送到某个中间实体(电子邮件系统)。
2.5线程
2.5.1 线程概念
引入进程是更好的使多道程序并发执行,提高资源利用率和系统吞吐量。引入线程使减少程序在并发执行时所付出的时空开销,提高操作系统的并发性能。
线程由线程ID、程序计数器、寄存器集合和堆栈组成。线程是一个基本的CPU执行单元,也是程序执行流的最小单位,线程使进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源。线程之间也可以创建和撤销,即相互制约。线程也有就绪、阻塞、运行三种基本状态。
线程共享的资源:1、文件描述符表。2、每种信号的处理方式。3、当前工作目录。4、用户ID和组ID。5、内存地址空间。
线程间非共享资源:1、线程ID。2、处理器现场和栈指针(内核栈)。3、独立的栈空间(用户空间栈)。4、errno变量(errno为全局变量在data段)。5、信号屏蔽字(不同线程对信号的处理)。6、调度优先级。
线程的优点:1、提高程序的并发性。2、开销更小。3、数据间通信共享数据方便。缺点:1、线程为库函数,不稳定。2、调试、编写困难且gbd不支持。3、对信号的支持不好。
进程、程序、线程、作业之间的区别
进程与程序:
1、进程是程序在其数据在计算机上的一次运行活动是一个动态的概念,进程的运行实体是程序,离开了程序的进程没有任何意义。从静态的角度看,进程是由程序数据和进程控制块PCB组成。而程序是一个有序的指令集合是一个静态概念。2、进程是程序一次执行的过程,它是动态的创建和消亡,具有一定的生命周期,是暂时存在的,而程序是一组代码的集合,可以长期保留。3、一个进程可以执行一个或几个程序,一个程序可以构建多个进程。进程可以创建进程,而程序不可能创建新的程序。进程和程序的组成不同,进程的组成包括程序数据和PCB。
作业与进程
进程是系统资源的使用者,系统的资源的大部分都是以进程为单位分配的。而用户使用计算机是为了实现一连串的任务,通常把用户要求计算机完成的这一串任务称为作业。
2.5.2 线程分类
用户级线程由应用程序通过线程库实现。所有的线程管理工作都由应用程序负责(包括线程切换)。用户级线程中,线程切换可以在用户态下即可完成,无需操作系统干预。用户级线程对用户不透明,对操作系统透明。
内核级线程的管理工作由操作系统内核完成。线程调度、切换等工作都由内核负责,因此内核级线程的切换必然需要在核心态下才能完成。
内核级线程是处理机分配的单位。
2.5.3 多线程模型
多对一模型:多个用户及线程映射到一个内核级线程。每个用户进程只对应一个内核级线程。优点:用户级线程的切换在用户空间即可完成,不需要切换到核心态,线程管理的系统开销小,效率高。缺点:当一个用户级线程被阻塞后,整个进程都会被阻塞,并发度不高。多个线程不可在多核处理机上并行运行。
一对一模型:一个用户级线程映射到一个内核级线程。优点:当一个线程被阻塞后,别的线程还可以继续执行,并发能力强。多线程可在多核处理机上并行执行。缺点:一个用户进程会占用多个内核级线程,线程切换由操作系统内核完成,需要切换到核心态,因此线程管理的成本高,开销大。
多对多模型:n用户级线程映射到m个内核级线程(n >=m)。每个用户进程对应m个内核级线程。克服了多对一模型并发度不高的缺点,又克服了一对一模型中一个用户进程占用太多内核级线程,开销太大的缺点。
2.6 处理器调度的概念及层次
处理机调度就是对处理机进行分配,从就绪队列中按照一定的算法选择一个进程并将处理机分配给它运行,以实现进程的并发执行。调度分为三个层次,分别为高级调度,中级调度,初级调度。调度是多道程序的基础,是操作系统设计的核心问题。
2.6.1 高级调度
高级调度也叫作业调度,由于内存空间有限,有时无法将用户提交的作业全部放入内存,因此就需要确定某种规则来决定将作业调入内存的顺序。按一定的原则从外存上处于后备队列的作业中挑选一个(或多个)作业,给他们分配内存等必要资源,并建立相应的进程(建立PCB),以使它(们)获得竞争处理机的权利。
高级调度面向作业,从外存到内存,从无进程到开辟进程。对于每个作业只调入一次调出一次,只有当作业运行结束才调出,通常几分钟一次。
2.6.2 中级调度
中级调度也叫内存调度,可将暂时不能运行的进程调至外存等待。等它重新具备了运行条件且内存又稍有空闲时,再重新调入内存。这么做的目的是为了提高内存利用率和系统吞吐量。暂时调到外存等待的进程状态为挂起状态。值得注意的是,PCB并不会一起调到外存,而是会常驻内存。PCB中会记录进程数据在外存中的存放位置,进程状态等信息,操作系统通过内存中的PCB来保持对各个进程的监控、管理。被挂起的进程PCB会被放到的挂起队列中。中级调度(内存调度),就是要决定将哪个处于挂起状态的进程重新调入内存。
中级调度面向进程,决定将哪个处于挂起状态的进程重新调入内存,即挂起态到就绪态或者阻塞挂起态到阻塞态。
挂起与阻塞的区别:两个都是暂时不能获取到CPU的服务,挂起态是将进程映像调到外存去了,而阻塞态下的进程映像还在内存中。(进程映像就是进程实体,包括PCB、程序段、数据段)
2.6.3 低级调度
低级调度也叫进程调度,其主要任务是按照某种方法和策略从就绪队列中选取一个进程,将处理机分配给它。
进程调度是操作系统中最基本的一种调度,在一般的操作系统中都必须配置进程调度。
2.6.4 三种调度对比
2.7 进程调度的时机,切换过程和方式
2.7.1 进程调度的时机
临界资源: 一个时间段内只允许一个进程使用的资源。各进程需要互斥的访问临界资源。临界区:访问临界资源的那段代码。内核程序临界区一般是用来访问某种内核数据结构的,比如进程的就绪队列。
2.7.2 进程调度的方式
分为非剥夺调度方式和剥夺调度方式。
非剥夺调度方式,又称非抢占方式。即,只允许进程主动放弃处理机。在运行过程中即便有更紧迫的任务到达,当前进程依然会继续使用处理机,直到该进程终止或主动要求进入阻塞态。优点:实现简单,系统开销小但是无法及时处理紧急任务,适合于早期的批处理系统。
剥夺调度方式,又称抢占方式。当一个进程正在处理机上执行时,如果有一个更重要或更紧迫的进程需要使用处理机,则立即暂停正在执行的进程,将处理机分配给更重要紧迫的那个进程。优点:可以优先处理更紧急的进程,也可实现让各进程按时间片轮流执行的功能(通过时钟中断),适合于分时操作系统、实时操作系统。
狭义的进程调度指的是从就绪队列中选中一个要运行的进程,进程切换是指一个进程让出处理机,由另一个进程占用处理机的过程。广义的进程调度包含了选择一个进程和进程切换两个步骤。进程切换的过程主要完成了:1、对原来运行进程各种数据的保存。2、对新的进程各种数据的恢复(如:程序计数器、程序状态字、各种数据寄存器等处理机现场信息,这些信息一般保存在进程控制块)。
2.8 调度评价标准
等待时间:指进程/作业处于等待处理机状态时间之和。对于进程来说,等待时间就是指进程建立后等待被服务的时间之和,在等待I/O完成的期间其实进程也是在被服务的,所以不计入等待时间。
2.9 调度算法
2.9.1 先来先服务调度算法(FCFS,First Come First Serve)
2.9.2 短作业优先调度算法(SJF,Shortest Job First)
2.9.3 高响应比优先(HRRN,Highest Response Ratio Next)
2.9.4 时间片轮转调度(RR,Round-Robin)
如果时间片太大,使得每个进程都可以在一个时间片内就完成,则时间片轮转调度算法退化为先来先服务调度算法,并且会增大进程响应时间。因此时间片不能太大。另一方面,进程调度、切换是有时间代价的(保存、恢复运行环境),因此如果时间片太小,会导致进程切换过于频繁,系统会花大量的时间来处理进程切换,从而导致实际用于进程执行的时间比例减少。可见时间片也不能太小。一般来说,设计时间片要让切换进程的开销占比不超过1%。
2.9.5 优先级调度算法
可以设置多个就绪队列,或者根据优先级是否可以动态改变分为静态优先级和动态优先级两种。静态优先级创建进程后就不改动,动态优先级有个初始值,之后会动态的进行调整优先级。
系统进程高于用户进程,前台进程高于后台进程,操作系统更偏好I/O型进程(优先让I/O进程运行可以让I/O设备尽早投入工作),以调高资源利用率和系统吞吐量。
2.9.6 多级反馈队列调度算法
优点:短作业优先,对于短批处理作业用户,周转时间较短,长批处理作业用户,经过前面几个队列得到部分执行,不会长期得不到处理。
下一章 第三章 进程同步
第三章 进程同步
相关文章:

计算机操作系统重点概念整理-第二章 进程管理【期末复习|考研复习】
第二章 进程管理 【期末复习|考研复习】 计算机操作系统系列文章传送门: 第一章 计算机系统概述 第二章 进程管理 第三章 进程同步 第四章 内存管理 第五章 文件管理 第六章 输出输出I/O管理 文章目录 第二章 进程管理 【期末复习|考研复习】前言二、进程管理2.1进…...

如何学好C++?学习C和C++的技巧是什么?
如何学好C?学习C和C的技巧是什么? 你这三个问题,前两个都是意思是差不多的,那么怎么怎么学习C/C我来问答一下:最近很多小伙伴找我,说想要一些C资料,然后我根据自己从业十年经验,熬夜搞了几个通…...

leetcode_39 组合总和
1. 题意 给定一个数组,和一个目标值;求得所有数组中所有和为目标值的元素序列。 组合总数 2. 题解 回溯列举每一个可能的序列,注意去重。 2.1 我的解法 class Solution { public:void gen(vector<vector<int>> &ans,co…...

【登录安全测试】
登录安全测试是确保系统的用户身份验证机制和登录过程的安全性的重要步骤。以下是一些常见的登录安全测试方面的考虑: 账号密码验证:验证系统是否能有效地验证用户的账号和密码,包括对密码长度、复杂性和有效性的限制。测试应包括正常和异常…...

MySQL -- 数据类型
MySQL – 数据类型 文章目录 MySQL -- 数据类型一、数据类型1.数据类型分类2.数值类型2.1.tinyint2.2.bit2.3小数类型 3.字符串类型3.1.char3.2.varchar 4.时间和日期类型5.enum和set 一、数据类型 1.数据类型分类 2.数值类型 2.1.tinyint tinyint类型的数值范围是-128 ~ 127…...

Windows11搭建kafka-python环境
文章目录 安装软件javazookeeperkafka命令行调试环境python-kafka环境参数解释名词解释定义基础架构同步发送、异步发送消息队列的两种模式消费者与消费组幂等性文件清理策略kafka消费模式offset作用kafka消费顺序如何保证参考文献安装软件 java 下载jdk,配置环境变量JAVA_H…...

一篇了解springboot3请求参数种类及接口测试
SpringBoot3数据请求: 原始数据请求: //原始方式RequestMapping("/simpleParam")public String simpleParam(HttpServletRequest request){//获取请求参数String name request.getParameter("name");String age request.getParam…...

CFD模拟仿真理论知识:流体仿真应用
CFD模拟仿真理论知识:流体仿真应用 本文将介绍CFD(Computational Fluid Dynamics,计算流体动力学)模拟仿真理论知识的原理、方法和应用。通过本文对CFD的深入理解,并了解如何运用这一理论解决实际问题。...

【springboot单元测试,集成测试】
本文介绍一下SpringBoot中的测试方法 集成测试 SpringBootTest 一个普通的web api RequestMapping RestController public class HelloController {AutowiredRestTemplate restTemplate;GetMapping(value "/api/hi")public Map<String,Object> hello() {S…...

【音视频】音视频开发与学习
音视屏开发与学习 时间:2023年8月12日10:09:29 文章目录 音视屏开发与学习1.资料1.资料 1.资料下载: 这是最新的课程视频教程,如有星球过期的朋友,可以在这个群公告或者私聊我拿资料,这个资料会一直发给大家的,已经在星球的就直接在星球获取资料就行:链接:https://pan.…...

软考系统架构之案例篇(架构设计相关概念)
案例篇-架构设计相关概念 1. 架构风格的概念2. 五大架构风格有哪些3. MVC架构含义4. 云计算架构5. 云原生架构设计原则6. ESB的主要功能包括7. 质量属性的含义及其设计策略8. EJB中的 Bean 分三种类型9. 风险点、敏感点、权衡点的含义10. REST 的5个原则 1. 架构风格的概念 软…...

基于大数据的时间序列股价预测分析与可视化 - lstm 计算机竞赛
文章目录 1 前言2 时间序列的由来2.1 四种模型的名称: 3 数据预览4 理论公式4.1 协方差4.2 相关系数4.3 scikit-learn计算相关性 5 金融数据的时序分析5.1 数据概况5.2 序列变化情况计算 最后 1 前言 🔥 优质竞赛项目系列,今天要分享的是 &…...

APP分发-CDN加速原理
摘要 CDN的全称是(Content Delivery Network),即内容分发网络。其目的是通过在现有的Internet中增加一层新的CACHE(缓存)层,将网站的内容发布到最接近用户的网络”边缘“的节点,使用户可以就近取得所需的内容,提高用户访问网站的…...

【Java 进阶篇】Java Request 继承体系详解
在Java编程中,Request(请求)是一个常见的概念,特别是在Web开发中。Request通常用于获取来自客户端的信息,以便服务器能够根据客户端的需求提供相应的响应。在Java中,Request通常涉及到一系列类和接口&#…...

通过阿里云创建accessKeyId和accessKeySecret
我们想实现服务端向个人发送短信验证码 需要通过accessKeyId和accessKeySecret 这里可以白嫖阿里云的 这里 我们先访问阿里云官网 阿里云地址 进入后搜索并进入短信服务 如果没登录 就 登录一下先 然后在搜索框搜索短信服务 点击进入 因为我也是第一次操作 我们一起点免费开…...

decapoda-research/llama-7b-hf 的踩坑记录
使用transformers加载decapoda-research/llama-7b-hf的踩坑记录。 ValueError: Tokenizer class LLaMATokenizer does not exist or is not currently imported. 解决办法: https://github.com/huggingface/transformers/issues/22222 将tokenizer_config.json中LLa…...

计算机操作系统重点概念整理-第六章 输入输出I/O管理【期末复习|考研复习】
第六章 输入输出I/O管理【期末复习|考研复习】 计算机操作系统系列文章传送门: 第一章 计算机系统概述 第二章 进程管理 第三章 进程同步 第四章 内存管理 第五章 文件管理 第六章 输出输出I/O管理 文章目录 第六章 输入输出I/O管理【期末复习|考研复习】前言六、输…...

uniapp开发小程序—picker结合后台数据实现二级联动的选择
一、效果图 二、完整代码 <template><view><picker mode"multiSelector" change"bindMultiPickerChange" columnchange"bindMultiPickerColumnChange":value"multiIndex" :range"multiArray"><view c…...

React Swiper.js使用(详细版)3D聚焦特效,自定义导航按钮等
共用代码 import swiper/css import swiper/css/navigation import swiper/css/paginationimport { Navigation, Pagination, Scrollbar, A11y, Autoplay, EffectCreative } from swiper/modules;import { Swiper, SwiperSlide, } from swiper/react; 普通版本 重点ÿ…...

零基础Linux_23(多线程)线程安全+线程互斥(加锁)+死锁
目录 1. 线程安全 1.1 线程不安全前期 1.2 线程不安全原因 2. 线程互斥 2.1 加锁保护(代码) 2.2 锁的本质 3. 可重入对比线程安全 4. 死锁 4.1 死锁的必要条件 4.2 避免死锁 5. 笔试面试题 答案及解析 本篇完。 1. 线程安全 基于上一篇线程…...

【算法|贪心算法系列No.5】leetcode409. 最长回文串
个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望…...

【Linux】安装与配置虚拟机及虚拟机服务器坏境配置与连接---超详细教学
一,操作系统介绍 1.1.什么是操作系统 操作系统(Operating System,简称OS)是一种系统软件,它是计算机硬件和应用软件之间的桥梁。它管理计算机的硬件和软件资源,为应用程序提供接口和服务,并协…...

机器学习实验一:KNN算法,手写数字数据集(使用汉明距离)(2)
KNN-手写数字数据集: 使用sklearn中的KNN算法工具包( KNeighborsClassifier)替换实现分类器的构建,注意使用的是汉明距离; 运行结果:(大概要运行4分钟左右) 代码: import pandas as…...

docker应用部署---nginx部署的配置
1. 搜索nginx镜像 docker search nginx2. 拉取nginx镜像 docker pull nginx3. 创建容器,设置端口映射、目录映射 # 在/root目录下创建nginx目录用于存储nginx数据信息 mkdir ~/nginx cd ~/nginx mkdir conf cd conf# 在~/nginx/conf/下创建nginx.conf文件,粘贴下…...

Sql Server中的表组织和索引组织(聚集索引结构,非聚集索引结构,堆结构)
正文 SqlServer用三种方法来组织其分区中的数据或索引页: 1、聚集索引结构 聚集索引是按B树结构进行组织的,B树中的每一页称为一个索引节点。每个索引行包含一个键值和一个指针。指针指向B树上的某一中间级页(比如根节点指向中间级节点中的…...

C++类对象反制机制实现_精简修改版
前几天写的类对象反射机制太烦锁了,今天写个修改版的,精简为两个类 一个是类的数据结构,另一个是类的父类对象,把所有操作类的方法都写到父类中 1.类的信息结构体 struct Field_Node {TCHAR m_name[20]; //字段名称TCHAR m_typeName[20]; // 字段类型名称size_t m_typeHashC…...

C#开发的IEnumerable接口
C#开发的IEnumerable接口 在前面分析中,我们会遇到下面这行代码: var refineries = self.World.ActorsWithTrait<IAcceptResources>() .Where(r => r.Actor != ignore && r.Actor.Owner == self.Owner && IsAcceptableProcType(r.Actor)) .Select…...

Redis详细安装教程
目录 一、Redis 的安装及启动停止1-1 下载 redis的压缩包1-2 开始解压 redis1-3 执行 make 命令编译1-4 启动 redis修改配置文件1-5 设置远程连接1-6 设置后台启动1-7 设置密码1-8 配置服务启动(使用 systemctl 的方法)启动 redis配置开机启动操作redis使…...

36基于matlab的对分解层数和惩罚因子进行优化
基于matlab的对分解层数和惩罚因子进行优化。蚁狮优化算法优化VMD,算术优化算法优化VMD,遗传优化算法优化VMD,灰狼优化算法优化VMD,海洋捕食者优化算法优化VMD,粒子群优化VMD,麻雀优化算法优化VMD,鲸鱼优化…...

【Flutter】自定义分段选择器Slider
【Flutter】ZFJ自定义分段选择器Slider 前言 在开发一个APP的时候,需要用到一个分段选择器,系统的不满足就自己自定义了一个; 可以自定义节点的数量、自定义节点的大小、自定义滑竿的粗细,自定义气泡的有无等等… 基本上满足你…...