最新资讯

  • 优先级与环境变量的艺术:驾驭 Linux 系统的核心

优先级与环境变量的艺术:驾驭 Linux 系统的核心

2025-04-28 23:00:03 1 阅读

文章目录

  • 前言
    • 一、什么是进程优先级?
    • 二、Linux 系统中的优先级
      • 2.1 查看进程优先级
      • 2.2 PRI 和 NI 的关系
      • 2.3 修改进程优先级
      • 2.4 进程优先级的实现原理
      • 2.5 进程的特性
    • 三、环境变量
      • 3.1 PATH——搜索可执行文件的目录列表
        • 1. 为什么自己写的程序需要加 `./` 才能执行?
        • 2. 为什么执行指令时不需要加路径?
        • 3. 如何查看和修改 `PATH`?
      • 3.2 HOME——表示当前用户的主目录路径
        • 1. 什么是 `HOME`?
        • 2. 作为默认工作目录
        • 3. 查看 `HOME` 环境变量的值
      • 3.3 USER——存储当前登录用户的用户名
        • 1. 示例代码 1:打印当前用户
        • 2. 示例代码 2:判断用户权限
        • 3. USER 与权限认证
    • 四、命令行参数
      • 4.1 什么是命令行参数?
      • 4.2 main 函数的形式
      • 4.3 命令行参数的作用
      • 4.4 main函数的第三个参数
      • 4.5 环境变量的继承
        • 验证子进程继承环境变量
    • 五、本地变量与内建命令
      • 5.1 为什么 `echo` 能打印本地变量
  • 结语


前言

在 Linux 系统中,进程和环境变量是操作系统的核心组成部分。进程优先级决定了资源分配的先后顺序,直接影响系统性能;而环境变量则提供了一种灵活的方式,用于传递系统配置信息以及控制程序的运行环境。本篇文章将深入探讨进程优先级的概念、调节方法及其原理,以及环境变量的定义、特性和实际应用,帮助读者更好地理解 Linux 系统的核心机制,从而在实际工作中更高效地调试和优化系统。


一、什么是进程优先级?

  1. 优先级的定义
    • 优先级决定了多个进程竞争 CPU 时,哪个进程优先获得 CPU 时间片。
    • 区别于权限,权限决定能不能执行某个任务,而优先级决定谁先执行
  2. 优先级的作用
    • 通过优先级机制,操作系统能够公平地分配 CPU 资源,防止某些进程长期得不到 CPU 的问题(即进程饥饿问题)。
    • 例如:
      • 高优先级进程(实时任务)可以更快地执行。
      • 低优先级进程可能被推迟,但不会被饿死(通过调度算法保证)。
  3. 小结
    • CPU 资源分配的先后顺序由优先级决定。
    • Linux 的调度器根据优先级动态调度进程,提高系统的整体性能。

二、Linux 系统中的优先级

2.1 查看进程优先级

示例代码

#include 
#include 

int main() {
    while (1) {
        printf("I am a process, PID:%d, PPID:%d
", getpid(), getppid());
        sleep(1);
    }
    return 0;
}

运行步骤

  1. 编译运行程序:

    gcc process.c -o process
    ./process
    
  2. 打开另一个终端,查看进程的优先级:

    ps -al | head -1 ; ps -al | grep process
    


输出字段解析

  • UID:表示进程的执行者身份。
  • PID:当前进程的 ID。
  • PPID:当前进程的父进程 ID。
  • PRI:进程的优先级值,值越小优先级越高。
  • NI:进程的 nice 值,调整优先级的修正值。

2.2 PRI 和 NI 的关系

  1. PRI(Priority)

    • 表示进程的实际优先级,值越小优先级越高。
    • Linux 调度器根据 PRI 值决定哪个进程优先执行。
  2. NI(Nice 值)

    • 是进程优先级的修正值,用户可以通过调整 nice 值来影响 PRI 值。
    • nice 值范围:
      • [-20, 19],共 40 个级别。
      • 默认值是 0
    • nice 值的影响:
      • 负数:提高优先级(PRI 值减小)。
      • 正数:降低优先级(PRI 值增大)。
  3. 关系公式

    PRI(new) = PRI(old) + nice
    
    • PRI(old):系统默认优先级,起始值为 80
    • nice 值:用户设置的调整值。
  4. 举例

    • 默认情况下(nice=0),PRI 值为 80。

    • 如果 nice=-10,则:

      PRI = 80 + (-10) = 70  (优先级提高)
      

2.3 修改进程优先级

  1. 查看进程优先级(top 命令)

    • 使用 top 实时监控系统进程:

      top
      
    • 找到目标进程的 PID

  2. 修改优先级

    • top 中,按下 r 键。
    • 输入目标进程的 PID
    • 输入新的 nice 值(范围:-20 至 19)。
  3. 命令行方式修改

    • 启动新进程并设置 nice 值

      nice -n <nice值> ./process
      

      示例:

      nice -n -10 ./process
      
    • 调整运行中的进程

      renice <nice值> -p <PID>
      

      示例:

      renice -5 -p 12345
      
  4. 注意

    • 只有 root 用户 可以设置负的 nice 值(提高优先级)。
    • 普通用户只能降低优先级。

2.4 进程优先级的实现原理

  1. 进程控制块(PCB)
    • 每个进程在内核中对应一个 task_struct 结构体(即进程控制块)。
    • task_struct 中包含进程的优先级、状态等信息。
  2. 优先级队列
    • 系统根据进程的 PRI 值将其加入对应的优先级队列。
    • 修改优先级的本质:
      • 当调整进程的 nice 值时,内核会将该进程从当前队列移出,并重新加入新的优先级队列。

2.5 进程的特性

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

  • 独立性:多进程运行,需要独享各种资源,多进程运行期间互不干扰。

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

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

并发情况下, 操作系统会根据每个进程的时间片进行进程间的切换,只要当前正在被 CPU 调度的进程的时间片到了,无论有没有执行结束,都会被操作系统从 CPU 上拿下来,放到 waiting 数组中去排队,等待 CPU 的下一次调度,我们把这种过程叫做进程基于时间片轮转的调度算法。

两个问题:

1.为什么函数返回值,会被外部拿到呢?

函数调用过程中,栈会保存必要的信息,包括返回地址、参数和局部变量等。

返回值通过寄存器或栈上的特定位置传递给调用者:

  • 如果返回值是通过栈返回,调用者会在栈上预留一块区域,函数直接将返回值写入这块区域。
  • 在调用完成后,调用者通过栈指针或其他方法从指定位置获取返回值。

2.系统如何得知进程当前执行到哪一行代码了?

CPU 中的程序计数器寄存器 ( PC 或者 eip ) 保存着当前正在执行指令的地址。每次指令执行完毕,程序计数器会自动递增(或根据控制流指令,如 jmpcallret 等更新),以指向下一条需要执行的指令。

补充知识:寄存器

  • CPU 中的寄存器有很多种,例如:通用寄存器 eax、ebx、ecx、edx;和栈帧有关的寄存器 ebp、esp、eip;和状态有关的寄存器 status。

  • 寄存器扮演什么角色?提高效率,进程的高频数据会放入寄存器中。

  • 寄存器也有对数据保存的能力,计算机在运行时一些重要的数据一定要保存在 CPU 内部,即寄存器中,因为寄存器离 CPU 很近且存储效率高,所以 CPU 内的寄存器保存的是进程相关的数据,可以随时被 CPU 访问或者修改,这种和进程有关的数据也被叫做进程的上下文。

  • 进程在 CPU 上离开时要将自己的上下文数据保存好,甚至带走,这样做的目的是为了未来“回来”的时候进行恢复。进程在被切换的时候有两步:**1. 保存上下文,2. 恢复上下文。**进程的上下文数据量并不大,一般可以直接保存到进程的 PCB 对象中,当 CPU 再次调度该进程的时候,将这些上下文数据再恢复到寄存器里面即可。

三、环境变量

环境变量是操作系统用于存储系统范围内或用户特定信息的键值对,通常用于配置系统和应用程序运行时的行为。通过设置和读取环境变量,操作系统、开发工具和应用程序能够更灵活地响应不同的运行环境。

上图是 Windows 系统下的环境变量,本质上就是一组键值对,接下来将演示 Linux 系统下常见的环境变量。

3.1 PATH——搜索可执行文件的目录列表

1. 为什么自己写的程序需要加 ./ 才能执行?
  • 默认搜索路径中没有当前目录:当前目录(.)通常并不包含在 PATH 环境变量中。这是为了避免安全隐患(防止恶意程序通过伪造指令干扰系统)。

  • ./ 的作用:加 ./ 明确告诉系统,程序位于当前目录下。例如:

    ./my_program
    

    表示运行当前目录下名为 my_program 的程序。

2. 为什么执行指令时不需要加路径?
  • 指令(如 lscat)的本质:它们是存放在系统目录中的可执行程序,通常位于 /usr/bin//bin/ 等目录下。

  • PATH 环境变量:Linux 系统通过 PATH 环境变量来指定一系列目录,当你在终端输入指令时,系统会按照 PATH 中定义的目录顺序,依次查找该指令对应的可执行程序。

  • 查找过程

    • 输入 ls 时,系统会在 PATH 的所有目录中搜索 ls 对应的程序(如 /usr/bin/ls),一旦找到,就直接执行。
    • 如果未找到,系统会报错 command not found
3. 如何查看和修改 PATH

1. 查看 PATH

echo $PATH

输出示例:


表示系统会依次在 /usr/local/bin/usr/bin/bin 等目录中查找命令。

2.临时添加路径到 PATH

PATH=$PATH:/home/xny/linux/lesson13
  • /home/xny/linux/lesson13 是当前工作目录。
  • $PATH 表示保留原有的搜索路径,不覆盖。
  • 该修改仅对当前终端有效,关闭终端后会恢复默认。

    此时我们当前的工作目录也被添加了进去,此时在该目录下的可执行程序在执行的时候就可以不加 ./ 了。

    如图所示,mycmd可以直接当作命令使用了。

3.2 HOME——表示当前用户的主目录路径

1. 什么是 HOME

HOME 是 Linux 系统中的一个环境变量,它表示当前用户的主目录路径。主目录是每个用户的个人工作空间,用于存储用户的配置文件、文档、下载文件等。不同的用户拥有各自的主目录,彼此隔离。

  • 普通用户的 HOME 路径:通常位于 /home/username
  • 超级用户(root)的 HOME 路径:默认为 /root
2. 作为默认工作目录
  • 用户登录系统时,Shell 默认进入 HOME 目录。
  • 输入 cd(不带参数)或 cd ~ 时,都会切换到 HOME 目录。
3. 查看 HOME 环境变量的值
echo $HOME

示例输出:

我们可以通过 env 指令查看当前 bash 从操作系统中继承下来的所有环境变量。

除了使用 env 指令,我们还可以通过 getenv 这个系统调用接口来获取某个环境变量的值。

3.3 USER——存储当前登录用户的用户名

USER 是一个系统环境变量,用来存储当前登录用户的用户名。Linux 系统依赖此变量来标识当前用户,并根据其权限级别(如普通用户或 root 用户)提供不同的访问权限。

1. 示例代码 1:打印当前用户
#include 
#include 

int main()
{
    printf("USER: %s
", getenv("USER"));
    return 0;
}

解释:

  1. getenv("USER")

    • 调用 C 标准库函数 getenv 获取环境变量 USER 的值,即当前登录用户的用户名。
  2. 打印结果:

    • 不同用户运行此程序时,会得到各自的用户名。例如:

      USER: root
      

      USER: john
      
2. 示例代码 2:判断用户权限
#include 
#include 
#include 

int main()    
{    
    char user[32];    
    strcpy(user, getenv("USER"));    
    if(strcmp("root", user) == 0)    
    {    
        printf("root用户,不受权限约束
");    
    }    
    else    
    {    
        printf("普通用户,受权限约束
");    
    }    
    printf("USER: %s
", getenv("USER"));    
    return 0;                                                                 
}    

功能:

  1. 读取环境变量 USER
    • 使用 getenv("USER") 获取当前登录用户名。
    • 将用户名存储在 user 字符数组中。
  2. 判断是否为 root 用户:
    • 使用 strcmp 函数对比用户名是否为 root
    • 如果是 root,则打印 “root用户,不受权限约束”。
    • 如果不是,则打印 “普通用户,受权限约束”。
  3. 打印当前用户:
    • 再次打印当前用户的用户名。

运行结果示例:

  • 如果 root 用户运行程序:

    root用户,不受权限约束
    USER: root
    
  • 如果普通用户(如 john)运行程序:

    普通用户,受权限约束
    USER: john
    
3. USER 与权限认证
  1. 系统权限判断:
    • Linux 系统会使用当前用户的 USER 变量与文件的拥有者和权限信息进行对比,判断当前用户是否有权访问或修改文件。
  2. 权限模型:
    • 每个文件或目录都有三类权限:
      • 拥有者(Owner):文件的所有者。
      • 所属组(Group):文件所属的用户组。
      • 其他用户(Other):不属于以上两类的用户。
    • 权限分为三种:
      • 读(r)、写(w)、执行(x)。
  3. USER 的实际作用:
    • 当用户执行某些操作(如访问文件、运行程序)时,系统会获取 USER 变量的值,判断当前用户是否有对应权限。例如:
      • 如果是 root 用户,通常不受权限限制。
      • 如果是普通用户,则需要对比权限位。

四、命令行参数

4.1 什么是命令行参数?

命令行参数是指在运行程序时通过命令行传递给程序的参数。它们使程序可以接受外部输入,从而改变程序的行为或处理不同的数据。

在 C/C++ 中,命令行参数通过 main 函数的参数 argcargv 获取:

  • argc(argument count):参数的数量。
  • argv(argument vector):一个字符串数组,每个元素是一个参数的值。

4.2 main 函数的形式

int main(int argc, char *argv[])
  • argc:表示参数的个数,包括程序本身的名称。
    • 如果程序运行时没有额外参数,则 argc 值为 1。
  • argv:一个指针数组,存储每个参数的字符串。
    • argv[0]:始终是程序的名称(包含路径)。
    • argv[1]argv[argc-1]:表示传递给程序的实际参数。
int main(int argc, char* argv[])    
{    
    int i = 0;    
    for(; i < argc; i++)    
    {    
        printf("argv[%d]->%s
",i, argv[i]);    
    }    
    return 0;    
} 

运行示例:

命令行参数通过以下方式传递给程序:

  • 当我们在命令行输入 ./mycode -a -b -c 时,bash 会将这整行输入当作一个字符串。
  • 然后,bash 使用空格作为分隔符,将字符串拆分成单独的部分。
  • 拆分后的部分作为字符串,存储在一个字符串数组中,这个数组的首地址传递给 argv,其大小传递给 argc
  • argv 是一个指针数组,其最后一个元素会自动被设置为 NULL,用来标识参数结束。这种设计的好处是方便程序在处理参数时快速检测结束标志,而不用依赖 argc

4.3 命令行参数的作用

命令行参数的一个重要作用是为程序、指令或工具提供灵活的选项支持,以便实现不同的功能或行为。

#include 
#include 

int main(int argc, char* argv[])    
{    
    if (argc != 2) {  // 参数数量校验
        printf("./mycode [-a|-b|-c|-d]
");
        return 0;
    }    
    
    if (strcmp(argv[1], "-a") == 0) {  // 判断第一个参数是否为 "-a"
        printf("功能1
");
    } else if (strcmp(argv[1], "-b") == 0) { 
        printf("功能2
");
    } else if (strcmp(argv[1], "-c") == 0) { 
        printf("功能3
");
    } else if (strcmp(argv[1], "-d") == 0) { 
        printf("功能4
");
    } else { 
        printf("功能5
");
    }
        
    return 0;    
}

运行示例:

命令行参数有一个重要的作用,它可以为指令、工具、软件等提供命令行选项的支持。

4.4 main函数的第三个参数

除了上面提到的 argcargv 两个参数,main 函数还有第三个参数 env,它也是一个指针数组,存放的是该进程的环境变量。

#include 
int main(int argc, char* argv[], char* env[])    
{    
    int i = 0;    
    for (; env[i]; i++) {    
        printf("env[%d] -> %s
", i, env[i]);    
    }
    
    return 0;   
}

  • 在 C/C++ 中,程序通常会使用两张核心向量表:

    1. 命令行参数表(argcargv

      • 用于接收用户通过命令行传递的参数。
      • 提供了程序运行时的输入灵活性和动态控制能力。
    2. 环境变量表(env

      • 用于存储操作系统中的全局配置信息。
      • 包含用户信息、语言设置、路径变量等,且由父进程传递给子进程。
  • 运行指令与程序的关系:

    1. 命令行参数

      • 每个命令行指令都会拆解为多个部分,分别存储在 argv 数组中。
      • 程序运行时可以通过 argvargc 获取这些参数,并根据参数执行不同的功能。
    2. 环境变量继承

      • 当我们在 bash 中运行程序时,bash 作为父进程会将其环境变量传递给程序(子进程)。

      • 这使得程序可以通过读取环境变量动态适应运行环境。

4.5 环境变量的继承

验证子进程继承环境变量

设置环境变量 在 Bash 中执行以下命令:

export MY_VALUE=12345678
  • 通过 export 将本地变量转化为环境变量。

然后再查看当前的环境变量:

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

正是因为子进程可以继承父进程的环境变量,所以我们在 bash 输入的所有指令都要遵守权限,因为输入的所有指令都可以看做是 bash 的子进程,都继承了 bash 的环境变量。通过下面这条指令可以删除环境变量。

unset MY_VALUE

五、本地变量与内建命令

本地变量:就是在命令行中直接定义的变量。

  • 本地变量是通过 bash 命令行直接定义的,仅在当前 bash 会话中有效。
  • 本地变量不能被子进程继承。

环境变量

  • 环境变量是可以被子进程继承的变量。
  • 通过 export 将本地变量转化为环境变量。

查看所有变量:使用 set 查看:

set

5.1 为什么 echo 能打印本地变量

我们可以通过 echo 指令打印出本地变量,之前说过 echo 作为指令,本质上也是一个可执行程序,既然是可执行程序,那就会创建进程,但是我们又说了子进程是无法继承父进程的本地变量,那为什么 echo 可以打印出父进程 bash 的本地变量呢?

本地变量的作用域:仅在当前 bash 会话中有效。

echo 是内建命令:直接由 bash 执行,不创建子进程,因此可以访问 bash 的本地变量。

内建命令与常规命令

bash 中的指令可以分为两类:

  1. 常规命令
    • 通过创建子进程执行的外部程序。
    • 示例:
      • ls:使用 fork 创建子进程,然后执行 execve 加载外部程序。
  2. 内建命令
    • bash 自身直接实现,不会创建子进程。
    • 示例:
      • echocdexportset 等。

echo 就是一个内建命令,执行 echo 命令的时候并不会创建子进程.

同样的,cd 也是一个内建命令,用于切换当前工作目录。其本质是调用系统接口 chdir(),直接改变当前进程的工作目录。

除了上面提到的两种通过代码获取环境变量的方法(命令行第三个参数、getenv系统接口)外,还可以通过全局变量 environ获取

  • libc 提供的全局变量 environ,指向环境变量表。
  • 需要 extern 显式声明后使用:
#include 
int main(int argc, char *argv[])
{
	extern char **environ;
	int i = 0;
	for(; environ[i]; i++)
	{
		printf("%s
", environ[i]);
	}
	return 0;
}

结语

通过对进程优先级和环境变量的深入学习,我们可以发现,它们在 Linux 系统中扮演着不可或缺的角色。进程优先级确保了多任务系统中资源的公平竞争和高效利用,而环境变量为系统和用户程序的交互提供了灵活性和动态配置的能力。掌握它们不仅能帮助我们优化系统性能,还能提升在日常开发和运维中的效率。希望通过本篇文章,能够让您对 Linux 系统的运行机制有更深入的认识,助力您的学习与实践。

今天的分享到这里就结束啦!如果觉得文章还不错的话,可以三连支持一下,17的主页还有很多有趣的文章,欢迎小伙伴们前去点评,您的支持就是17前进的动力!

本文地址:https://www.vps345.com/5063.html

搜索文章

Tags

PV计算 带宽计算 流量带宽 服务器带宽 上行带宽 上行速率 什么是上行带宽? CC攻击 攻击怎么办 流量攻击 DDOS攻击 服务器被攻击怎么办 源IP 服务器 linux 运维 游戏 云计算 javascript 前端 chrome edge ssh deepseek Ollama 模型联网 API CherryStudio python MCP 进程 操作系统 进程控制 Ubuntu llama 算法 opencv 自然语言处理 神经网络 语言模型 harmonyos 华为 开发语言 typescript 计算机网络 ubuntu 数据库 centos oracle 关系型 安全 分布式 django fastapi flask web3.py github 创意 社区 flutter udp unity 网络 网络协议 react.js 前端面试题 node.js 持续部署 笔记 C 环境变量 进程地址空间 Dell R750XS 科技 ai java 人工智能 个人开发 rust http macos adb mcp mcp-proxy mcp-inspector fastapi-mcp agent sse numpy nginx 监控 自动化运维 阿里云 网络安全 pycharm 深度学习 conda pillow live555 rtsp rtp json html5 firefox android vscode 代码调试 ipdb kubernetes 容器 学习方法 经验分享 程序人生 windows 搜索引擎 串口服务器 docker DeepSeek-R1 API接口 Flask FastAPI Waitress Gunicorn uWSGI Uvicorn prometheus Hyper-V WinRM TrustedHosts RTSP xop RTP RTSPServer 推流 视频 kvm 无桌面 命令行 YOLOv8 NPU Atlas800 A300I pro asi_bench apache tcp/ip matlab mount挂载磁盘 wrong fs type LVM挂载磁盘 Centos7.9 ecm bpm Deepseek c# c++ c语言 ansible playbook es jvm golang 后端 IIS .net core Hosting Bundle .NET Framework vs2022 php html oceanbase rc.local 开机自启 systemd 麒麟 机器学习 chatgpt 大模型 llama3 Chatglm 开源大模型 深度优先 图论 并集查找 换根法 树上倍增 ddos ollama llm 自动化 蓝耘科技 元生代平台工作流 ComfyUI zotero WebDAV 同步失败 代理模式 YOLO pytorch vue.js audio vue音乐播放器 vue播放音频文件 Audio音频播放器自定义样式 播放暂停进度条音量调节快进快退 自定义audio覆盖默认样式 bash spring sql KingBase 银河麒麟 kylin v10 麒麟 v10 目标检测 计算机视觉 AI 爬虫 数据集 spring boot websocket tomcat ESP32 LDAP ide nuxt3 vue3 实时音视频 filezilla 无法连接服务器 连接被服务器拒绝 vsftpd 331/530 .net 低代码 统信 国产操作系统 虚拟机安装 gitlab 面试 性能优化 jdk intellij-idea 架构 Docker Compose docker compose docker-compose 多线程服务器 Linux网络编程 debian qt uni-app shell visualstudio kafka zookeeper 嵌入式硬件 驱动开发 硬件工程 嵌入式实习 学习 5G 3GPP 卫星通信 电脑 android studio 交互 企业微信 Linux24.04 deepin WSL win11 无法解析服务器的名称或地址 zabbix kylin 大数据 v10 镜像源 软件 armbian u-boot Agent jenkins 云原生 ci/cd 开源 Cline ecmascript nextjs react reactjs 网络工程师 华为认证 RustDesk自建服务器 rustdesk服务器 docker rustdesk https 流式接口 URL ftp 小程序 微信小程序域名配置 微信小程序服务器域名 微信小程序合法域名 小程序配置业务域名 微信小程序需要域名吗 微信小程序添加域名 ssl stm32 单片机 消息队列 EasyConnect SSE LLM Web APP Streamlit hadoop opensearch helm fpga开发 web安全 ssrf 失效的访问控制 HTML audio 控件组件 vue3 audio音乐播放器 Audio标签自定义样式默认 vue3播放音频文件音效音乐 自定义audio播放器样式 播放暂停调整声音大小下载文件 MI300x DeepSeek AIGC openwrt maven ux 多线程 Python 网络编程 聊天服务器 套接字 TCP 客户端 Socket svn Linux xrdp 远程桌面 远程连接 mysql string模拟实现 深拷贝 浅拷贝 经典的string类问题 三个swap 游戏服务器 TrinityCore 魔兽世界 开发环境 SSL证书 sysctl.conf vm.nr_hugepages Dify 群晖 文件分享 负载均衡 odoo 服务器动作 Server action JAVA Java spring cloud 1024程序员节 springsecurity6 oauth2 授权服务器 token sas 能力提升 面试宝典 技术 IT信息化 源码剖析 rtsp实现步骤 流媒体开发 rsyslog 高效日志打印 串口通信日志 服务器日志 系统状态监控日志 异常记录日志 毕设 银河麒麟操作系统 国产化 rpc 远程过程调用 Windows环境 ffmpeg 直播推流 C语言 ipython 物联网 AI编程 IDEA FTP服务器 k8s 媒体 微信公众平台 中间件 bootstrap redis microsoft elasticsearch eureka 腾讯云 服务器繁忙 idm 联想开天P90Z装win10 DigitalOcean GPU服务器购买 GPU服务器哪里有 GPU服务器 编辑器 权限 gitee 统信UOS bonding 链路聚合 压力测试 tailscale derp derper 中转 C++软件实战问题排查经验分享 0xfeeefeee 0xcdcdcdcd 动态库加载失败 程序启动失败 程序运行权限 标准用户权限与管理员权限 excel 远程工作 mongodb 课程设计 cursor MCP server C/S LLM windows日志 数据挖掘 机器人 H3C iDRAC R720xd 命名管道 客户端与服务端通信 HarmonyOS Next ios 监控k8s集群 集群内prometheus agi git gpu算力 unix 报错 express 磁盘监控 华为云 前后端分离 av1 电视盒子 机顶盒ROM 魔百盒刷机 智能路由器 dell服务器 go 硬件架构 系统架构 3d 数学建模 网络结构图 服务器无法访问 ip地址无法访问 无法访问宝塔面板 宝塔面板打不开 XFS xfs文件系统损坏 I_O error FunASR ASR 佛山戴尔服务器维修 佛山三水服务器维修 file server http server web server 集成学习 集成测试 Docker Hub docker pull daemon.json openEuler 远程 命令 执行 sshpass 操作 jar arm minio Spring Security Minecraft ollama下载加速 rdp 实验 transformer Wi-Fi 系统安全 微信 交换机 硬件 设备 GPU PCI-Express 其他 音视频 Cursor UOS 统信操作系统 yum ISO镜像作为本地源 GaN HEMT 氮化镓 单粒子烧毁 辐射损伤 辐照效应 MNN Qwen 备份SQL Server数据库 数据库备份 傲梅企业备份网络版 音乐服务器 Navidrome 音流 温湿度数据上传到服务器 Arduino HTTP DeepSeek行业应用 Heroku 网站部署 xss 宝塔面板访问不了 宝塔面板网站访问不了 宝塔面板怎么配置网站能访问 宝塔面板配置ip访问 宝塔面板配置域名访问教程 宝塔面板配置教程 jupyter pip pppoe radius hugo arm开发 pygame 小游戏 五子棋 gaussdb virtualenv WSL2 博客 java-ee kind next.js 部署 部署next.js ocr AI agent 思科模拟器 思科 Cisco 云服务 远程登录 telnet googlecloud muduo X11 Xming mysql离线安装 ubuntu22.04 mysql8.0 僵尸进程 EMQX MQTT 通信协议 运维开发 hive Hive环境搭建 hive3环境 Hive远程模式 弹性计算 虚拟化 KVM 计算虚拟化 弹性裸金属 游戏程序 vim Samba SWAT 配置文件 服务管理 网络共享 重启 排查 系统重启 日志 原因 安全威胁分析 flash-attention vscode 1.86 laravel 缓存 junit 安装教程 GPU环境配置 Ubuntu22 CUDA PyTorch Anaconda安装 漏洞 unity3d SSH Xterminal 内存 AD域 .netcore postman mock mock server 模拟服务器 mock服务器 Postman内置变量 Postman随机数据 aws ruoyi 备选 网站 api 调用 示例 银河麒麟桌面操作系统 Kylin OS 边缘计算 智能硬件 AutoDL IIS服务器 IIS性能 日志监控 clickhouse HCIE 数通 intellij idea Linux PID Reactor 设计模式 C++ 华为od sqlite W5500 OLED u8g2 TCP服务器 dubbo chfs ubuntu 16.04 qt项目 qt项目实战 qt教程 openssl 密码学 模拟退火算法 国标28181 视频监控 监控接入 语音广播 流程 SIP SDP mosquitto r语言 数据可视化 数据分析 word图片自动上传 word一键转存 复制word图片 复制word图文 复制word公式 粘贴word图文 粘贴word公式 hibernate kamailio sip VoIP 根服务器 宝塔面板 同步 备份 建站 AI大模型 大模型入门 大模型教程 webrtc remote-ssh sqlserver ukui 麒麟kylinos openeuler 微服务 微信小程序 springboot Nuxt.js jmeter 软件测试 需求分析 规格说明书 豆瓣 追剧助手 迅雷 nas RTMP 应用层 MacOS录屏软件 big data okhttp CORS 跨域 XCC Lenovo 雨云 NPS 孤岛惊魂4 gateway Clion Nova ResharperC++引擎 Centos7 远程开发 恒源云 tcp 单一职责原则 oneapi 大模型微调 open webui 向日葵 安全架构 TRAE pdf asp.net大文件上传 asp.net大文件上传下载 asp.net大文件上传源码 ASP.NET断点续传 asp.net上传文件夹 asp.net上传大文件 .net core断点续传 医疗APP开发 app开发 外网访问 内网穿透 端口映射 Headless Linux 多进程 uniapp LORA 大语言模型 NLP SSL 域名 safari Mac 系统 web linux安装配置 无人机 历史版本 下载 安装 rnn mariadb 自定义客户端 SAS 僵尸世界大战 游戏服务器搭建 金仓数据库 2025 征文 数据库平替用金仓 nfs wireshark 测试工具 嵌入式 linux驱动开发 大大通 第三代半导体 碳化硅 wsl 回显服务器 UDP的API使用 nvidia 智能手机 EMUI 回退 降级 升级 devops seatunnel ceph ldap GCC Linux环境 webstorm Trae IDE AI 原生集成开发环境 Trae AI Google pay Apple pay npm 服务器主板 AI芯片 信息与通信 ArkUI 多端开发 智慧分发 应用生态 鸿蒙OS Kali Linux 黑客 渗透测试 信息收集 开机自启动 h.264 rag ragflow ragflow 源码启动 黑客技术 ESXi dify 深度求索 私域 知识库 安卓 ip 项目部署到linux服务器 项目部署过程 apt 本地部署 前端框架 ue4 着色器 ue5 虚幻 pyqt 中兴光猫 换光猫 网络桥接 自己换光猫 asm 职场和发展 WebUI DeepSeek V3 vscode1.86 1.86版本 ssh远程连接 open Euler dde cuda cudnn anaconda db mamba Vmamba 迁移指南 VMware创建虚拟机 腾讯云大模型知识引擎 网卡的名称修改 eth0 ens33 list 模拟实现 log4j tidb GLIBC cpp-httplib 单元测试 功能测试 selenium 网工 DevEco Studio springcloud 鸿蒙 鸿蒙系统 postgresql Python基础 Python教程 Python技巧 fd 文件描述符 win服务器架设 windows server 视觉检测 frp grafana adobe 图形化界面 Xinference RAGFlow elk 换源 国内源 Debian Qwen2.5-coder 离线部署 mac bug 环境配置 计算机外设 软件需求 sqlite3 cocoapods xcode Anolis nginx安装 环境安装 linux插件下载 Claude threejs 3D eNSP 网络规划 VLAN 企业网络 rabbitmq ruby AnythingLLM AnythingLLM安装 SenseVoice glibc 元服务 应用上架 dash 正则表达式 k8s资源监控 annotations自动化 自动化监控 监控service 监控jvm 软件工程 iis yolov8 wsl2 雨云服务器 tensorflow 鲲鹏 昇腾 npu trae 游戏引擎 环境迁移 服务器管理 配置教程 服务器安装 网站管理 崖山数据库 YashanDB crosstool-ng 视频编解码 HiCar CarLife+ CarPlay QT RK3588 Ubuntu 24.04.1 轻量级服务器 NFS redhat python3.11 cpu 实时 使用 firewalld deekseek can 线程池 相差8小时 UTC 时间 远程控制 远程看看 远程协助 selete 高级IO bat 多层架构 解耦 visual studio code 知识图谱 YOLOv12 CPU 架构与原理 mcu trea idea ssh远程登录 camera Arduino 电子信息 linux上传下载 健康医疗 互联网医院 三级等保 服务器审计日志备份 图像处理 linux 命令 sed 命令 分析解读 KylinV10 麒麟操作系统 虚拟机 Vmware USB网络共享 risc-v 微信分享 Image wxopensdk 自动化任务管理 信号 软考 aarch64 编译安装 HPC 数据库架构 数据管理 数据治理 数据编织 数据虚拟化 浏览器开发 AI浏览器 ui css 多个客户端访问 IO多路复用 TCP相关API vmware 卡死 yum源切换 更换国内yum源 树莓派 VNC AI代码编辑器 主板 电源 网卡 Linux find grep 矩阵 线性代数 电商平台 大文件分片上传断点续传及进度条 如何批量上传超大文件并显示进度 axios大文件切片上传详细教 node服务器合并切片 vue3大文件上传报错提示错误 大文件秒传跨域报错cors etl 宠物 毕业设计 免费学习 宠物领养 宠物平台 rime 压测 ECS 域名服务 DHCP 符号链接 配置 代理 小艺 Pura X 自动化测试 性能测试 yaml Ultralytics 可视化 流水线 脚本式流水线 双系统 计算机 网络攻击模型 sentinel IMX317 MIPI H265 VCU rocketmq DOIT 四博智联 防火墙 NAT转发 NAT Server Unity Dedicated Server Host Client 无头主机 stm32项目 数据结构 netty Linux awk awk函数 awk结构 awk内置变量 awk参数 awk脚本 awk详解 端口测试 gpt jina 常用命令 文本命令 目录命令 Docker引擎已经停止 Docker无法使用 WSL进度一直是0 镜像加速地址 VR手套 数据手套 动捕手套 动捕数据手套 thingsboard 状态管理的 UDP 服务器 Arduino RTOS 7z 加解密 Yakit yaklang iot composer 输入法 产测工具框架 IMX6ULL 管理框架 Unity插件 技术共享 iventoy VmWare OpenEuler css3 Linux的基础指令 proxy模式 Jellyfin 自动驾驶 策略模式 单例模式 eclipse Typore milvus keepalived 服务器配置 生物信息学 sonoma 自动更新 执法记录仪 智能安全帽 smarteye 具身智能 强化学习 gitea SysBench 基准测试 流量运营 Logstash 日志采集 文件系统 路径解析 超融合 chrome devtools chromedriver 我的世界 我的世界联机 数码 软链接 硬链接 ArcTS 登录 ArcUI GridItem Invalid Host allowedHosts vue 我的世界服务器搭建 王者荣耀 prompt BMC IPMI 带外管理 llama.cpp 实战案例 Windows jetty undertow 实时互动 efficientVIT YOLOv8替换主干网络 TOLOv8 Dell HPE 联想 浪潮 minicom 串口调试工具 合成模型 扩散模型 图像生成 cnn DenseNet 云电竞 云电脑 todesk 序列化反序列化 CrewAI 交叉编译 可信计算技术 Erlang OTP gen_server 热代码交换 事务语义 n8n 工作流 workflow SSH 服务 SSH Server OpenSSH Server HarmonyOS OpenHarmony 真机调试 .net mvc断点续传 捆绑 链接 谷歌浏览器 youtube google gmail VMware安装Ubuntu Ubuntu安装k8s 状态模式 图形渲染 freebsd GRUB引导 Linux技巧 rustdesk 黑苹果 VMware IPv4 子网掩码 公网IP 私有IP SSH 密钥生成 SSH 公钥 私钥 生成 信号处理 ubuntu24 vivado24 sdkman sequoiaDB dns是什么 如何设置电脑dns dns应该如何设置 k8s集群资源管理 云原生开发 测试用例 RAGFLOW ShenTong AI写作 AI作画 QQ 聊天室 alias unalias 别名 工业4.0 技能大赛 怎么卸载MySQL MySQL怎么卸载干净 MySQL卸载重新安装教程 MySQL5.7卸载 Linux卸载MySQL8.0 如何卸载MySQL教程 MySQL卸载与安装 prometheus数据采集 prometheus数据模型 prometheus特点 IM即时通讯 剪切板对通 HTML FORMAT iperf3 带宽测试 相机 rtsp服务器 rtsp server android rtsp服务 安卓rtsp服务器 移动端rtsp服务 大牛直播SDK lsb_release /etc/issue /proc/version uname -r 查看ubuntu版本 微信开放平台 微信公众号配置 阿里云ECS 游戏开发 Ark-TS语言 hexo 个人博客 ros2 moveit 机器人运动 源码 小智AI服务端 xiaozhi TTS Ubuntu 24 常用命令 Ubuntu 24 Ubuntu vi 异常处理 银河麒麟服务器操作系统 系统激活 烟花代码 烟花 元旦 混合开发 JDK 线程 算力 onlyoffice 在线office 京东云 dity make 高效远程协作 TrustViewer体验 跨设备操作便利 智能远程控制 基础入门 编程 webgl centos-root /dev/mapper yum clean all df -h / du -sh windwos防火墙 defender防火墙 win防火墙白名单 防火墙白名单效果 防火墙只允许指定应用上网 防火墙允许指定上网其它禁止 考研 显示管理器 lightdm gdm 阻塞队列 生产者消费者模型 服务器崩坏原因 VMware安装mocOS macOS系统安装 AI-native Docker Desktop Linux无人智慧超市 LInux多线程服务器 QT项目 LInux项目 单片机项目 less 毕昇JDK etcd 数据安全 RBAC chrome 浏览器下载 chrome 下载安装 谷歌浏览器下载 直流充电桩 充电桩 SEO ros 云服务器 裸金属服务器 弹性裸金属服务器 p2p micropython esp32 mqtt firewall MySql 抗锯齿 NAS Termux 半虚拟化 硬件虚拟化 Hypervisor gcc 办公自动化 自动化生成 pdf教程 epoll 田俊楠 g++ g++13 Ubuntu Server Ubuntu 22.04.5 程序员 游戏机 Netty 即时通信 NIO 移动魔百盒 USB转串口 CH340 pgpool Ubuntu DeepSeek DeepSeek Ubuntu DeepSeek 本地部署 DeepSeek 知识库 DeepSeek 私有化知识库 本地部署 DeepSeek DeepSeek 私有化部署 飞牛NAS 飞牛OS MacBook Pro HTTP 服务器控制 ESP32 DeepSeek harmonyOS面试题 邮件APP 免费软件 vasp安装 查询数据库服务IP地址 SQL Server lio-sam SLAM 语音识别 pyautogui outlook GoogLeNet wordpress 无法访问wordpess后台 打开网站页面错乱 linux宝塔面板 wordpress更换服务器 链表 Radius deepseek r1 MS Materials 政务 分布式系统 监控运维 Prometheus Grafana Node-Red 编程工具 流编程 业界资讯 code-server SVN Server tortoise svn 虚拟局域网 华为机试 数据库系统 端口 查看 ss iphone 显卡驱动 AISphereButler iftop 网络流量监控 HAProxy cd 目录切换 大数据平台 make命令 makefile文件 银河麒麟高级服务器 外接硬盘 Kylin 网络穿透 tcpdump echarts 信息可视化 网页设计 gpt-3 文心一言 gradle 框架搭建 dns 程序 vSphere vCenter 金融 Java Applet URL操作 服务器建立 Socket编程 网络文件读取 网络用户购物行为分析可视化平台 大数据毕业设计 uv 致远OA OA服务器 服务器磁盘扩容 蓝桥杯 OD机试真题 华为OD机试真题 服务器能耗统计 rust腐蚀 镜像 navicat Kali linux环境变量 ROS xpath定位元素 CVE-2024-7347 VPS easyui langchain 智能音箱 智能家居 EtherCAT转Modbus ECT转Modbus协议 EtherCAT转485网关 ECT转Modbus串口网关 EtherCAT转485协议 ECT转Modbus网关 服务器数据恢复 数据恢复 存储数据恢复 北亚数据恢复 oracle数据恢复 Open WebUI iBMC UltraISO autodl 软件定义数据中心 sddc docker搭建nacos详解 docker部署nacos docker安装nacos 腾讯云搭建nacos centos7搭建nacos 反向代理 springboot远程调试 java项目远程debug docker远程debug java项目远程调试 springboot远程 RoboVLM 通用机器人策略 VLA设计哲学 vlm fot robot 视觉语言动作模型 飞书 繁忙 解决办法 替代网站 汇总推荐 AI推理 P2P HDLC CDN web3 dba QT 5.12.12 QT开发环境 Ubuntu18.04 串口驱动 CH341 uart 485 rclone AList webdav fnOS 传统数据库升级 银行 LLMs 实习 wsgiref Web 服务器网关接口 flink IPMITOOL 硬件管理 opcua opcda KEPServer安装 c skynet 性能分析 IMM RAID RAID技术 磁盘 存储 embedding ardunio BLE matplotlib wps bcompare Beyond Compare 模拟器 教程 移动云 nac 802.1 portal FTP 服务器 raid5数据恢复 磁盘阵列数据恢复 OpenSSH AP配网 AK配网 小程序AP配网和AK配网教程 WIFI设备配网小程序UDP开 docker命令大全 嵌入式Linux IPC ai工具 gnu java-rocketmq Cookie GIS 遥感 WebGIS kali 共享文件夹 ip命令 新增网卡 新增IP 启动网卡 Kylin-Server 内网环境 本地知识库部署 DeepSeek R1 模型 用户缓冲区 PX4 qemu libvirt 匿名管道 WebRTC 网络爬虫 灵办AI 系统开发 binder 车载系统 framework 源码环境 搭建个人相关服务器 edge浏览器 大模型面经 大模型学习 SRS 流媒体 直播 基础环境 ubuntu20.04 开机黑屏 沙盒 word 多路转接 论文阅读 服务器部署ai模型 docker部署翻译组件 docker部署deepl docker搭建deepl java对接deepl 翻译组件使用 swoole IO模型 Playwright rpa Deepseek-R1 私有化部署 推理模型 ssh漏洞 ssh9.9p2 CVE-2025-23419 欧标 OCPP visual studio 风扇控制软件 lua vue-i18n 国际化多语言 vue2中英文切换详细教程 如何动态加载i18n语言包 把语言json放到服务器调用 前端调用api获取语言配置文件 MacMini 迷你主机 mini Apple triton 模型分析 键盘 音乐库 飞牛 实用教程 上传视频至服务器代码 vue3批量上传多个视频并预览 如何实现将本地视频上传到网页 element plu视频上传 ant design vue vue3本地上传视频及预览移除 宕机切换 服务器宕机 代理服务器 midjourney vr 嵌入式系统开发 DBeaver 数据仓库 kerberos 程序员创富 nlp PVE perf conda配置 conda镜像源 李心怡 TCP协议 干货分享 黑客工具 密码爆破 Linux的权限 聚类 远程服务 openstack Xen 热榜 mybatis TrueLicense 开发 ai小智 语音助手 ai小智配网 ai小智教程 esp32语音助手 diy语音助手 大模型部署 xshell termius iterm2 docker部署Python neo4j 数据库开发 database DNS UDP arkUI 服务网格 istio js 离线部署dify 主从复制 服务器时间 ubuntu24.04.1 fast 大模型应用 语法 大模型推理 西门子PLC 通讯 docker搭建pg docker搭建pgsql pg授权 postgresql使用 postgresql搭建 企业网络规划 华为eNSP ping++ 增强现实 沉浸式体验 应用场景 技术实现 案例分析 AR 鸿蒙开发 移动开发 在线预览 xlsx xls文件 在浏览器直接打开解析xls表格 前端实现vue3打开excel 文件地址url或接口文档流二进 uni-file-picker 拍摄从相册选择 uni.uploadFile H5上传图片 微信小程序上传图片 虚幻引擎 DocFlow 剧本 VS Code 自动化编程 mm-wiki搭建 linux搭建mm-wiki mm-wiki搭建与使用 mm-wiki使用 mm-wiki详解 项目部署 hosts AD 域管理 regedit 开机启动 网站搭建 serv00 xml grub 版本升级 扩容 社交电子 磁盘镜像 服务器镜像 服务器实时复制 实时文件备份 cmos 本地化部署 玩机技巧 软件分享 软件图标 影刀 #影刀RPA# 私有化 minecraft searxng 网络药理学 生信 PPI String Cytoscape CytoHubba CentOS seleium Ubuntu共享文件夹 共享目录 Linux共享文件夹 目标跟踪 OpenVINO 推理应用 分布式训练 产品经理 MDK 嵌入式开发工具 论文笔记 sublime text arcgis figma ABAP 信创 信创终端 中科方德 Windsurf 运维监控 LInux 软负载 dock 加速 CLion EtherNet/IP串口网关 EIP转RS485 EIP转Modbus EtherNet/IP网关协议 EIP转RS485网关 EIP串口服务器 bot Docker 存储维护 NetApp存储 EMC存储 leetcode 推荐算法 docker run 数据卷挂载 交互模式 CentOS Stream curl wget C# MQTTS 双向认证 emqx AI Agent 字节智能运维 粘包问题 物联网开发 人工智能生成内容 做raid 装系统 火绒安全 内网服务器 内网代理 内网通信 VM搭建win2012 win2012应急响应靶机搭建 攻击者获取服务器权限 上传wakaung病毒 应急响应并溯源 挖矿病毒处置 应急响应综合性靶场 拓扑图 飞牛nas fnos Attention Redis Desktop deep learning IO RAG 检索增强生成 文档解析 大模型垂直应用 mq wpf x64 SIGSEGV xmm0 VSCode spark HistoryServer Spark YARN jobhistory