【Linux】进程优先级和进程切换
📝前言:
这篇文章我们来讲讲进程优先级和进程切换:
🎬个人简介:努力学习ing
📋个人专栏:Linux
🎀CSDN主页 愚润求学
🌄其他专栏:C++学习笔记,C语言入门基础,python入门基础,C++刷题专栏
这里写目录标题
- 一,进程优先级
- 实时操作系统和分时操作系统
- 二,进程切换
- 1 保护上下文
- 2 Linux2.6内核进程O(1)调度队列
- Linux2.6内核中进程队列的数据结构
- queue[140]
- bitmap[5]
- nr_active
- a 队列和 e 队列
一,进程优先级
进程的优先级就是指:进程获取CPU资源的先后顺序。
在Linux中,优先级用task_struct
里面的一个整型表示,值越低,优先级越高。
我们运行起来一个进程,然后查看它的信息
- UID:用户id
- PRI:优先级(默认为80)
- NI:优先级的修正值(nice)
1,对UID的理解:
进程会通过UID来记录用户。
我们都知道一切命令和程序都是进程,那么访问文件的本质就是进程在访问。进程会用记录的UID来判断此ID拥有的权限,识别权限是识别进程和文件之间的权限。【一切行为实质上都是进程,用户用进程来和系统交互】
2,对PRI和NI的理解:
进程的优先级PRI = 默认值(80) + nice值
且nice值的取值范围是:[-20, 19]
,一共40个级别(这是有讲究的)
如果我们要修改一个进程的优先级,可以通过renice修改nice值:
renice [nice值] + 进程PID
但是进程的优先级不建议频繁修改。
实时操作系统和分时操作系统
- 实时操作系统:对外部事件做出快速响应,并且严格要求在一定时间内完成。优先级高的进程可以中断优先级低的进程。
- 分时操作系统:有时间片,轮流为进程提供服务。(即:尽管进程的优先级高,但是每次只能在CPU上运行一个时间片那么长的时间,运行完以后就被拿下来,然后运行其他进程)
举个形象的例子理解两种操作系统的运用场景:
1,汽车进行刹车操作:运用实时操作系统,即:一旦有刹车指令,刹车指令放在第一位,把刹车指令执行完才能运行别的
2,边运行代码边听音乐:运用的是分时操作系统,即:没有要求跑代码的时候音乐就暂停,而是两个进程交替在CPU上运行。(只是速度太快,让我们感觉两个在一起)
理论上,单个CPU在某一时刻,只能有一个进程在运行。
但某一时段,可以通过并发的方式,让我们感觉在运行多个进程。
比如只有两个进程:运行代码和听音乐,两个进程是交替获取CPU资源的,一个进程运行完一个时间片以后,就立马换成另一个,只是切换的速度太快了。
进程的特点:
- 竞争性(竞争CPU资源)
- 独立性(多进程运行间互相不干扰)
- 并行性(多个进程在多个CPU下分别,同时进行运行)
- 并发性(多个进程在⼀个CPU下采⽤进程切换的⽅式,在⼀段时间之内,让多个进程都得以推进)
二,进程切换
那么,一个进程被拿下来以后,下次再上CPU时,为什么能够延续上一次的位置继续运行呢?这是因为,数据会被记录。
1 保护上下文
CPU在运行进程时,主要关注数据和代码。CPU中的各种寄存器会用来记录当前进程的临时数据。(CPU的寄存器是一块空间,是数据临时存储的地方)
假如现在有一个进程A和一个进程B,保护上下文的流程:
- 进程A先运行,此时CPU中的寄存器就会记录进程A的各种数据,比如:运算(1 + 2) * 3,加数 2 和被加数 1 被存储到寄存器中,+这个指令也被存储到寄存器中,1+2得到的结果3也被储存到寄存器中
- 然后,A进程的时间片到了,这时候,B进程要上来
- 则A就会将CPU中寄存器的数据保存到
task_struct
中一个叫tss
的结构体(即硬件上下文数据,保存到task_struct
中的tss
),比如运算的临时结果3
,还有后续的*
操作等 - B上去以后,就会用自己的数据直接覆盖寄存器里面的数据,然后运行B进程
- 等到B的时间片运行完了,B像A一样自己记录自己的数据
- 然后到A运行,A又重新把上一次记录的数据放到寄存器里,然后接着运行
Linux内核0.11的task_struct
中的tss_struct
:
2 Linux2.6内核进程O(1)调度队列
⼀个CPU拥有⼀个runqueue
(调度队列),那调度队列的数据结构到底是怎么样?如何管理这些进程的?
进程A的时间片运行完以后,进程A又去了哪里,下一个要运行的进程B是怎么找到的,进程A又是怎么回来重新运行的?
Linux2.6内核中进程队列的数据结构
一个CPU一个runqueue
queue[140]
queue[140]
的底层是哈希表(用的是哈系统)
[0, 99]
:是实时优先级(我们不关心)[100, 139]
:是普通优先级,刚好对应 nice 值的40个优先级级别- 同一级别中的不同进程,是通过哈希桶的方式链起来的
找运行队列时:全局上从上到下看优先级,局部上(同一优先级),进程队列FIFO。
bitmap[5]
哈希桶的头插效率是O(1),因为queue[140]
大小固定,查找效率也是O(1),但是每次找进程都要从上到下遍历整个queue[140]
还是太慢了,于是有了位图unsigned int bitmap[5]
unsigned int
是 4
个字节,即:32
个bit位,长度为 5
的话就是 160
个比特位。于是从 0
开始 0 - 139
位就与queue[140]
的下标一一对应。想要知道哪个下标还有进程,就只需要查bitmap
,0
代表无进程,1
代表还有进程。
nr_active
nr_active
用来指明当前queue[140]
里的进程数量
a 队列和 e 队列
一个进程的时间片运行完以后被放到哪里呢?
这就要谈谈 e 队列,在上面的结构图中我们可以看到两份:
这两份一份是活跃队列(a 队列),一份是过期队列(e 队列),分别被*active
和 *expired
指针指向
进程的运行顺序以及交替:
- 首先,我们在 a 队列里面挑进程:全局上从上到下(利用bitmap),局部上,FIFO(直接拿链表第一个)
- 当一个进程的时间片运行完以后,这个进程会从 a 队列移动到 e 队列
- 直到所有 a 队列里面的进程都被执行过了一遍(即:
nr_active == 0
) - 然后,会交换
*active
和*expired
指针,再运行 a 队列,重复上面的过程
(这就是O(1)调度算法:在系统当中查找⼀个最合适调度的进程的时间复杂度是⼀个常数,不随着进程增多⽽导致时间成本增加)
其实,上述过程中进程在 e 队列时的状态就是操作系统中的就绪状态,不过Linux中不对就绪状态和R状态进行区分。
还有两个小细节:
1,当一个进程的优先级被改了,这个进程怎么移动位置呢?
答:当一个进程的优先级被改,本次的PRI是不变的,等到本次从 a 队列中运行完以后到了 e 队列,下次从 e 队列回到 a 的时候,在重新计算,改变位置
2,当有新进程加入时,新进程进 a 还是 e
- 一般情况:新进程进 e
- 内核抢占情况:新进程进 a
🌈我的分享也就到此结束啦🌈
要是我的分享也能对你的学习起到帮助,那简直是太酷啦!
若有不足,还请大家多多指正,我们一起学习交流!
📢公主,王子:点赞👍→收藏⭐→关注🔍
感谢大家的观看和支持!祝大家都能得偿所愿,天天开心!!!
相关文章:
【Linux】进程优先级和进程切换
📝前言: 这篇文章我们来讲讲进程优先级和进程切换: 🎬个人简介:努力学习ing 📋个人专栏:Linux 🎀CSDN主页 愚润求学 🌄其他专栏:C学习笔记,C语言入…...
基于 Python(selenium) 的今日头条定向爬虫:根据输入的关键词在今日头条上进行搜索,并爬取新闻详情页的内容
该项目能够根据输入的关键词在今日头条上进行搜索,并爬取新闻详情页的内容。 一、项目准备 1. 开发环境配置 操作系统:支持 Windows、macOS、Linux 等主流操作系统,本文以 Windows 为例进行说明。Python 版本:建议使用 Python 3.8 及以上版本,以确保代码的兼容性和性能。…...
AIDL进程间通信
一、项目开启AIDL 在使用AIDL的模块下build.gradle 文件中添加以下代码 android {...buildFeatures {aidl true} }操作完需要rebuild 二、创建aidl服务接口 假设当前所需要的包名为com.jingluo.test_aidl ,那么aidl就需要处于同样的路径下,即如下目录…...
线程同步与互斥
系统11. 线程同步与互斥 1. 线程互斥 1-1 进程线程间的互斥相关背景概念 临界资源:多线程执⾏流共享的资源就叫做临界资源临界区:每个线程内部,访问临界资源的代码,就叫做临界区互斥:任何时刻,互斥保证有…...
腾讯一面面经:总结一下
1. Java 中的 和 equals 有什么区别?比较对象时使用哪一个 1. 操作符: 用于比较对象的内存地址(引用是否相同)。 对于基本数据类型、 比较的是值。(8种基本数据类型)对于引用数据类型、 比较的是两个引…...
某地农产品交易中心钢网架自动化监测项目
1. 项目简介 本项目规划建设现代物流产业园,新建6万平方米仓库,具体为新建3栋钢构仓库2万平方米,2栋砖混结构仓库1万平方米,3栋交易中心2万平方米,改造现有3栋3层砖混结构仓库1万平方米,配备智能化仓库物流…...
PGSql查看表结构以及注释信息
创建视图 CREATE OR REPLACE VIEW dbo.v_sys_tableinfo AS SELECT pc.relname AS tablename, pa.attname AS columnname, pt.typname AS columntype, CASE WHEN pa.attlen > 0 THEN pa.attlen::integer ELSE pa.atttypmod - 4 END AS columnlength, pa.attnotnull …...
C++23 中 constexpr 的重要改动
文章目录 1. constexpr 函数中使用非字面量变量、标号和 goto (P2242R3)示例代码 2. 允许 constexpr 函数中的常量表达式中使用 static 和 thread_local 变量 (P2647R1)示例代码 3. constexpr 函数的返回类型和形参类型不必为字面类型 (P2448R2)示例代码 4. 不存在满足核心常量…...
Linux服务器上mysql8.0+数据库优化
1.配置文件路径 /etc/my.cnf # CentOS/RHEL /etc/mysql/my.cnf # Debian/Ubuntu /etc/mysql/mysql.conf.d/mysqld.cnf # Ubuntu/Debian检查当前配置文件 sudo grep -v "^#" /etc/mysql/mysql.conf.d/mysqld.cnf | grep -v "^$&q…...
深度学习之卷积神经网络入门
一、引言 在深度学习蓬勃发展的今天,卷积神经网络(Convolutional Neural Network,简称 CNN)凭借其在图像识别、计算机视觉等领域的卓越表现,成为了人工智能领域的核心技术之一。从手写数字识别到复杂的医学影像分析&a…...
【kafka初学】启动执行命令
接上篇,启动:开两个cdm窗口 注意放的文件不要太深或者中文,会报命令行太长的错误 启动zookeeper bin\windows\zookeeper-server-start.bat config\zookeeper.properties2. 启动kafka-serve bin\windows\kafka-server-start.bat config\serv…...
MoE架构解析:如何用“分治”思想打造高效大模型?
在人工智能领域,模型规模的扩大似乎永无止境。从GPT-3的1750亿参数到传闻中的GPT-4万亿级规模,每一次突破都伴随着惊人的算力消耗。但当我们为这些成就欢呼时,一个根本性问题愈发尖锐:如何在提升模型能力的同时控制计算成本&#…...
【Qt】文件
🌈 个人主页:Zfox_ 🔥 系列专栏:Qt 目录 一:🔥 Qt 文件概述 二:🔥 输入输出设备类 三:🔥 文件读写类 四:🔥 文件和目录信息类 五&…...
Linux常见故障:排查思路与错误分析指南
引言 当Linux系统"生病"时,它不会说话但却会通过各种症状"求救"🆘!本文将带你建立系统化的故障排查思维,从磁盘到内存,从网络到服务,全方位掌握Linux系统的"把脉问诊"技巧。…...
基于随机变量的自适应螺旋飞行麻雀搜索算法(ASFSSA)优化BP神经网络,附完整完整代码
3. 麻雀搜索算法 麻雀群体分为两个角色,即发现者和跟随者。它们有三个行为:觅食、跟随和侦察。发现者的任务是寻找食物并告知跟随者食物的位置。因此,发现者需要在一个大范围内搜索,而跟随者的觅食范围通常较小。这是更新发现者位…...
vscode切换Python环境
跑深度学习项目通常需要切换python环境,下面介绍如何在vscode切换python环境: 1.点击vscode界面左上角 2.在弹出框选择对应kernel...
Gradle安装与配置国内镜像源指南
一、Gradle简介与安装准备 Gradle是一款基于JVM的现代化构建工具,广泛应用于Java、Kotlin、Android等项目的构建自动化。相比传统的Maven和Ant,Gradle采用Groovy或Kotlin DSL作为构建脚本语言,具有配置灵活、性能优越等特点。 在开始安装前…...
施工配电箱巡检二维码应用
在过去,施工配电箱的巡检主要依赖于纸质记录方式。巡检人员每次巡检时,都要在纸质表格上详细填写配电箱的各项参数、运行状况以及巡检时间等信息。这种方式在实际操作中暴露出诸多严重问题,信息易出现错误、数据会有造假现象、数据量庞大整理…...
全链路自动化AIGC内容工厂:构建企业级智能内容生产系统
一、工业化AIGC系统架构 1.1 生产流程设计 [需求输入] → [创意生成] → [多模态生产] → [质量审核] → [多平台分发] ↑ ↓ ↑ [用户反馈] ← [效果分析] ← [数据埋点] ← [内容投放] 1.2 技术指标要求 指标 标准值 实现方案 单日产能 1,000,000 分布式推理集群 内容合规率…...
第19章:Multi-Agent多智能体系统介绍
第19章:Multi-Agent多智能体系统介绍 欢迎来到多智能体系统 (Multi-Agent System, MAS) 的世界!在之前的章节中,我们深入探讨了单个 AI Agent 的构建,特别是结合了记忆、上下文和规划能力的 MCP 框架。然而,现实世界中的许多复杂问题往往需要多个智能体协同工作才能有效解…...
【C++游戏引擎开发】第25篇:方差阴影贴图(VSM,Variance Shadow Maps)
一、VSM 的核心思想 1.1 VSM 的核心思想 1.1.2 从深度到概率的转变 VSM 的核心创新在于将阴影判定从深度比较转换为概率估算。通过存储深度分布的统计信息(均值和方差),利用概率不等式动态计算阴影强度,从而支持软阴影并减少锯齿。 1.1.3 深度分布的统计表示 VSM 在阴…...
代码随想录打卡|Day27(合并区间、单调递增的数字、监控二叉树)
贪心算法 Part05 合并区间 力扣题目链接 代码随想录链接 视频讲解链接 题目描述: 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组࿰…...
yum包管理器
1.介绍 yum是一个shell前端软件包管理器,基于RPM包管理,能够从指定的服务器.自动下载RPM包并且安装,可以自动处理依赖关系,并且一次安装所有依赖的安装包。 2.yum基本指令 查询yum服务器是否有需要安装的软件: yum list I grep xx软件列表. 安装指定的yum包&…...
Linux多线程技术
什么是线程 在一个程序里的多执行路线就是线程。线程是进程中的最小执行单元,可理解为 “进程内的一条执行流水线”。 进程和线程的区别 进程是资源分配的基本单位,线程是CPU调度的基本单位。 fork创建出一个新的进程,会创建出一个新的拷贝&…...
通过模仿学习实现机器人灵巧操作:综述(上)
25年4月来自天津大学、山东大学、瑞士ETH、南方科技大学、通用 AI 国家重点实验室、爱丁堡大学和中科院自动化所的论文“Dexterous Manipulation through Imitation Learning: A Survey”。 灵巧操作是指机械手或多指末端执行器通过精确、协调的手指运动和自适应力调制&#x…...
LLM数学推导——Transformer问题集——注意力机制——稀疏/高效注意力
Q13 局部窗口注意力的内存占用公式推导(窗口大小 ) 局部窗口注意力:解决长序列内存困境的利器 在注意力机制中,全局注意力需要计算序列中每个元素与其他所有元素的关联,当序列长度 N 较大时,权重矩阵的内…...
Git 入门知识详解
文章目录 一、Git 是什么1、Git 简介2、Git 的诞生3、集中式 vs 分布式3.1 集中式版本控制系统3.2 分布式版本控制系统 二、GitHub 与 Git 安装1、GitHub2、Git 安装 一、Git 是什么 1、Git 简介 Git 是目前世界上最先进的分布式版本控制系统。版本控制系统能帮助我们更好地管…...
系统架构师2025年论文《论软件架构评估》
论软件架构评估 摘要: 我所在的单位是国内某知名医院,2017 年 1 月医院决定开发全新一代某市医院预约挂号系统,我担任本次系统的架构师,主要负责整个系统的架构设计工作。该系统旨在优化医院挂号流程,提高患者就医体验,是医院应对医疗信息化变革和提升服务的重要举措。…...
基于51单片机的超声波液位测量与控制系统
基于51单片机液位控制器 (仿真+程序+原理图PCB+设计报告) 功能介绍 具体功能: 1.使用HC-SR04测量液位,LCD1602显示; 2.当水位高于设定上限的时候,对应声光报警报警&…...
抓包工具Wireshark的应用解析
一、Wireshark简介 Wireshark(前身为Ethereal)是一款开源、跨平台的网络协议分析工具,自1998年诞生以来,已成为网络工程师、安全专家及开发者的核心工具之一。它通过网卡的混杂模式(Promiscuous Mode)捕获…...
在 Java 项目中搭建和部署 Docker 的详细流程
引言 在现代软件开发中,Docker 已成为一种流行的工具,用于简化应用的部署和运行环境的一致性。本文将详细介绍如何在 Java 项目中搭建和部署 Docker,包括配置文件、代码示例以及流程图。 一、整体工作流程 以下是整个流程的概览:…...
15.ArkUI Checkbox的介绍和使用
以下是 ArkUI Checkbox 组件的详细介绍和使用指南: 一、Checkbox 基础介绍 功能特性: 提供二态选择(选中/未选中)支持自定义样式和标签布局支持与数据状态绑定提供状态变化事件回调 适用场景: 表单中的多选操作设置…...
WebUI可视化:第5章:WebUI高级功能开发
学习目标 ✅ 掌握复杂交互逻辑的实现 ✅ 学会自定义界面样式与布局 ✅ 实现安全高效的文件处理 ✅ 优化性能与用户体验 5.1 自定义样式开发 5.1.1 修改主题颜色(以Streamlit为例) 在应用入口处添加全局样式: python import streamlit as st # 自定义主题 st.markdown…...
增加首屏图片
增加首屏图片(bg.jpg) web-mobile类型打包 //index.html脚本 <div id"myDiv_1111"style"background: url(./bg.jpg) 50% 50%/ 100% auto no-repeat ; width:100%;height:100%;position:absolute;"></div> //游戏内脚本…...
联合体和枚举类型
1.联合体类型 1.1:联合体类型变量的创建 与结构体类型一样,联合体类型 (关键字:union) 也是由⼀个或者多个成员变量构成,这些成员变量既可以是不同的类型,也可以是相同的类型。但是编译器只为最⼤的成员变量分配⾜够的内存空间。联合体的特…...
《AI大模型趣味实战》构建基于Flask和Ollama的AI助手聊天网站:分布式架构与ngrok内网穿透实现
构建基于Flask和Ollama的AI助手聊天网站:分布式架构与ngrok内网穿透实现 引言 随着AI技术的快速发展,构建自己的AI助手聊天网站变得越来越流行。本研究报告将详细介绍如何通过两台电脑构建一个完整的AI聊天系统,其中一台作为WEB服务器运行F…...
kubernets集群的安装-node节点安装-(简单可用)-超详细
一、kubernetes 1、简介 kubernetes,简称K8s(库伯内特),是用8代替名字中间的8个字符“ubernete”而成的缩写 云计算的三种主要服务模式——基础设施即服务(IaaS)、平台即服务(PaaS࿰…...
【Linux内核设计与实现】第三章——进程管理04
文章目录 8. exit() 进程退出8.1. exit() 系统调用的定义8.2. do_exit() 函数8.2.0. do_exit() 的参数和返回值8.2.1. 检查和同步线程组退出8.2.2. 清理与调试相关的资源8.2.3. 取消 I/O 和信号处理8.2.4. 检查线程组是否已终止8.2.5. 释放系统资源8.2.6. 释放线程和调度相关资…...
Golang | 迭代器模式
迭代器模式(Iterator Pattern)是一种行为型设计模式,它提供了一种顺序访问聚合对象(如列表、树等集合结构)中元素的方法,而无需暴露其底层实现细节。通过将遍历逻辑与集合本身解耦,迭代器模式使…...
美颜SDK动态贴纸实战教程:从选型、开发到上线的完整流程
在直播、短视频、社交娱乐全面崛起的当下,美颜SDK早已不再局限于“磨皮瘦脸”,而是逐步迈向更智能、更富互动体验的方向发展。动态贴纸功能,作为提升用户参与感和内容趣味性的关键手段,正在被越来越多的平台采纳并深度定制。本文将…...
ArkTS中的空安全:全面解析与实践
# ArkTS中的空安全:全面解析与实践 在ArkTS编程领域,空安全是一个极为关键的特性,它在很大程度上影响着代码的稳定性和可靠性。今天,我们就深入探究一下ArkTS中的空安全机制,看看它是如何保障我们的代码质量的。 ## A…...
C语言基础语法详解:从入门到掌握
C 基础语法 C 语言是一种通用的编程语言,广泛应用于系统编程、嵌入式开发和高性能计算等领域。 C 语言具有高效、灵活、可移植性强等特点,是许多其他编程语言的基础。 在 C 语言中,令牌(Token)是程序的基本组成单位…...
如何把两个视频合并成一个视频?无需视频编辑器即可搞定视频合并
在日常生活中,我们经常需要将多个视频片段合并成一个完整的视频,例如制作旅行记录、剪辑教学视频或拼接短视频素材。简鹿视频格式转换器是一款功能强大的工具,不仅可以进行视频格式转换,还支持视频合并功能。以下是使用简鹿视频格…...
Servlet小结
视频链接:黑马servlet视频全套视频教程,快速入门servlet原理servlet实战 什么是Servlet? 菜鸟教程:Java Servlet servlet: server applet Servlet是一个运行在Web服务器(如Tomcat、Jetty)或应用…...
C语言面试高频题——define 和typedef 的区别?
1. 基本概念 (1) #define 定义:#define 是预处理指令,用于定义宏。作用:在编译之前进行文本替换。语法:#define 宏名 替换内容示例:#define PI 3.14159 #define SQUARE(x) ((x) * (x))(2) typedef 定义:…...
计算机组成原理:指令系统
计算机组成原理:指令集系统 指令集体系结构(ISA)ISA定义ISA包含的内容举个栗子指令的基本组成(操作码+地址码)指令分类:地址码的个数定长操作码变长操作码变长操作码的原则变长操作码的设计指令寻址寻址方式的目的寻址方式分类有效地址直接在指令中给出有效地址间接给出有效地…...
自动清空 maven 项目临时文件,vue 的 node_modules 文件
echo off setlocal enabledelayedexpansion :: vue 的 node_modules 太大 :: maven 打包后的 target 文件也很大, :: 有些项目日志文件也很大,导致磁盘空间不足了, :: 所以写了个脚本,只要配置一下各项目目录, :: 双击…...
服务网格助力云原生后端系统升级:原理、实践与案例剖析
📝个人主页🌹:慌ZHANG-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、引言:微服务的“通信焦虑”与服务网格的出现 云原生架构的兴起推动了微服务的大规模落地,系统拆分为成百上千个小服务,这些服务之间需要频繁通信。然而,通信带来的问题也开始显现: 如何确保服务间…...
基于DrissionPage的表情包爬虫实现与解析(含源码)
目录 编辑 一、环境配置与技术选型 1.1 环境要求 1.2 DrissionPage优势 二、爬虫实现代码 三、代码解析 3.1 类结构设计 3.2 目录创建方法 3.3 图片链接获取 3.4 图片下载方法 四、技术升级对比 4.1 代码复杂度对比 4.2 性能测试数据 五、扩展优化建议 5.1 并…...
Spring Cloud Gateway 如何将请求分发到各个服务
前言 在微服务架构中,API 网关(API Gateway)扮演着非常重要的角色。它负责接收客户端请求,并根据预定义的规则将请求路由到对应的后端服务。Spring Cloud Gateway 是 Spring 官方推出的一款高性能网关,支持动态路由、…...