当前位置: 首页 > news >正文

Linux—进程概念学习-03

目录

  • Linux—进程学习—3
    • 1.进程优先级
      • 1.1Linux中的进程优先级
      • 1.2修改进程优先级—top
    • 2.进程的其他概念
    • 3.进程切换
    • 4.环境变量
      • 4.0环境变量的理解
      • 4.1环境变量的基本概念
      • 4.2添加环境变量—export
      • 4.3Linux中环境变量的由来
      • 4.4常见环境变量
      • 4.5和环境变量相关的命令
      • 4.6通过系统调用获得环境变量
        • 4.6.1 getenv
        • 4.6.2 putenv
      • 4.7本地变量
        • 总结:
      • 4.8main函数的参数
        • 4.8.1命令行参数
          • 4.8.1.1命令行参数的意义
        • 4.8.2环境变量参数—char* env[]
        • 4.8.3总结
      • 4.9环境变量的组织方式
      • 4.10获取环境变量的3种方式

Linux—进程学习—3

1.进程优先级

什么是进程优先级:

  • CPU资源分配的先后顺序,就是指进程的优先权(priority)。

  • 优先权高的进程有优先执行权利。配置进程优先权对多任务环境的Linux很有用,可以改善系统性能。

  • 还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整体性能

要注意权限和优先级的区别:

  • 权限:能还是不能

  • 优先级:都能,先做还是后做。

为什么会有进程优先级?

因为资源太少了,需要资源的进程太多了。

就比如大多数计算机的cpu都只有一个,而需要等待cpu的进程数量远远多于cpu这个资源的数量。

1.1Linux中的进程优先级

在Linux中,优先级和进程状态一样,其实就是2个整数。这个整数是放在PCB里面维护的,属于是进程的一个属性

写一个小程序来查看进程优先级:

image-20241115135233623

输入ps -lps -al可以查看到一些重要信息【ps -al可以查看当自己运行的进程信息】

image-20241115135447053

  • UID : 代表执行者的身份
  • PID : 代表这个进程的代号

  • PPID :代表这个进程是由哪个进程发展衍生而来的,亦即父进程的代号

  • PRI :代表这个进程可被执行的优先级,其值越小越早被执行

  • NI :代表这个进程的nice值【默认是0】

Linux比较特殊,其最终优先级 = PRI(刚被创建出来就被赋予的优先级) + NI

PRI and NI

  • PRI也还是比较好理解的,即进程的优先级,或者通俗点说就是程序被CPU执行的先后顺序,此值越小进程的优先级别越高

  • NI就是我们所要说的nice值了,其表示进程可被执行的优先级的修正数值

  • PRI值越小越快被执行,那么加入nice值后,将会使得PRI变为:PRI(new)=PRI(old)+nice

  • 这样,当nice值为负值的时候,那么该程序将会优先级值将变小,即其优先级会变高,则其越快被执行

  • 调整进程优先级,在Linux下,就是调整进程nice值

  • nice其取值范围是-20至19,一共40个级别

这说明:Linux是支持,进程在运行中,调整进程优先级的【更改NI实现】

要注意:

进程的nice值不是进程的优先级,他们不是一个概念,但是进程nice值会影响到进程的优先级变化

1.2修改进程优先级—top

修改进程优先级其实没有什么必要,因为会不会修改另说,很多时候修改完的效果并不会说有想象的那么好。除非是追求极致效率,不然没有必要去修改进程优先级。

这里演示一个修改进程优先级的方法——使用top修改进程优先级

top修改优先级的方法:

  • 进入top后按“r”–>输入进程PID–>输入nice值

验证一下:

进场优先级的修改可能会需要root权限,因此调用top的时候,可以使用sudo top

image-20241115145047635

正常输入r弹出来的进程是一个默认进程,如上图所示,默认进程的ipd是9152、

这里的小程序仍然是上面那个。

image-20241115145459103

输入要修改优先级的进程的pid,然后就会对我们输入的pid的进程进行修改,如下图所示

image-20241115145319448

然后输入在对25849的进程优先级输入一个-100

image-20241115145815325

退出top工具,出来查看进程优先级发现NI和PRI都发生了变化【PRI最终是60,变小了,因此该进程的优先级变高了】

image-20241115145708214

但是该进程退出后,在重新运行的话,优先级还是默认的

image-20241115145838931

image-20241115145850527

这里需要注意——Linux是不会让用户过度的修改NI值的。

这是因为,如果用户将自己的进程的优先级调的非常高,那么就会导致这个进程经常需要占用CPU,这样就会导致操作系统的调度失衡,其他进程很可能没办法占用到cpu资源了。因此Linux不会让用户过分的去调低NI值,来让进程的优先级过高

NI的值前面也说了,范围就是-20至19,一共40个级别。

因此Linux中,用户能够修改的最终的优先级范围就是[80 - 20, 80 + 19]。

2.进程的其他概念

  • **竞争性:**系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级

  • **独立性:**多进程运行,需要独享各种资源,多进程运行期间互不干扰。哪怕其中一个进程挂了,但是不会影响另外一个进程运行。

为了维持这个独立性,需要耗费更多的资源来维护【学习进程地址空间之后,才能理解】

  • **并行:**多个进程在多个CPU下分别,同时进行运行,这称之为并行

  • 并发: 多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发

对并发需要知道的:

一个cpu,在任意一个时刻下,只能够运行一个进程,也就是只能被一个进程占用。

在cpu资源只有一个或2个的情况下,为了能够在一段时间内,推进多个进程运行的现象叫做并发。

这是如何做到的呢,其实主要靠的是一个策略——时间片

其实就是一个进程,操作系统规定你只能占用cpu资源多少时间。时间到了,就必须将cpu资源让出来,让其他进程占用cpu。这里有个现象是进程切换

image-20241115184610422

3.进程切换

前面也说了,CPU比较蠢,需要分析并接受外部的指令和数据,才能够进行运算。

因此CPU只干三件事情,【1.取指令、2.分析指令、3.执行指令】

在这个前提下,进程再被CPU执行的时候,其实CPU就是不断的在重复这三步,这个过程用到了很多的寄存器,一个CPU内部会有一套寄存器。

对于进程切换的一些知识和理解,先看下面这个图:

image-20241115205656346

对进程切换的分析:

进程再被执行的时候,肯定会产生非常多的临时数据,这些临时数据在执行的时候都在寄存器当中运算。这些数据都是属于当前进程的,也就是说,当该进程的时间片到了之后,其他进程占用CPU之后,这些临时数据就会被清空。

但是会有一个情况,当进程的时间片到了之后,如果进程还没有执行完,那么就要考虑该进程回到CPU的情况。

因此,操作系统会将该进程退出时,寄存器内的临时数据,在另外一个地方备份起来【上下文保护】,并记住这个进程,然后清空寄存器内的临时数据,来给下一个切换进来的进程使用。然后每次进程切换的时候,都要判断新进来的进程是不是之前有记录的未执行完的进程,如果有记录的话,就将之前备份的临时数据拿出来,继续执行该进程【上下文恢复】。从而实现上下文数据的恢复。

总结:

  • 进程在切换的时候,要进行进程的上下文保护

  • 进程恢复运行的时候,要进行进程的上下文恢复

4.环境变量

4.0环境变量的理解

为了更好的理解环境变量这个概念,下面先讲个帮助理解的例子:

在Linux中,我们输入系统的指令,是直接输入的【比如ls man who等指令】、而我们自己写的可执行程序,也可以理解成指令。

但是我们自己写的可执行程序,却要加一个./

image-20241117142610633

我们查看文件类型会发现,s和自己写的process都是可执行程序

image-20241117142705617

那是为什么呢?这是因为系统找得到系统指令池的指令,找不到我们自己写的指令。

这也就是为什么我们要执行自己的指令,需要加上./的原因,这里的./是当前路径的意思,告诉系统在当前路径找到process这个指令去执行。而系统的指令都放在了usr/bin下

如果我们想要自己的指令也可以像系统指令那样执行,通过root权限将自己的指令移动到usr/bin这个目录下即可。【但是我们不推荐这样做,因为自己写的程序是没有测试的,不稳定也不安全,会污染系统指令池】

但是为什么在usr/bin这个路径下,系统就找得到,而在自己这个路径下系统就找不到呢?

这就跟要谈的环境变量有关系了,系统中有一个环境变量叫做PATH,这个环境变量是系统启动的时候定义的一个全局有效的环境变量

image-20241117143440221

可以看到,每个冒号中间间隔的都是一个路径,那么在执行一个指令的时候,操作系统就会在环境变量PATH提供的这些路径当中去找、找到了就执行

如果这些路径下都没找到该指令的时候,就会报错—找不到该指令

image-20241117143617533

要注意:环境变量不是只有PATH,环境变量是有很多的

4.1环境变量的基本概念

  • 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数

  • 如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。

  • 环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性

环境变量其实就是操作系统为了满足不同的应用场景而预先在系统内设置很多的全局变量。

而这些变量一直都会被其他进程所访问到。

4.2添加环境变量—export

添加环境变量有个需要注意的问题,下面做个案例:

可不敢想下图一样直接将要添加的路径直接添加到环境变量中

image-20241117150827756

这样会导致环境变量只剩下你所添加的这个路径,之前的路径都会被覆盖的。

但是如果真的覆盖了,其实问题也不大,因为环境变量这个东西,只要关掉这个命令行客户端,然后重新打开,环境变量就会重置了。原因是啥后面才学。这里只需要知道即可

由于之前的环境变量被覆盖,会导致原来系统的指令也用不了的。

正确的添加环境变量的方法:

输入export PATH=%PATH:要添加的路径

这样就可以在原来的环境变量上,添加一个新的路径

这样就可以直接像执行系统指令一样,直接执行自己的程序,并且 which自己的指令,也会直接出现指令所在的路径,因为which能够在环境变量中找到,

4.3Linux中环境变量的由来

在Linux中,用户的根目录下存在两个隐藏文件,如下图所示:

image-20241117161249241

这两个文件的内容如下图所示:

image-20241117161351531

image-20241117161513070

每次用户登录的时候,系统都会执行一次这两个文件,通过这两个文件来构建当前用户的shell环境变量。【这两个文件的内容看不懂很正常】

为什么用户修改环境变量每次登录的时候,环境变量都会被重置的原因就在这这里。

用户每次登录,系统都会登录上面所说的两个文件来加载环境变量。

4.4常见环境变量

  • PATH : 指定命令的搜索路径

  • HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)

  • SHELL : 当前Shell,它的值通常是/bin/bash。

除了这些环境变量,还有很多环境变量,比如为什么我们能找到之前所输入的指令,就是因为Linux当中帮我们记住了我们所输入的一些指令记录。比如Linux内核怎么知道我们用的是那个类型的shell呢?也是通过环境变量解决的。

环境变量其实就是操作系统为了满足不同的应用场景而预先在系统内设置很多的全局变量。

输入env指令,可以查看系统所有的环境变量。

image-20241117163429354

比如里面有一个环境变量叫做HISTSIZE,这个环境变量的3000就是Linux系统能帮我们记住3000条历史指令记录

image-20241117163555053

4.5和环境变量相关的命令

  1. echo: 显示某个环境变量值

  2. export: 设置一个新的环境变量

  3. env: 显示所有环境变量

  4. unset: 清除环境变量

  5. set: 显示本地定义的shell变量和环境变量

4.6通过系统调用获得环境变量

下面将通过系统调用获得环境变量的实验来加深对环境变量的理解

4.6.1 getenv

除了通过env来显示环境变量,我们也可以通过系统调用来获得环境变量。

下面做个小实验:

我们通过getenv()这个接口,来获得环境变量

getenv的官方介绍:

image-20241117234249456

因此我们来做个实验:通过系统调用来拿到USER这个环境变量的值

实验的代码如下:

image-20241117234202825

Makefile文件的内容如下:

image-20241117234459024

执行程序的结果如下:

image-20241117234446933

可以看到,getenv拿到了USER这个环境变量的值

image-20241117234717419

因此,如果USER环境变量改变了,这里执行的结果也会进行改变

实验如下:登录root用户,然后再执行此文件

输入su -登录root用户,此时发现USER环境变量已经加载成root了。

image-20241117235014941

那此时在执行我们能写的程序,结果会跟着改变吗?

如下图所示

image-20241117235204134

结果与预期相符。通过系统调用能够获得环境变量

既然系统调用能够获得环境变量,这样就能够判断当前用户的身份了,从而就可以判断当前用户是否有权限去访问某个文件了。

【这也就是为什么用普通用户身份无法访问一些文件,因为系统通过拿到用户的USER环境变量,来判断当前用户这个身份有没有权限访问该文件**(if语句判断),在拿到当前文件的属性是能够被谁访问的(stat拿到文件属性),从而判断当前用户没有权限访问该文件,从而输出Permission denied**】

image-20241117235755849

下面手动实现一下权限是否足够的判断:

image-20241118000829166

实验结果:

image-20241118001057381

还可以再讲一个加深理解环境变量的例子:

ls指令不论什么时候都可以知道用户当前所处的目录,凭什么?为什么执行自己写的程序的时候,需要./mycode,而ls mycode,不需要ls ./mycode?

这是因为ls每次都知道当前的路径,自然也不需要用户手动添加相对路径给shell了。那ls凭什么知道用户所处的路径呢?——凭环境变量PWD

image-20241119121101566

ls也是一个可执行程序,是一个指令,因此每次它执行都相当于bash的子进程,都可以继承到全局属性的环境变量,因此每次执行ls,ls都可以通过环境变量PWD来知道当前路径,自然就不需要用户手动告诉shell相对路径了

而每次变更路径的时候,bash都会及时的更新环境变量PWD,而ls每次执行又可以继承到全局属性的环境变量,因此不管用户在哪里ls,都可以通过环境变量PWD来获取当前路径。

4.6.2 putenv

这个系统调用,目前来说用不到。**功能就是添加或者修改一个环境变量。**后面学习完进程控制,自己写一个简单的命令行解释器的时候会使用它

image-20241124210151280

4.7本地变量

系统的环境变量可以说是一个全局有效的变量,在Linux中除了这种全局变量,还可以定义局部变量

image-20241118113426376

可以看到通过echo是可以获得到该环境变量的,但是这个并不是添加了一个系统的环境变量

image-20241118113545783

如上图所示,env展示的系统环境变量中并没有myval的存在

说明这个myval是一个shell创建的一个局部变量,只在shell有效

但是如果非要查看到myval的存在,可以用set,set展示的变量巨多,包括了环境变量和本地变量

下面做一个实验:通过getenv来看看是否能够获取到变量myval

代码如下:

image-20241118120046130

执行程序的结果如下:

image-20241118115829906

想要myval变成系统的环境变量可以使用export来导入

image-20241118120955827

但是这个导入的环境变量也只是临时的,只需要重启shell就会消失。因为重启shell会重新根据环境变量的配置文件来导入环境变量

总结:
  • 环境变量是全局的,代表它是可以被子进程继承的。因为mycode程序运行时,对于bash来说,就是一个子进程,但是它仍然可以获取环境变量。

为什么子进程需要继承环境变量呢?——因为可以满足不同的应用场景,比如执行命令时候的身份认证,PATH的指令路径

  • 本地变量就无法被继承。它只对当前进程(bash)有效

4.8main函数的参数

4.8.1命令行参数

之前的学习中,又见到过main函数是有3个形参的。这个参数叫做命令行参数

int main(int argc, char *argv[], char *envp[]);

这里的这个argc是决定 argv这个指针数组有多少个元素的。而argv这个指针数组装的都是char*指针,一般来说都是字符串

这里做个实验来看看argv这个指针数组内装的字符串都是什么

自动化构建工具Makefile文件的内容:

image-20241119184758404

用c99是因为代码中出现了for(int i = 0)这个代码

代码如下:

image-20241119184905139

执行结果如下:

image-20241119184924366

可以看到只有1个元素,下标为0的第一个元素是这个可执行文件的名字

如果将在执行的时候加n个选项,那么argc就会是n+1,argv数组就会有n+1个元素,如下图所示:

image-20241122193619698

那这个是怎么实现的呢?

其实就是我们输的指令其实是一个长字符串,然后shell会将我们的指令以空格为分隔符,将这个长字符串切割成一个个小字符串,也就是一个个指令,然后每个指令都是一个字符串类型,然后让根据argc来开辟argv的空间,然后让argv存储着一个个指令。

看下图可以更好的理解:

image-20241122194900464

4.8.1.1命令行参数的意义

可以通过输入分割出来的小字符串来实现不同功能的实现——即argc和argv的应用

下面是便于理解的例子:

image-20241124012851012

下面是实验结果:

image-20241124012728028

经过这个实验结果,可以看到命令行参数存在的意义:利用argc和argv两个命令行参数,执行同一个程序,但是可以通过不同的选项来实现不同的功能

这个非常常见!ls指令就是如此!

image-20241124014049014

在window中也有一个程序可以通过不同选项二实现不同功能的场景,如下图所示:

image-20241124124812278

4.8.2环境变量参数—char* env[]

image-20241124125435581

env这个环境变量参数,也是指针数组类型,装着的就是系统中env所展示的环境变量
他的结构和argv是一样的,只是每个指针变量都指向一个环境变量 。

因此可以看出,环境变量其实是被系统当做一行字符串的。

下面做个实验——通过环境变量参数来获取环境变量

代码如下:

image-20241124130824787

for循环这样写是因为,env[i]的最后一个元素是NULL,因此肯定会停止循环

实验结果:

image-20241124130912383

4.8.3总结

那学习了命令行参数和环境变量参数之后,就知道,实际上在main函数运行的时候,系统是会向main函数这个子进程传两个表的,一个表是命令行参数表,一个表是环境变量表。

这也就是为什么之前说,环境变量是能够继承给子进程的

因此实际上自己的程序在执行之前,系统是会帮我们做非常多事情的。

4.9环境变量的组织方式

前面说了,main函数运行的时候,系统会向其传两个表,而环境变量就是通过传环境变量表传给main函数的。但其实c语言还提供了一个变量来获得环境变量——environ

image-20241124202304520

这个environ是一个二级指针,指向的就是环境变量的表的开头

image-20241124202923300

每个程序都会收到一张环境表,环境表是一个字符指针数组,每个指针指向一个以’\0’结尾的环境字符串

因此,可以不通过环境变量参数env来获取环境变量,也可以通过environ变量来获取环境变量。

代码如下:

image-20241124204410135

libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头文件中,所以在使用时 要用extern声明。

执行结果如下:

image-20241124204432277

4.10获取环境变量的3种方式

  1. 通过c语言提供的接口——系统调用来获取环境变量【getenv
  2. 通过命令行参数中的环境变量参数——char *env[]
  3. 通过c语言提供的一个全局变量——char **environ

这三个获取方式更推荐getenv,因为很多场景都不是要获取全部的环境变量,而是按照需要的环境变量去获取。而getenv可以直接通过环境变量的名字来获取到想要的环境变量

相关文章:

Linux—进程概念学习-03

目录 Linux—进程学习—31.进程优先级1.1Linux中的进程优先级1.2修改进程优先级—top 2.进程的其他概念3.进程切换4.环境变量4.0环境变量的理解4.1环境变量的基本概念4.2添加环境变量—export4.3Linux中环境变量的由来4.4常见环境变量4.5和环境变量相关的命令4.6通过系统调用获…...

设计模式之破环单例模式和阻止破坏

目录 1. 序列化和反序列化2. 反射 这里单例模式就不多说了 23种设计模式之单例模式 1. 序列化和反序列化 这里用饿汉式来做例子 LazySingleton import java.io.Serializable;public class LazySingleton implements Serializable {private static LazySingleton lazySinglet…...

c++(斗罗大陆)

这次&#xff0c;作者编了斗罗大陆的武魂、魂力等级&#xff0c;目前只写到了11级 #include<iostream> #include<conio.h> #include<windows.h> #include<stdlib.h> #include<stdio.h> #include<time.h> #include<strin…...

NodeJs使用Addon调用C++

本文介绍的是NodeJs使用node-addon-api调用C的方法 node-addon-api是一个C封装&#xff0c;基于N-API构建&#xff0c;目的是提供一个更高级和更易用的接口&#xff0c;但它仍然依赖N-API。 官方参考文档 开发环境 必须具备NodeJs环境 Window配置NodeJs环境&#xff08;绅士版…...

YOLOv11(Ultralytics)视频选定区域目标统计计数及跟踪

在计算机视觉的众多应用场景中&#xff0c;对特定区域的目标进行检测、跟踪与计数是一个常见且重要的需求。无论是在智慧交通中统计通过特定路口的车辆数量&#xff0c;还是在零售分析中追踪进入特定区域的顾客行为&#xff0c;这一功能都发挥着不可或缺的作用。 随着深度学习…...

【Nginx系列】Nginx配置优先级

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

搭建私有docker仓库

1. 安装docker依赖包 sudo yum install -y yum-utils device-mapper-persistent-data lvm2 sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo sudo yum install docker-ce docker-ce-cli containerd.io sudo systemctl …...

C语言练级->##__VA_ARGS__(可变参数)的用法

有什么用&#xff1f; 通常__VA_ARGS__用于宏定义&#xff0c;其中关于日志宏需要用的&#xff0c;printf 等支持可变参数的函数的宏封装。 首先我们先知道这个__VA_ARGS__的英文全称是“Variadic Arguments” 叫可变参数。说到可变参数学过C语言的朋友们应该都会想到printf&…...

在 wordpress 中简易目录插件添加滑动条

实现思路 给目录容器添加一个 固定高度&#xff0c;并设置 CSS 的 overflow 属性 为 auto 或 scroll&#xff0c;使其内容可滚动。确保目录的滚动行为独立于页面的整体滚动。优化用户体验&#xff0c;添加平滑滚动效果。 操作步骤 1. 检查目录的 HTML 结构 首先&#xff0c;…...

Linux和Ubuntu的关系

Linux和Ubuntu的关系&#xff1a; 1. Linux本身是内核&#xff0c;Ubuntu系统是基于Linux内核的操作系统。 2. Linux内核操作系统的构成&#xff1a; 内核、shell、文件系统、应用程序 -应用程序&#xff1a;文本编辑器等 -文件系统&#xff1a;文件存放在存储设备上的组织方…...

【大数据学习 | Spark-Core】详解Spark的Shuffle阶段

1. shuffle前言 对spark任务划分阶段&#xff0c;遇到宽依赖会断开&#xff0c;所以在stage 与 stage 之间会产生shuffle&#xff0c;大多数Spark作业的性能主要就是消耗在了shuffle环节&#xff0c;因为该环节包含了大量的磁盘IO、序列化、网络数据传输等操作。 负责shuffle…...

缓存方案分享

不知道大家平常更新缓存是怎么做的&#xff0c;但是大部分时候都是更新数据的同时更新缓存&#xff0c;今天和同事一起聊到一个缓存方案的问题&#xff0c;感觉很有趣、非常精妙&#xff0c;记录一下。 基于此本文将介绍几种常见的缓存更新策略&#xff0c;包括简单的缓存覆盖…...

从零开始配置Qt+VsCode环境

从零开始配置QtVsCode环境 文章目录 从零开始配置QtVsCode环境写在前面扩展安装及配置Qt Configure配置 VsCode创建Qt工程VsCodeQMakeMinGwVsCodeQMakeMsvcVsCodeCMakeMinGwVsCodeCMakeMsvcQtCreatorQMakeMinGw->VsCodeQtCreatorQMakeMsvc->VsCodeQtCreatorCMakeMinGw-&g…...

Linux中离线安装gcc

gcc在安装一些其他工具的经常用到&#xff0c;在此记录下如何安装gcc。 1.在线安装 yum -y install gcc 2.离线安装 2.1 获取安装包链接&#xff1a; https://pan.baidu.com/s/1oDvt64ByWs1w-evz5TXU7w?pwd9cfo mpfr-3.1.1-4.el7.x86_64.rpmlibmpc-1.0.1-3.el7.x86_64.rp…...

告别 Kafka,拥抱 Databend:构建高效低成本的用户行为分析体系

用户行为数据埋点指标是数据仓库中不可或缺的重要数据源之一&#xff0c;同时也是企业最宝贵的资产之一。通常情况下&#xff0c;用户行为数据分析包含两大数据源&#xff1a;用户行为分析日志和上游关系型数据库&#xff08;如 MySQL&#xff09;。基于这些数据&#xff0c;企…...

【python 迪杰斯特拉-最短路径算法】

- 算法实现 import heapq import networkx as nx import matplotlib.pyplot as pltdef dijkstra(graph, start, goal):distances {node: float("infinity") for node in graph}distances[start] 0parents {node: None for node in graph}priority_queue [(0, st…...

从〇开始深度学习(0)——背景知识与环境配置

从〇开始深度学习(0)——背景知识与环境配置 文章目录 从〇开始深度学习(0)——背景知识与环境配置写在前面1.背景知识1.1.Pytorch1.2.Anaconda1.3.Pycharm1.4.CPU与GPU1.5.整体关系 2.环境配置2.1.准备工作2.1.1.判断有无英伟达显卡2.1.2.清理电脑里的旧环境 2.1.安装Anaconda…...

【NLP 2、机器学习简介】

人生的苦难不过伏尔加河上的纤夫 —— 24.11.27 一、机器学习起源 机器学习的本质 —— 找规律 通过一定量的训练样本找到这些数据样本中所蕴含的规律 规律愈发复杂&#xff0c;机器学习就是在其中找到这些的规律&#xff0c;挖掘规律建立一个公式&#xff0c;导致对陌生的数…...

多目标优化算法——多目标粒子群优化算法(MOPSO)

Handling Multiple Objectives With Particle Swarm Optimization&#xff08;多目标粒子群优化算法&#xff09; 一、摘要&#xff1a; 本文提出了一种将帕累托优势引入粒子群优化算法的方法&#xff0c;使该算法能够处理具有多个目标函数的问题。与目前其他将粒子群算法扩展…...

Edify 3D: Scalable High-Quality 3D Asset Generation

Deep Imagination Research | NVIDIA 目录 一、Abstract 二、核心内容 1、多视图扩散模型 3、重建模型&#xff1a; 4、数据处理模块&#xff1a; 三、结果 1、文本到 3D 生成结果 2、图像到 3D 生成结果 3、四边形网格拓扑结构 一、Abstract NVIDIA 开发的用于高质量…...

探索校企合作新模式:职业院校大数据专业实验(实训)室建设指南

一、引言 作为一种强大的信息处理与分析工具&#xff0c;大数据技术在企业管理、科研探索、社会治理等多个领域均产生了广泛而深远的影响。在此背景下&#xff0c;大数据实验室的建设显得尤为重要&#xff0c;而校企合作则为这一建设提供了坚实的支撑。学校借助企业资源&#…...

YOLO的框架及版本迭代

YOLO&#xff08;You Only Look Once&#xff09;是一种非常流行的实时目标检测算法&#xff0c;其特点是将目标检测任务转换为一个回归问题&#xff0c;通过一次前向传播就可以同时完成目标的分类和定位。以下是YOLO框架的整体架构和工作原理&#xff1a; 一、YOLO的基本框架…...

第四十篇 DDP模型并行

摘要 分布式数据并行(DDP)技术是深度学习领域中的一项重要技术,它通过将数据和计算任务分布在多个计算节点上,实现了大规模模型的并行训练。 DDP技术的基本原理是将数据和模型参数分割成多个部分,每个部分由一个计算节点负责处理。在训练过程中,每个节点独立计算梯度,…...

鸿蒙进阶篇-状态管理之@Provide与@Consume

大家好&#xff0c;这里是鸿蒙开天组&#xff0c;今天我们来学习一下状态管理中的Provide与Consume。 一、概述 嘿&#xff01;大家还记得这张图吗&#xff1f;不记得也要记得哦&#xff0c;因为这张图里的东西&#xff0c;既是高频必考面试题&#xff0c;也是实际开发中&…...

鸿蒙本地模拟器 模拟TCP服务端的过程

鸿蒙模拟器模拟TCP服务端的过程涉及几个关键步骤&#xff0c;主要包括创建TCPSocketServer实例、绑定IP地址和端口、监听连接请求、接收和发送数据以及处理连接事件。以下是详细的模拟过程&#xff1a; **1.创建TCPSocketServer实例&#xff1a;**首先&#xff0c;需要导入鸿蒙…...

Qt程序发布及打包成exe安装包

参考:Qt之程序发布以及打包成exe安装包 目录 一、简述 Qt 项目开发完成之后,需要打包发布程序,而因为用户电脑上没有 Qt 配置环境,所以需要将 release 生成的 exe 文件和所依赖的 dll 文件复制到一个文件夹中,然后再用 Inno Setup 打包工具打包成一个 exe 安装包,就可以…...

Spring Boot + ActiveMQ Artemis:快速实现高效消息队列处理功能

在现代微服务架构中&#xff0c;消息队列是实现异步通信、解耦系统的重要手段。而通过 Spring Boot 和 ActiveMQ Artemis&#xff0c;您可以快速搭建一个高效、可靠的消息队列处理系统&#xff0c;轻松应对订单处理、日志分析等场景。本文将带您从零开始&#xff0c;逐步实现一…...

【FPGA-MicroBlaze】串口收发以及相关函数讲解

前言 工具&#xff1a;Vivado2018.3及其所对应的SDK版本 目前网上有许多MicroBlaze 的入门教程&#xff0c;比如下面的这个参考文章&#xff0c;用串口打印一个hello world。 【FPGA】Xilinx MicroBlaze软核使用第一节&#xff1a;Hello World!_fpga软核microblaze-CSDN博客 个…...

CGAL CGAL::Polygon_mesh_processing::self_intersections解析

CGAL::Polygon_mesh_processing::self_intersections 是用于检测多边形网格&#xff08;Polygon Mesh&#xff09;中的自相交的函数。自相交是指网格中的某些面&#xff08;例如三角形&#xff09;与同一网格中的其他面交叉的情况。这种情况通常是不期望的&#xff0c;因为它会…...

猎户星空发布MoE大模型,推出AI数据宝AirDS

发布 | 大力财经 11月27日&#xff0c;猎户星空联合聚云科技举办了题为《Data Ready for Al&#xff0c;MoE大模型发布暨商业闭环分享》媒体见面会。猎户星空正式发布了自主研发的Orion-MoE 87B大模型&#xff0c;并携手聚云科技推出了基于该大模型的数据服务—AI数据宝AirDS&a…...

什么是JSON,有什么特点

什么是 JSON&#xff1f; JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;易于人阅读和编写&#xff0c;同时也易于机器解析和生成。它基于 JavaScript 的子集&#xff0c;但独立于语言&#xff0c;被广泛用于服务器与 Web 应…...

SQL注入SQL盲注

SQL注入&#xff08;SQL Injection&#xff09;和 SQL盲注&#xff08;Blind SQL Injection&#xff09;是两种常见的Web安全攻击技术&#xff0c;用于攻击应用程序并操纵其与数据库的交互。以下是两者的概念和区别&#xff1a; 1. SQL注入 定义&#xff1a; SQL注入是通过将…...

汽车轮毂结构分析有哪些?国产3D仿真分析实现静力学+模态分析

本文为CAD芯智库原创&#xff0c;未经允许请勿复制、转载&#xff01; 之前分享了如何通过国产三维CAD软件如何实现「汽车/汽配行业产品设计」&#xff0c;兼容NX&#xff08;UG&#xff09;、Creo&#xff08;Proe&#xff09;&#xff0c;轻松降低企业上下游图纸交互成本等。…...

C++设计模式之组合模式在解决层次性问题中的好处

采用组合模式在处理层次型问题时&#xff0c;会带来以下重要好处&#xff1a; 简化客户端操作&#xff1a; 客户端代码可以统一地处理单个对象和组合对象&#xff0c;而无需区分它们。这意味着客户端可以使用相同的操作来对待所有对象&#xff0c;无论它们是简单的叶子节点还是…...

基于大数据爬虫+SpringBoot+Hive的网络电视剧收视率分析与可视化平台系统(源码+论文+PPT+部署文档教程等)

博主介绍&#xff1a;CSDN毕设辅导第一人、全网粉丝50W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围&#xff1a;SpringB…...

【ESP32CAM+Android+C#上位机】ESP32-CAM在STA或AP模式下基于UDP与手机APP或C#上位机进行视频流/图像传输

前言: 本项目实现ESP32-CAM在STA或AP模式下基于UDP与手机APP或C#上位机进行视频流/图像传输。本项目包含有ESP32源码(arduino)、Android手机APP源码以及C#上位机源码,本文对其工程项目的配置使用进行讲解。实战开发,亲测无误。 AP模式,就是ESP32发出一个WIFI/热点提供给电…...

️ 如何优化爬虫程序以提高抓取效率?

在开发爬虫程序时&#xff0c;提高抓取效率是至关重要的。以下是一些常见的性能优化策略&#xff0c;可以帮助你优化Java爬虫程序&#xff1a; 多线程与分布式抓取&#xff1a; 利用多线程技术可以显著提高爬虫的抓取速度。例如&#xff0c;在WebMagic中&#xff0c;可以通过配…...

深入理解 MySQL 锁机制:分类、实现与优化

在高并发的数据库应用中&#xff0c;锁机制是保障事务在操作数据库时数据一致性和完整性的重要工具。MySQL 提供了多种类型的锁&#xff0c;不同的存储引擎和场景下的实现各具特点。本篇文章将详细介绍 MySQL 锁的分类、实现&#xff08;主动与被动&#xff09;以及优化策略。 …...

python-docx -- 读取word页眉、页脚

文章目录 sections介绍访问section添加section页眉、页脚综合案例:sections介绍 word支持section的概念,即一个文档的划分部分,不同的部分均包含相同的页面布局设置,如相同的边距、页面方向等;在每个section中可以定义页眉、页脚来应用于该section下的所有页面;大部分wor…...

DRM(数字权限管理技术)防截屏录屏----ffmpeg安装

提示&#xff1a;ffmpeg安装 文章目录 [TOC](文章目录) 前言一、下载二、配置环境变量三、运行ffmpeg四、文档总结 前言 FFmpeg是一套可以用来记录、转换数字音频、视频&#xff0c;并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的…...

【Linux 篇】Docker 启动和停止的精准掌舵:操控指南

文章目录 【Linux 篇】Docker 启动和停止的精准掌舵&#xff1a;操控指南前言docker基本命令1. 帮助手册 2. 指令介绍 常用命令1. 查看镜像2. 搜索镜像3. 拉取镜像4. 删除镜像5. 从Docker Hub拉取 容器的相关命令1. 查看容器2. 创建与启动容器3. 查看镜像4. 启动容器5. 查看容…...

【电路设计】基于CD4511的八路抢答器电路解析

文章目录 0 前言1 CD45112 电路解析3 锁存分析4 电路优化思考5 总结 0 前言 最近收拾东西的时候找到了本科阶段学电路焊接时焊的一个八路抢答器的电路板&#xff0c;如下图所示。 一共有9个按键&#xff0c;左侧8个为抢答按键&#xff0c;依次对应1-8&#xff0c;按下之后会有…...

Python 爬虫入门教程:从零构建你的第一个网络爬虫

网络爬虫是一种自动化程序&#xff0c;用于从网站抓取数据。Python 凭借其丰富的库和简单的语法&#xff0c;是构建网络爬虫的理想语言。本文将带你从零开始学习 Python 爬虫的基本知识&#xff0c;并实现一个简单的爬虫项目。 1. 什么是网络爬虫&#xff1f; 网络爬虫&#x…...

2024年11月27日Github流行趋势

项目名称&#xff1a;screenshot-to-code 项目维护者&#xff1a;abi clean99 sweep-ai kachbit vagusX项目介绍&#xff1a;通过上传截图将其转换为整洁的代码&#xff08;支持HTML/Tailwind/React/Vue&#xff09;。项目star数&#xff1a;62,429项目fork数&#xff1a;7,614…...

深入浅出摸透AIGC文生图产品SD(Stable Diffusion)

hihi,朋友们,时隔半年(24年11月),终于能腾出时间唠一唠SD了🤣,真怕再不唠一唠,就轮不到SD了,技术更新换代是在是太快! 朋友们,最近(24年2月)是真的没时间整理笔记,每天都在疯狂的学习Stable Diffusion和WebUI & ComfyUI,工作实在有点忙,实践期间在飞书上…...

thinkphp日志记录到文件

日志 //控制器中 //这种方法调用的话&#xff0c;在general_technology下按照日期写入日志 LogService::requestLog(general_technology,$this->baseUrl .$url,$params,$res); LogService::responseLog(general_technology/hebei_product_add_error, $syncData,$msg); LogSe…...

WPF ItemsControl控件

ItemsControl 是 WPF 中一个非常灵活的控件&#xff0c;用于显示一组数据项。它是一个基类&#xff0c;许多其他控件&#xff08;如 ListBox, ListView, ComboBox 等&#xff09;都是从 ItemsControl 继承而来。ItemsControl 的主要特点是它可以自定义数据项的显示方式&#xf…...

【Android+多线程】IntentService 知识总结:应用场景 / 使用步骤 / 源码分析

定义 IntentService 是 Android中的一个封装类&#xff0c;继承自四大组件之一的Service 功能 处理异步请求 & 实现多线程 应用场景 线程任务 需 按顺序、在后台执行 最常见的场景&#xff1a;离线下载不符合多个数据同时请求的场景&#xff1a;所有的任务都在同一个T…...

编译 LLVM 源码,使用 Clion 调试 clang

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ 1. LLVM 简介 LLVM 是一个开源的编译器基础架构&#xff0c;最初由 Chris Lattner 于 2000 年在伊利诺伊大学开发&#xff0c;后来成为一个广泛应用于编译器和…...

ssm199旅游景点管理系统设计+jsp(论文+源码)_kaic

毕 业 设 计&#xff08;论 文&#xff09; 题目&#xff1a;旅游景点管理系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本旅游景点管理系统…...