【Linux取经路】解析环境变量,提升系统控制力

文章目录
- 一、进程优先级
- 1.1 什么是优先级?
- 1.2 为什么会有优先级?
- 1.3 小结
- 二、Linux系统中的优先级
- 2.1 查看进程优先级
- 2.2 PRI and NI
- 2.3 修改进程优先级
- 2.4 进程优先级的实现原理
- 2.5 一些名词解释
- 三、环境变量
- 3.1 基本概念
- 3.2 PATH:Linux系统中的指令搜索路径
- 3.3 HOME
- 3.4 USER
- 四、命令行参数
- 4.1 命令行参数的作用
- 4.2 main函数的第三个参数
- 4.3 环境变量可继承的验证
- 五、本地变量与内建命令
- 5.1 在bash命令行输入的指令并不一定都要创建子进程
- 六、结语
一、进程优先级
1.1 什么是优先级?
优先级决定了资源分配的先后顺序,即谁先访问,谁后访问。要注意区分优先级和权限的概念,权限决定了能不能做,而优先级是在已经确定可以做的基础上,去决定谁先谁后的问题。
1.2 为什么会有优先级?
因为在系统中可能存在多个进程,但是只有一个 CPU,这就注定了所有的进程是需要去竞争 CPU 资源,操作系统必须保证所有的进程良性竞争,即让每个进程都能使用到 CPU 资源。这就像去食堂买饭,如果大家不排队都去抢饭,那么弱小的人永远也抢不到饭。而排队的顺序就需要通过优先级来确定,优先级高的排在前面,优先级低的排在后面。如果因为优先级设计不合理(调度算法设计不合理)导致我们的进程长时间得不到 CPU 资源,该进程的代码长时间无法得到推进,就会产生该进程的饥饿问题,在用户看来就是应用卡死。
1.3 小结
-
CPU 资源分配的先后顺序,就是指进程的优先权。
-
优先级高的进程有优先执行权利。配置进程优先级对多任务环境的 Linux 很有用,可能会改善系统性能(注意:不要随意的修改进程优先级,只有调度器能够最公平的帮我们调度进程)。
-
还可以把进程运行到指定 CPU 上,这样一来,把不重要的进程安排到某个 CPU,可以大大改善系统整体性能。
二、Linux系统中的优先级
2.1 查看进程优先级
//process.c
int main()
{ while(1) { printf("I am a process, PID:%d, PPID:%d\n",getpid(),getppid()); sleep(1); } return 0;
}
//通过ps -al 指令可以查看进程的优先级ps -al | head -1 ; ps -al | grep process

-
UID:代表执行者的身份。
-
PID:代表这个进程的代号。
-
PPID:代表这个进程是由哪个进程发展衍生而来的,即父进程的代号。
-
PRI:代表这个进程可被执行的优先级,其值越小越早被执行,是 task_struct 结构体对象中的一个成员。
-
NI:代表这个进程的 nice 值,是进程优先级的修正数据。
2.2 PRI and NI
-
PRI 即进程的优先级,或者通俗点说就是程序被 CPU 执行的先后顺序,此值越小,进程的优先级别越高。
-
NI 就是我们呢常说的 nice 值,表示进程可被执行的优先级的修正数值。
-
PRI 值越小越快被执行,那么加入 nice 值后,将会使得 PRI(new) = PRI(old) + nice。
-
当 nice 值为负数的时候,那么该程序的优先级值将会变小,即优先级会变高,其会越快被 CPU 执行。
-
所以调整进程优先级,在 Linux 下就是调整进程的 nice 值。
-
nice 值的取值范围是[-20,19],一共40个级别。
2.3 修改进程优先级
普通用户是无法修改进程优先级的,因此要修改进程优先级必须切换成 root 用户。
top
//进入top后按“r”->输入进程PID->输入nice值

小Tips:PRI(new) = PRI(old) + nice中的 PRI(old) 永远都是从80开始。
2.4 进程优先级的实现原理

修改进程的优先级,本质上就是修改进程 PCB 对象所在的队列,将进程的 PCB 对象链入到修改后优先级对应的数组下标处,不同的下标就对应不同的优先级队列。
2.5 一些名词解释
-
竞争性:系统进程数目众多,而 CPU 资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级。
-
独立性:多进程运行,需要独享各种资源,多进程运行期间互不干扰。
-
并行:多个进程在多个 CPU 下分别同时运行,这称之为并行。
-
并发:多个进程在一个 CPU 下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发。
并发情况下,操作系统会根据每个进程的时间片去进行进程切换,当前正在被 CPU 调度的进程在它的时间片结束还没有执行结束,会被操作系统从 CPU 上拿下来,到上图中的 waiting 数组里面去继续排队,等待 CPU 的下一次调度,我们把这种过程叫做进程基于时间片轮转的调度算法。那 CPU 在下次调度该进程的时候,是如何直到从那里继续执行呢?答案是通过程序计数器(也叫PC指针),是 CPU 中的一个寄存器,一般是 epi,用于存储下一条将要执行的指令的内存地址,这样以来 CPU 下一次再调度该进程的时候就知道该从哪里继续执行了。
小Tips:CPU 中的寄存器有很多种,例如:通用寄存器eax、ebx、ecx、edx;和栈帧有关的ebp、esp、eip;和状态有关的status。寄存器也有对数据保存的能力,计算机在运行时一些重要的数据一定要保存在 CPU 内部,即寄存器中,因为寄存器离 CPU 很近存储效率高,所以 CPU 内的寄存器保存的是进程相关的数据,可以随时被 CPU 访问或者修改,这种和进程有关的数据也被叫做进程的上下文。进程在从 CPU 上离开的时候。要将自己的上下文数据保存好,甚至带走,保存好的目的是为了未来恢复。进程在被切换的时候,要执行两步操作,即保存上下文和恢复上下文,进程的上文数据量并不大,一般可以直接保存到进程的 PCB 对象中,当 CPU 再次调度该进程的时候,将这些上下文数据再恢复到寄存器里面即可。
三、环境变量
3.1 基本概念
-
环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数。
-
如:我们在编写 C/C++ 代码的时候,在链接的时候,从来不知道我们所链接的动静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。
-
环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性。

上图是 Windows 系统下的环境变量,本质上就是一组 key-value ,接下来将以Linux中的一些现象来演示常见的环境变量。
3.2 PATH:Linux系统中的指令搜索路径
我们平时在 bash 命令行中执行自己写的可执行程序时需要加 ./,表示当前目录下的可执行程序,告诉操作系统执行的时候在该目录下查找,指令本质上也是可执行程序,但是我们在执行指令的时候却从来没有加任何路径,那操作系统是如何直到指令在哪个目录呢?之前我们提到过,所有的指令都在/usr/bin/目录下,而我们自己写的可执行程序是在我们自己当前的工作目录下。都是目录怎么还会有区别呢?因为 Linux 操作系统会为我们提供一个环境变量 PATH,它是 Linux 操作系统给我们提供的指令搜索路径,这个环境变量是自从我们开机登录上 Xshell 就存在的,可以通过下面这条指令来查看 PATH 变量的值。
echo $PATH

PATH 变量值是用冒号分隔开的一些路径,这些路径就是我们平时执行指令时,系统去查找指令的路径,这就是为什么执行指令的时候不需要加 ./, 因为系统会自动到 PATH 对应的路径下去挨个搜索,这些指令都在/usr/bin/目录下,并且/usr/bin/目录也是 PATH 的变量值,所以指令最终一定会被找到,而我们自己写的可执行程序一般都是在当前的工作目录下,这个目录并不是 PATH 变量的值,如果不加 ./ 操作系统会自动到 PATH 对应的所有路径下挨个去搜索,最终都没有找到该可执行程序,也就无法执行。可以通过下面这条指令将当前的工作目录添加到环境变量里。
PATH=$PATH:/home/wcy/linux-s/lesson13
///home/wcy/linux-s/lesson13是当前工作目录
//只用=是覆盖写的意思,会把原本的PATH 覆盖掉

再去查看 PATH 的值,此时我们当前的工作目录也被添加了进去,此时在该目录下的可执行程序在执行的时候就可以不加 ./ 了。
小Tips:我们上面修改的环境变量是一种内存级的环境变量,保存在 shell 中,每次登陆 shell 会从系统的一些配置文件中将环境变量加载到 shell ,所以我们上面这种修改并不会影响到系统的配置文件,因此每次重启登陆环境变量就可以恢复如初。
3.3 HOME
我们每次登陆 shell 都默认处在家目录下,这是因为我们每次登陆的时候,shell 会识别到当前登陆的用户,自动帮我们填充 $HOME 环境变量,登陆的时候 shell 会为我们分配命令行解释器 bash,bash 本质上也是一个可执行程序,它会帮我们执行 cd $HOME 指令,这就是为什么我们每次登陆,都默认在家目录下。
小Tips:我们可以通过 env 指令查看当前 bash 从操作系统中继承下来的所有环境变量。

除了使用 env 指令,我们还可以通过 getenv 这个系统调用接口来获取某个环境变量的值。
3.4 USER
通过 USER 这个环境变量可以实现权限的认证,不同的用户登录 shell,它的 USER 是自己的用户名。
#include <stdio.h>
#include <stdlib.h>int main()
{printf("USER:%s\n",getenv("USER"));return 0;
}
同一份代码不同的用户去执行会得到不同的结果。

#include <stdio.h>
#include <stdlib.h>
int main()
{ char user[32]; strcpy(user, getenv("USER")); if(strcmp("root",user) == 0) { printf("root用户,不受权限约束\n"); } else { printf("普通用户,受权限约束\n"); } printf("USER:%s\n",getenv("USER")); return 0;
}

正式因为 USER 这个环境变量的存在,操作系统就具备了识别当前登录用户的能力,进而可以和文件对应的拥有者、所属组以及对应的权限做对比,一次来判断当前用户是否具有某项权限。
四、命令行参数
C/C++ 的 main 函数是可以传参的,这两个参数就叫做命令行参数,如下所示:
int main(int argc, char* argv[])
{return 0;
}
argv 是一个指针数组,里面保存的是字符串地址,这个数组有 argc 个元素。
int main(int argc, char* argv[])
{ int i = 0; for(; i < argc; i++) { printf("argv[%d]->%s\n",i, argv[i]); } return 0;
}

main 函数做i为函数也是可以被调用的,它也有参数,调用 main 函数的时候可以传参。我们在 bash 命令行输入的:./mycode -a -b -c会被 bash 当成一个字符串,它会把这整个字符串以空格作为分隔符,分成一个个单独的字符串,然后将它们的地址存入到 argv 数组中。
小Tips:假设 argc == N,即有 N 个命令行参数,那么 argv[N] 会默认设置成 NULL。
4.1 命令行参数的作用
#include <stdio.h>int main(int argc, char* argv[])
{ if(argc != 2) { printf("./mycode [-a|-b|-c|-d]\n"); return 0; } if(strcmp(argv[1], "-a") == 0) { printf("执行功能1\n"); } else if(strcmp(argv[1], "-b") == 0) { printf("执行功能2\n"); } else if(strcmp(argv[1], "-c") == 0) { printf("执行功能3\n"); } else if(strcmp(argv[1], "-d") == 0) { printf("执行功能4\n"); } else { printf("没有该选项!\n"); } return 0;
}

命令行参数有一个重要的作用,它可以为指令、工具、软件等提供命令行选项的支持。
4.2 main函数的第三个参数
除了上面提到的 argc 和 argv 两个参数,main 函数还有第三个参数 env,它也是一个指针数组,存放的是该进程的环境变量。
#include <stdio.h>
int main(int argc, char* argv[], char* env[]) { int i = 0; for(;env[i]; i++) { printf("env[%d]->%s\n", i, env[i]); } return 0; }

总结:我们平时写的 C/C++ 代码会有两张核心向量表,一张叫命令行参数表,另一张叫环境变量表。我们平时执行的指令,自己写的可执行程序都是 bash 的子进程,bash 本身在启动的时候,会从操作系统的配置文件中读取环境变量信息,子进程会继承父进程交给我的环境变量。这就是环境变量具有全局特性的本质。
4.3 环境变量可继承的验证
通过下面这条指令在 bash 的上下文数据中添加一个我们自己的环境变量,通过查看子进程中是否有该环境变量来验证环境变量可以被子进程继承。
export MY_VALUE=12345678

下面执行子进程 ./mycode,可以发现它里面也有 MY_VALUE 这个环境变量,说明子进程 mycode 继承了父进程 bash 的环境变量。

正是因为子进程可以继承父进程的环境变量,所以我们在 bash 输入的所有指令都要遵守权限,因为输入的所有指令都可以看做是 bash 的子进程,都继承了 bash 的环境变量。通过下面这条指令可以删除环境变量。
unset MY_VALUE
五、本地变量与内建命令
本地变量就是在命令行中直接定义的变量。

可以通过 set 命令查到系统当中的所有环境变量和本地变量。其中本地变量是不会被子进程继承的,只会在本 bash 内有效。可以通过 export 指令将一个本地变量变成环境变量。
export MYVALUE
//MYVALUE本来是一个本地变量
//执行完这条指令后MYVALUE就会变成一个环境变量
5.1 在bash命令行输入的指令并不一定都要创建子进程
如上图所示,我们可以通过 echo 指令打印出本地变量,之前说过 echo 作为指令,本质上也是一个可执行程序,既然是可执行程序,那就会创建进程,但是我们又说了子进程是无法继承父进程的本地变量,那为什么 echo 可以打印出父进程 bash 的本地变量呢?原因是:并不是所有的指令都会创建子进程。指令可以分为以下两类:
-
常规命令:通过创建子进程完成的。
-
内建命令:bash 不创建子进程,而是由自己亲自执行,类似于 bash 调用了自己写的,或者系统提供的函数。
而 echo 就是一个内建命令,执行 echo 命令的时候并不会创建子进程,与此类似的还有 cd 命令,它也是一个内建命令,通过调用 chdir 系统接口可以改变当前进程的工作目录。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h> int main(int argc, char* argv[], char* env[])
{ sleep(30); printf("change begin\n"); if(argc == 2) { chdir(argv[1]); } printf("change end\n"); sleep(30); return 0;
}

在 bash 命令行输入 cd 命令的时候,bash 并不会创建子进程,而是去判断命令行参数是否为 cd,如果是就直接去调用 chdir 系统接口切换工作目录。
小Tips:除了上面提到的两种通过代码获取环境变量的方法(命令行第三个参数、getenv系统接口)外,还可以通过第三方变量environ获取,libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头文件中,所以在使用时 要用extern声明。
#include <stdio.h>
int main(int argc, char *argv[])
{extern char **environ;int i = 0;for(; environ[i]; i++){printf("%s\n", environ[i]);}return 0;
}
六、结语
今天的分享到这里就结束啦!如果觉得文章还不错的话,可以三连支持一下,春人的主页还有很多有趣的文章,欢迎小伙伴们前去点评,您的支持就是春人前进的动力!

相关文章:
【Linux取经路】解析环境变量,提升系统控制力
文章目录 一、进程优先级1.1 什么是优先级?1.2 为什么会有优先级?1.3 小结 二、Linux系统中的优先级2.1 查看进程优先级2.2 PRI and NI2.3 修改进程优先级2.4 进程优先级的实现原理2.5 一些名词解释 三、环境变量3.1 基本概念3.2 PATH:Linux系…...
TCP编程流程(补充)
目录 1、listen: 2、listen、tcp三次握手 3、 发送缓冲区和接收缓冲区: 4、tcp编程启用多线程 1、listen: 执行listen会创建一个监听队列 listen(sockfd,5) 2、listen、tcp三次握手 三次握手 3、 发送缓冲区和接收缓冲区:…...
每天一道leetcode:433. 最小基因变化(图论中等广度优先遍历)
今日份题目: 基因序列可以表示为一条由 8 个字符组成的字符串,其中每个字符都是 A、C、G 和 T 之一。 假设我们需要调查从基因序列 start 变为 end 所发生的基因变化。一次基因变化就意味着这个基因序列中的一个字符发生了变化。 例如,&quo…...
【C++】做一个飞机空战小游戏(十)——子弹击落炮弹、炮弹与飞机相撞
[导读]本系列博文内容链接如下: 【C】做一个飞机空战小游戏(一)——使用getch()函数获得键盘码值 【C】做一个飞机空战小游戏(二)——利用getch()函数实现键盘控制单个字符移动【C】做一个飞机空战小游戏(三)——getch()函数控制任意造型飞机图标移动 【C】做一个飞…...
去除UI切图边缘上多余的线条
最近接到UI切图,放进项目,显示边缘有多余线条,影响UI美观。开始以为切图没切好,实则不是。如图: ->解决: 将该图片资源WrapMode改为Clamp...
Spring高手之路13——BeanFactoryPostProcessor与BeanDefinitionRegistryPostProcessor解析
文章目录 1. BeanFactoryPostProcessor 概览1.1 解读 BeanFactoryPostProcessor1.2. 如何使用 BeanFactoryPostProcessor 2. BeanDefinitionRegistryPostProcessor 深入探究2.1 解读 BeanDefinitionRegistryPostProcessor2.2 BeanDefinitionRegistryPostProcessor 的执行时机2.…...
【LeetCode动态规划】详解买卖票I~IV,经典dp题型买
给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易中获取的最大利润。…...
【深入探究人工智能】:常见机器学习算法总结
文章目录 1、前言1.1 机器学习算法的两步骤1.2 机器学习算法分类 2、逻辑回归算法2.1 逻辑函数2.2 逻辑回归可以用于多类分类2.3 逻辑回归中的系数 3、线性回归算法3.1 线性回归的假设3.2 确定线性回归模型的拟合优度3.3线性回归中的异常值处理 4、支持向量机(SVM&a…...
设计模式之解释器模式详解及实例
1、解释器设计模式概述: 解释器模式(Interpreter Pattern)是一种设计模式,它主要用于描述如何构建一个解释器以解释特定的语言或表达式。该模式定义了一个文法表示和解释器的类结构,用于解释符合该文法规则的语句。解…...
Nodejs沙箱逃逸--总结
一、沙箱逃逸概念 JavaScript和Nodejs之间有什么区别:JavaScript用在浏览器前端,后来将Chrome中的v8引擎单独拿出来为JavaScript单独开发了一个运行环境,因此JavaScript也可以作为一门后端语言,写在后端(服务端&#…...
No115.精选前端面试题,享受每天的挑战和学习
文章目录 变量提升和函数提升的顺序Event Loop封装 FetchAPI,要求超时报错的同时,取消执行的 promise(即不继续执行)强缓存和协商缓存的区别token可以放在cookie里吗? 变量提升和函数提升的顺序 在JavaScript中&#…...
Elasticsearch:语义搜索 - Semantic Search in python
当 OpenAI 于 2022 年 11 月发布 ChatGPT 时,引发了人们对人工智能和机器学习的新一波兴趣。 尽管必要的技术创新已经出现了近十年,而且基本原理的历史甚至更早,但这种巨大的转变引发了各种发展的“寒武纪大爆炸”,特别是在大型语…...
Flink学习笔记(一)
流处理 批处理应用于有界数据流的处理,流处理则应用于无界数据流的处理。 有界数据流:输入数据有明确的开始和结束。 无界数据流:输入数据没有明确的开始和结束,或者说数据是无限的,数据通常会随着时间变化而更新。 在…...
[Raspberry Pi]如何用VNC遠端控制樹莓派(Ubuntu desktop 23.04)?
之前曾利用VMware探索CentOS,熟悉Linux操作系統的指令和配置運作方式,後來在樹莓派價格飛漲的時期,遇到貴人贈送Raspberry Pi 4 model B / 8GB,這下工具到位了,索性跳過樹莓派官方系統(Raspberry Pi OS),直…...
17.HPA和rancher
文章目录 HPA部署 metrics-server部署HPA Rancher部署Rancherrancher添加集群仪表盘创建 namespace仪表盘创建 Deployments仪表盘创建 service 总结 HPA HPA(Horizontal Pod Autoscaling)Pod 水平自动伸缩,Kubernetes 有一个 HPA 的资源&…...
VS2022远程Linux使用cmake开发c++工程配置方法
文章目录 远程连接CMakePresets.json的配置Task.vs.json配置launch.vs.json配置最近使用别人在VS2015上使用visualgdb搭建的linux开发环境,各种不顺手,一会代码不能调转了,一会行号没了,调试的时候断不到正确的位置,取消的断点仍然会进。因此重新摸索了一套使用vs的远程开…...
《强化学习:原理与Python实战》——可曾听闻RLHF
前言: RLHF(Reinforcement Learning with Human Feedback,人类反馈强化学习)是一种基于强化学习的算法,通过结合人类专家的知识和经验来优化智能体的学习效果。它不仅考虑智能体的行为奖励,还融合了人类专家…...
STM32——RTC实时时钟
文章目录 Unix时间戳UTC/GMT 时间戳转换BKP简介BKP基本结构读写BKP备份寄存器电路设计关键代码 RTC简介RTC框图RTC基本结构硬件电路RTC操作注意事项读写实时时钟电路设计关键代码 Unix时间戳 Unix 时间戳(Unix Timestamp)定义为从UTC/GMT的1970年1月1日…...
webSocket 开发
1 认识webSocket WebSocket_ohana!的博客-CSDN博客 一,什么是websocket WebSocket是HTML5下一种新的协议(websocket协议本质上是一个基于tcp的协议)它实现了浏览器与服务器全双工通信,能更好的节省服务器资源和带宽…...
c#设计模式-结构型模式 之 代理模式
前言 由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接 引用目标对象,代理对象作为访问对象和目标对象之间的中介。在学习代理模式的时候,可以去了解一下Aop切面编程AOP切面编程_aop编程…...
shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...
Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...
