操作系统(系统简介、库文件、环境变量、编译器、系统特性)

一、UNIX系统介绍

诞生于1971年美国AT&T公司的贝尔实验室,主要开发者是丹尼斯.里奇、肯.汤普逊。

该系统的主要特点是支持多用户、多任务,并支持多种处理器架构,同时具有高安全性、高可靠性、高稳定性,既可以构建大型关键业务系统的商业服务器,也可以构建面向移动终端、手持设备、可穿戴设备的嵌入式应用。

二、Linux系统介绍

是一款类UNIX系统,免费开源,不同的发行版使用相同的内核,一般用在手机、平板、路由器、台式计算机、大型计算机、超级计算机,从严格意义上来说,Linux仅指的是操作系统内核,隶属于GNU工程,发明人叫 Linus Benedict Torvalds,1991年第一次公开在校内网的FTP服务器上。

Linux系统的Logo:

是一只企鹅,是南极的标志性动物,而目前南极不属于任何国家,为全人类所共有的,而Linux用它来当操作系统就意味这款系统属于全人类。

Minix操作系统:

荷兰的Andrew S. Tanenbaum教授所开发的一款不包含任何UNIX源码的类UNIX系统,Linus Torvalds深受Minix的启发写出了第一版本的Linux内核。

GNU工程:

发起于1984年,由自由软件基金会提供支持,它基本原则就是共享,目的是发展出一个免费且开源的类UNIX系统,名称来自GNU's Not UNIX!的递归缩写,因为GNU的设计类似UNIX,但它不包含具著作权的Unix代码。GNU的创始人,理查德·马修·斯托曼,将GNU视为“达成社会目的技术方法”。

GNU的发展仍未完成,其中最大的问题是具有完备功能的内核尚未被开发成功。GNU的内核,称为Hurd,但是其发展尚未成熟。在实际使用上,多半使用Linux内核、FreeBSD等替代方案,作为系统核心,其中主要的操作系统是Linux的发行版。Linux操作系统包涵了Linux内核与其他自由软件项目中的GNU组件和软件,可以被称为GNU/Linux。

POSIX标准:

可移植操作系统接口(Portable Operating System Interface,缩写为POSIX)是IEEE为要在各种UNIX操作系统上运行软件,而定义API的一系列互相关联的标准的总称。

Linux完全遵循了这个标准,所以两个操作系统的API,名字相同、参数相同、返回值相同,在Linux下编写的代码,经过稍微修改可移植到UNIX上。

GPL通用公共许可证:

GNU通用公共许可证简称为GPL,是由自由软件基金会发行的用于计算机软件的协议证书,使用该证书的软件被称为自由软件。允许对某成果及其派生成果的重用、修改和复制,对所有人都是自由的,但不能声明做了原始工作,或声明由他人所做。

Linux发行版:

Linux只是内核,内核+Shell+基础软件才是可用的操作系统。

其它公司可以根据Linux内核制作出不同版的Linux系统。

ubuntu、redhat、CentOS、debian、UOS

三、GNU编译工具

是GNU组织为了编译Linux内核源码而开发的一款编译工具,经过长时间的发展目前已经成为一个编译平台,能够支持多种编程语言、能够在主流操作系统中使用,编译C代码的工具gcc,编译C++代码的工具g++

通过 工具名 -v 参看编译工具的版本信息

gcc常用的编译参数:
gcc [选项参数] 文件-E          #   预处理-S          #   生成汇编文件-c          #   生成目标文件-o          #   设置编译结果的名字 -ohehe == -o hehe-I          #   指定要导入的头文件的路径 -I /path-l          #   指定要导入的库文件 例如:-lm导入数据库-L          #   指定要链接的共享库的路径-D          #   编译时定义宏 -D宏名-g          #   编译时添加调试信息,这样的编译结果可以通过gdb调试-Wall       #   尽可能多的产生警告,编译器更严格地检查代码-Werror     #   把警告当做错误处理-std        #   指定编译器遵循的语法标准 gnu89\gnu99\gnu11 -pendantic  #   对一些不符合ANSI\ 标准的代码、扩展代码会产生警告# case a ... b:
gcc相关的文件类型:
xxx.c           #   源文件
xxx.h           #   头文件
xxx.i           #   预处理文件
xxx.s           #   汇编文件
xxx.o           #   目标文件    
xxx.h.gch       #   头文件的编译结果,用于检查头文件语法,必须立即删除
libxxx.a        #   静态库文件 Windows中以.lib结尾
libxxx.so       #   动态库文件\共享库文件 Windows中以 .dll结尾
gcc把C语言变成可执行程序的过程:
#   1、预处理
gcc -E xxx.c                #把预处理结果显示到屏幕上
gcc -E xxx.c -o xxx.i       #生成.i结尾的预处理文件
​
#   2、把预处理文件 编译成汇编文件
gcc -S xxx.i                #生成.s结尾的汇编文件
​
#   3、把汇编文件翻译成二进制的目标文件
gcc -c xxx.s                #生成.o结尾的目标文件
​
#   4、把若干个目标文件、库文件合并生成可执行文件
gcc a.o b.o c.o ...         #默认生成a.out可执行文件
gcc支持的预处理指令:
#include
#define
#undef
#if
#elif
#ifdef
#ifndef
#endif
#wanring    #   在预处理时产生警告信息
#error      #   在预处理时产生错误,并阻止可执行文件生成
#line       #   指定行数
#pragma pack(1\2\4\8)   #   设置按1\2\4\8字节数进行内存对齐、补齐
#pragma once    #   相当于头文件卫士
#pragma GCC posion <标识符>    #   禁用标识符
#pragma GCC dependency "文件名"  # 能够监控文件 如果该文件比本文件更新则产生警告
gcc预定义的宏:
int main(int argc,const char* argv[])
{printf("%s\n",__FILE__);printf("%s\n",__func__);printf("%s\n",__FUNCTION__);printf("%d\n",__LINE__);printf("%s\n",__DATE__);printf("%s\n",__TIME__);printf("%ld\n",__cplusplus);          
}

四、环境变量

  • 环境变量一般是指在操作系统中用来指定操作系统运行环境的一些数值参数,例如:系统头文件的加载位置、临时文件位置等

  • 环境变量是在操作系统中具有一个特定名字的对象,它里面包含了一个程序或者多个程序所需要用到的信息。例如操作系统中有path环境变量,告诉应用程序执行可执行文件时,系统会去到哪个路径查找

  • 用户可以通过设置、获取环境变量、更好地处理运行程序。

环境变量的主要作用:
1、设置程序的运行参数

环境变量相当于给系统、用户、程序设置一些重要的参数,具体起到什么作用与该环境变量相关,例如:设置文件查找路径、用户名信息、文件存储路径等

2、程序共用

比如A软件需要用到B软件的部分功能,但是无论是操作系统、A软件、B软件的作者无法决定它们安装在什么位置,但是A软件需要在开发的时候提供使用B软件的部分功能的功能,这时候可以让B软件设置新的环境变量告诉操作系统它安装在什么路径下,此后A软件就可以通过查询公共的环境变量表得知B软件安装的位置,从而调用B软件的功能

3、系统运行

用户还可以通过设置环境变量告诉操作系统一些特定的运行数值,例如:当前系统的语言、字符编码、终端默认的窗口大小、字体大小等

常见的环境变量:
PS1         #   命令提示符
PATH        #   命令程序的搜索路径
C_INCLUDE_PATH  #   标准库头文件的搜索路径
LIBRARY_PATH    #   库文件的搜索路径
LD_LIBRARY_PATH #   程序执行时动态库的链接路径
查看环境变量:
  • Linux中通过env命令查看当前用户的环境变量

  • Windows中通过set命令查看环境变量

  • 在程序中查看环境变量

    • 在程序中查看环境变量之前 通过声明

//  每个程序运行时,操作系统都会拷贝系统的环境变量表给该程序 名字为environ,该表末尾一定是以NULL结尾 是一个字符串数组
int main(int argc,const char* argv[],const char* environ[])
{for(int i=0; NULL != environ[i]; i++)    {   printf("%s\n",environ[i]);}   
}
修改环境变量:

1、Linux系统修改

#   1、打开Linux系统配置文件
vim ~/.bashrc           #只对当前用户有效
vim /etc/environment    #   对所有用户有效
​
#   2、在文件末尾追加内容,对环境变量进行增删改查
export 环境变量名=<环境变量的值>
exprot 环境变量名=$环境变量名:<追加的环境变量值>
​
#   3、保存退出后,重新加载配置文件
source ~/.bashrc

2、通过使用标准库函数设置环境变量

环境变量的格式:
name=value
​
char *getenv(const char *name);
功能:获取name环境变量的值
​
int putenv(char *string);
功能:以name=value格式设置环境变量的值,如果name不存在则直接添加,如果存在则覆盖原来的value
返回值:成功返回0,失败-1
​
int setenv(const char *name, const char *value, int overwrite);
功能:通过value值给name环境变量设置,如果不存在也是添加,如果存在是否覆盖要根据overwrite决定
overwrite:当name存在时有意义0       不覆盖1       覆盖
​
int unsetenv(const char *name);
功能:删除环境变量name
​
int clearenv(void);
功能:清空当前程序的环境变量表注意:实际上是把char** environ指针置空当做清空处理,所以使用environ之前需要先判断是否是空指针注意:由于当前程序获得的环境变量表是系统拷贝过来的(副本),因此对其所有操作仅仅是本程序本次运行有效,不会对其它程序造成影响,但是会对子进程有影响

五、错误处理

1、通过函数的返回值表示执行错误:
//  返回合法值表示成功  返回非法值表示失败
//  计算大小、查找
long file_size(const char* path)
{FILE* fp = fopen(path,"r");if(NULL == fp)return -1;  //  返回非法值fseek(fp,SEEK_END,0);long size = ftell(fp);fclose(fp);return size;
}
​
//  返回指针类型 返回NULL/0xffffffff表示失败,malloc、mmap
Node* query_list(Node* head,TYPE data)
{for(Node* n=head->next; n; n=n->next){if(n->data == data)return n;}return NULL;
}
​
//  返回0表示成功,非零表示失败 main、fseek
​
//  永远成功的函数,printf、menu菜单函数
2、通过errno全局变量表示错误:
  • errno是一个记录系统最后一次错误代码原因的全局变量,是int类型的值,需要导入头文件 <errno.h> 通过该全局变量的值查看和调试程序错误。

  • 当调用Linux系统API函数发生异常,一般系统会自动地将本程序的errno修改一个值,不同的值表示不同的异常,可以通过该值获取和推测出程序出现了什么问题,实际编程中能找出大部分调用系统API出现的异常

  • 一般errno在程序执行成功时不会被修改,但是毕竟是一个全局变量,可能被其他人或者操作失误而修改,因此不能以errno非零就断定程序出现了异常,只能先根据其他具体条件判断出程序出现异常后,才能使用errno来确定异常的原因

#include <stdio.h>
#include <string.h>
#include <errno.h>
​
int main(int argc,const char* argv[])
{FILE* fp = fopen("xixi","r");if(NULL == fp) {   printf("fopen:%d\n",errno); printf("fopen:%s\n",strerror(errno));printf("fopen:%m\n");perror("fopen");}     fclose(fp);
}

六、库文件的制作与使用

什么是库文件:
  • 库文件是计算机中的一类文件统称,提供给开发者一些开箱即用的变量、函数、类,是若干个目标文件的集合,这样可以既可以保护源码,同时也对源码的使用提供了方便管理、使用、安全性高

  • 库文件分成静态库、动态库,区别具体在于程序的

静态库与动态库(共享库)的区别:
  • 静态库在程序链接之前就已经复制到了程序中,一起形成一个可执行文件,后续链接和加载到内存就不需要静态库文件参与;动态库在链接之前没有复制,而是在程序运行时,一起由系统加载到内存中,当执行到动态库中的语句时,内存发生跳转到动态库的代码段执行,执行结束后跳转回程序的代码段往下执行;这是这两个文件的最本质的区别

静态库的制作与使用:
创建静态库:
# 编译出要打包的目标文件:
gcc -c xxx1.c
gcc -c xxx2.c
...#   把目标文件合并打包成静态库文件
#   静态库一定是 前缀lib + 库名xxx +后缀.a
ar -r libxxx.a xxx1.o xxx2.o ...
​
#   ar 是一个专门控制静态库的命令集合-r      #   把目标文件合并成一个静态库文件,如果已有静态库则会更新-q      #   向静态库中添加目标文件-t      #   查看静态库中有哪些目标文件-d      #   从静态库中删除目标文件-x      #   把静态库展开成目标文件
使用静态库:
#   方法1 直接使用 相当于把库文件当做目标文件一样使用 意义不大
gcc main.c libxxx.a
​
#   方法2,通过设置LIBRARY_PATH环境变量的值来指定库文件的查找路径
#   前提是需要将静态库放入自己指定的静态库查找路径中
#           1、打开Linux系统配置文件
vim ~/.bashrc       
#           2、在文件末尾追加内容
exprot LIBRARY_PATH=$LIBRARY_PATH:要指定的路径
#           3、保存退出后,重新加载配置文件
source ~/.bashrc
​
通过-l库名 指定要使用的库
gcc main.c -lxxx
​
#   方法3:通过-l库名 指定使用当前工作路径下的库
gcc main.c -lxxx    #注意:libxxx.a必须在当前路径下或者系统指定路径
​
#   方法4:通过-L路径  去该路径查找库,找不到继续从当前目录、系统指定目录找
gcc main.c -lxxx -Lpath
​
注意:如果要删除系统配置文件中的环境变量,需要重启系统,才会生效
动态库的制作与使用:
创建动态库文件:
#   编译出目标文件,-fpic  编译出与位置无关的代码
gcc -c -fpic xxx1.c
gcc -c -fpic xxx2.c
...
#   把目标文件打包合并成有执行权限的动态库文件libxxx.so
gcc -shared xxx1.o xxx2.o ... -o libxxx.so
使用动态库:
#   方法1,直接调用
gcc main.c libxxx.so    #   只要当前路径下有so就可以生成a.out
a.out   #   可能报错 默认下不会在当前路径加载so 只会去默认路径/lib
​
#   方法2,通过设置LIBRARY_PATH环境变量的值来指定库文件的查找路径
#   前提是需要将静态库放入自己指定的静态库查找路径中
#           1、打开Linux系统配置文件
vim ~/.bashrc       
#           2、在文件末尾追加内容
exprot LIBRARY_PATH=$LIBRARY_PATH:要指定的路径
#           3、保存退出后,重新加载配置文件
source ~/.bashrc
​
通过-l库名 指定要使用的库
gcc main.c -lxxx
​
#   方法3:通过-l库名 指定使用当前工作路径下的库
gcc main.c -lxxx    #注意:libxxx.a必须在当前路径下或者系统指定路径
​
#   方法4:通过-L路径  去该路径查找库,找不到继续从当前目录、系统指定目录找
gcc main.c -lxxx -Lpath
​
注意:如果无法执行a.out, 需要检查系统能否在正确的路径下加载对应的动态库文件,检查LD_LIBRARY_PATH环境变量的值
​
注意:在指定路径中,存在同名的静态库(libxxx.a)和动态库文件(libxxx.so)时,系统默认优先使用动态库文件 可以通过参数 -static
考点:静态库与动态库的优缺点对比
静态库优点:
使用方便:
  • 在与静态库文件编译生成可执行文件后,编译器会把静态库中的内容一起编译到可执行文件中,在后续的执行程序时不需要依赖静态库文件了,并且可执行文件可以跨平台、跨设备直接运行

运行速度快:
  • 因为静态库文件是拷贝到可执行文件中,所以程序运行时不发生内存跳转,运行速度比动态库更快

静态库缺点:

浪费内存:
  • 假如有一个静态库libxxx.a,以及多个程序a.out b.out c.out都是用该静态库,那么libxxx.a的内容会分别给它们各拷贝一份,如果三个程序同时运行,静态库就会在内存中存在同样的三份,内存冗余,并且相比于动态库的可执行文件而言,静态库的可执行文件更大

更新麻烦:
  • 如果静态库的内容发生了改变:版本更迭、修改BUG等,那么所有使用过该静态库的可执行文件都需要重新编译,会耗费大量时间。

动态库的优点:

节约内存:
  • 所有使用同一个动态库的可执行文件,它们的动态库只会加载到内存一次,不同的程序可以使用那一次加载到内存的动态库内容,所以能够节约内存,这也是动态库也称为“共享库”的原因

更新方便:
  • 当动态库的内容更新,但是函数名、参数格式、返回值这些没改动的前提下,只需要重新编译动态库文件即可,直接运行原来的可执行文件,系统会加载最新版的动态库文件,不需要全部重新编译,节约时间

总结:实际操作不会考,但是对比得知道

额外知识了解:动态加载动态库

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/50516.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux云计算 |【第二阶段】AUTOMATION-DAY5

主要内容&#xff1a; YAML语法格式&#xff0c;层级关系、Ansible Playbook文件及语法格式、Ansible变量&#xff08;定义变量方法、优先级顺序、setup和debug查看变量&#xff09; 补充&#xff1a;Ansible ad-hoc 可以通过命令行形式远程管理其他主机&#xff0c;适合执行一…

视频逐帧播放查看神器-android闪黑闪白等分析辅助工具

背景 刚好有学员朋友在群里问道有没有什么播放软件可以实现对视频的逐帧即一帧一帧播放。在做android系统开发时候经常会偶尔遇到有时候是闪黑&#xff0c;闪白等一瞬间现象的问题。这类问题要分析的话就不得不需要对设备录屏&#xff0c;然后对录屏进行逐帧播放查看现象&…

2020真题-架构师案例(五)

问题1&#xff08;13分&#xff09; 针对该系统的功能&#xff0c;孪工建议采用管道-过滤器&#xff08;pipe and filter&#xff09;的架构风格&#xff0c;而王工则建议采用仓库&#xff08;reposilory&#xff09;架构风格。满指出该系统更适合采用哪种架构风格&#xff0c…

CentOS 7 + DockerCompose 离线安装达梦数据库8.0

# DB_NAMEDMDB&#xff1a;设置数据库名称 # INSTANCE_NAMEDBSERVER&#xff1a;设置数据库实例名称 # PAGE_SIZE32&#xff1a;设置数据库页面大小为 32 KB # EXTENT_SIZE32&#xff1a;设置数据库扩展大小为 32 个页面 # CASE_SENSITIVEy&#xff1a;设置数据库区分大小写 # …

【C++题解】1581. 马里奥的银币1

问题&#xff1a;1581. 马里奥的银币1 类型&#xff1a;数组找数 题目描述&#xff1a; 马里奥有很多银币&#xff0c;有一天他得到了一张魔法卡&#xff0c;只要使用这张魔法卡&#xff0c;就可以使得他的银币里面的最大的银币金额变得更大。如果他最大的银币是偶数的金额&a…

C# 西门子Seven读取,写入数据

读取数据要知道的&#xff1a; 1.plc存储区 2 数据存储在哪个地址上 M区:00 03 20 3 读取数据的长度 ①0x83 M存储区间 ②0x84 DB块 ③0x81 I存储空间 ④0x82 Q 输出存储空间 Socket socket; socket三次握手 1.连接 if(socket!null &&…

获取正版免费的xshell

1&#xff0c;安装 xshell官网 打开xshell官网站点&#xff1a;NetSarang Homepage CN - NetSarang Website 请认准&#xff0c;百度的xshell中文网都是要收费的 1&#xff0c;点击 xshell的下载 点击进入xshell的下载页面&#xff0c;或者直接访问所有下载 - NetSarang Webs…

实验2-4-2 求N分之一序列前N项和**注意小细节

//实验2-4-2 求N分之一序列前N项和//计算序列 1 1/2 1/3 ... 的前N项之和。#include<stdio.h> #include<math.h> int main(){int N;double sum0.0;scanf("%d",&N);for(int a1;a<N;a)sum(1.0/a);//这里必须是1.0 不可以是1&#xff01;&#x…

C# 归并排序

栏目总目录 概念 归并排序是一种分而治之的排序算法。它将一个大数组分成两个小数组&#xff0c;递归地对这两个小数组进行排序&#xff0c;然后将排序好的小数组合并成一个有序的大数组。这个过程一直递归进行&#xff0c;直到数组被拆分成只有一个元素的数组&#xff08;自然…

VirtualBox创建共享磁盘

VirtualBox创建共享磁盘 目录 VirtualBox创建共享磁盘1、划分共享磁盘1.1、【管理】->【工具】->【虚拟介质管理】1.2、【创建】->【VDI&#xff08;VirtualBox 磁盘映像&#xff09;】->【下一步】1.3、【预先分配全部空间】->【下一步】1.4、【分配大小】->…

网络协议二 : 使用Cisco Packet Traceer工具模拟网络环境,集线器,网桥,交换机,路由器,IP,同一网段

1. 安装 Cisco Packet Tracer baidu 网盘地址&#xff0c;感谢大神分享 安装&#xff0c;破解&#xff0c;中文化&#xff0c;都有说明&#xff0c;建议使用7.x的那个版本&#xff0c;感觉比8.x的翻译要完整一点 https://pan.baidu.com/s/18iWBOfhJJRhqgQqdNQcfMQ?pwddcch#…

什么是技术作家风格指南?

技术写作风格指南旨在提供必要的格式风格&#xff0c;以帮助技术作家为读者创建引人入胜且一致的内容。然而&#xff0c;技术写作与普通的自由写作有很大不同。目的是将复杂的技术主题分解为易于理解的内容&#xff0c;以帮助读者了解如何使用产品或服务。 在本文中&#xff0…

salesforce 当 opportunity 的关联对象存在的话,如何将 currency 字段设置为不可修改

创建一个触发器&#xff1a; trigger OpportunityTrigger on Opportunity (before update) {for (Opportunity opp : Trigger.new) {if (opp.CurrencyIsoCode ! Trigger.oldMap.get(opp.Id).CurrencyIsoCode) {// 检查关联对象是否存在&#xff0c;假设关联对象是CustomObject…

Ubuntu系统如何快速访问github

ubuntu系统下&#xff0c;常常因为国内网络原因无法访问github官网或者也无法使用使用git clone指令&#xff0c;搭建梯子又过于复杂&#xff0c;可使用修改hosts文件&#xff0c;添加IP地址的方法改进。 修改Hosts文件&#xff1a; 1.打开DNS查询网站&#xff1a;DNS查询。 …

FreeModbus学习——eMBInit初始化

FreeModbus版本&#xff1a;1.6 在mb.c文件中 先看一下静态变量的定义 /* ----------------------- Static variables ---------------------------------*/static UCHAR ucMBAddress; static eMBMode eMBCurrentMode;ucMBAddress是从机地址&#xff0c;eMBCurrentMode是M…

【大数据】StarRocks的同步物化视图怎么用呢

同步物化视图认识 StarRocks 中的同步物化视图&#xff0c;是对于基表的数据变更自动同步更新到物化视图中&#xff0c;且无需手动调用刷新命令。目前仅能基于 Default Catalog 中的单个基表创建&#xff0c;是一种特殊的查询加速索引。同步物化视图的管理成本和更新成本都比较…

C++ 八股(2)

1.函数调用的参数是以什么顺序压栈的&#xff0c;为什么&#xff1f; 从右向左压栈的。因为C, C支持可变参函数。 可变参函数就是参数个数可变的函数&#xff0c;如printf()就是可变参函数 void func(int a,...){} 2.有一个函数 在main函数中通过&#xff1a;string s fun…

焦化超低排放解决方案

在环保政策日益严苛与可持续发展理念深入人心的当下&#xff0c;朗观视觉小编认为焦化行业作为传统重工业的重要组成部分&#xff0c;正经历着一场前所未有的绿色变革。其中&#xff0c;“焦化超低排放”不仅是对环境保护的积极响应&#xff0c;更是行业转型升级、实现高质量发…

【开发问题记录】启动某个微服务时无法连接到seata(seata启动或配置异常)

问题记录 一、问题描述1.1 问题复现1.1.1 将Linux中的部分微服务启动1.1.2 在本地启动当时出错的服务 1.2 解决思路1.2.1 Nacos中seata相关的信息1.2.2 Linux中seata相关的信息 二、问题解决2.1 seata的配置错误2.1.1 Nacos中seata的配置问题2.1.2 命名空间问题的发现 2.2 网络…

ChatGPT:ThreadPoolTaskExecutor 定义在 controller 类里面和定义在 controller 的方法里面有什么区别

ChatGPT&#xff1a;ThreadPoolTaskExecutor 定义在 controller 类里面和定义在 controller 的方法里面有什么区别 在 Spring Boot 应用中&#xff0c;ThreadPoolTaskExecutor 是一种用于管理线程池的执行器&#xff0c;通常用于异步任务的执行。将 ThreadPoolTaskExecutor 定义…