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

『Linux升级路』解析环境变量

🔥博客主页:小王又困了

📚系列专栏:Linux

🌟人之为学,不日近则日退

❤️感谢大家点赞👍收藏⭐评论✍️

目录

一、进程优先级

📒1.1基本概念

📒1.2为什么要有优先级

二、Linux系统中的优先级

📒2.1查看系统进程优先级

📒2.2PRI and NI

📒2.3 修改进程优先级

📒2.4概念补充

三、进程切换

📒3.1进程切换的过程

四、命令行参数

📒4.1命令行参数的作用

📒4.2 命令行第三个参数

五、环境变量

📒5.1基本概念

📒5.2常见环境变量

📖5.2.1PATH

📖5.2.2HOME

📒5.3和环境变量相关的命令

📒5.4获取环境变量


一、进程优先级

📒1.1基本概念

  1. cpu资源分配的先后顺序,就是指进程的优先级。
  2. 优先级⾼的进程有优先执⾏权利。配置进程优先权对多任务环境的linux很有⽤,可以改善系统性能。
  3. 可以把进程运⾏到指定的CPU上,把不重要的进程安排到某个CPU,可以⼤⼤改善系统整体性能。

小Tips:优先级决定资源分配的先后顺序。要区分优先级和权限的概念,权限决定能不能做,优先级是在可以做的基础上,决定先后顺序。

📒1.2为什么要有优先级

        在系统中可能存在多个进程,但是只有一个CPU,就注定了所有进程都要去竞争资源,如:CPU、设备(键盘、磁盘……)。所以优先级的本质就是目标资源较少,规定某种资源的先后顺序。

二、Linux系统中的优先级

📒2.1查看系统进程优先级

        在Linux系统中,⽤ps‒l命令会输出以下⼏个内容:

//通过ps -al 指令可以查看进程的优先级ps -al | head -1 ; ps -al | grep process

我们可以看到到其中的几个重要信息,如下:

  • UID:代表执⾏者的⾝份
  • PID:代表这个进程的代号
  • PPID:代表这个进程是由哪个进程发展衍⽣⽽来的,即⽗进程的代号
  • PRI:代表这个进程可被执⾏的优先级,其值越⼩越早被执⾏
  • NI:代表这个进程的nice值,是进程优先级的修正数据

📒2.2PRI and NI

  • PRI,即进程的优先级,或者通俗点说就是程序被CPU执⾏的先后顺序, 值越⼩进程的优先级别越⾼
  • NI就是我们所要说的nice值了,其表⽰进程可被执⾏的优先级的修正数值
  • PRI值越⼩越快被执⾏,那么加⼊nice值后,将会使得PRI变为:PRI(new)=PRI(old)+nice
  • nice值为负值的时候,那么该程序将会优先级值将变⼩,即其优先级会变⾼,则其越快被执⾏,所以,调整进程优先级,在Linux下,就是调整进程nice值
  • nice其取值范围是-20⾄19,⼀共40个级别

小Tips:需要强调⼀点的是,进程的nice值不是进程的优先级,他们不是⼀个概念,但是进程nice值会影响到进程的优先级变化。nice值设置在可控范围的目的是操作系统进行进程调度尽量公平。

📒2.3 修改进程优先级

top
//进入top后按“r”->输入进程PID->输入nice值

小Tips:PRI(new) = PRI(default) + nice中的 (default)永远都是从80开始。

📒2.4概念补充

  • 竞争性:系统进程数目众多,而 CPU 资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级。
  • 独立性:多进程运行,需要独享各种资源,多进程运行期间互不干扰。
  • 并行:多个进程在多个 CPU 下分别同时运行,这称之为并行。
  • 并发:多个进程在一个 CPU 下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发。

三、进程切换

        CPU上下文切换:其实际含义是任务切换,或者 CPU 寄存器切换。当多任务内核决定运⾏另外的任务 时,它保存正在运行任务的当前状态,也就是 CPU寄存器中的全部内容。这些内容被保存在任务⾃⼰的堆栈中,⼊栈⼯作完成后就把下⼀个将要运⾏的任务的当前状况从该任务的栈中重新装⼊CPU寄存器, 并开始下⼀个任务的运⾏。

📒3.1进程切换的过程

        Linux 是基于时间片,进行调度轮转的,当一个进程的时间片结束,那么进程就需要切换。当前正在被 CPU 调度的进程在它的时间片结束还没有执行结束,那么就要保留它的上下文数据,当它被重新调度切换,恢复它的上下文数据,继续执行。

首先 pc 指针读取到进程A main函数的地址, ir 读取 pc 指针指向的指令,然后更新 pc 指针,是它指向下一条指令的地址, ir 分析执行指令,进程A的时间片结束,寄存器中存储的上下文数据会被存储到当前进程的 PCB 中,切换进程B执行。等进程A切换回来,将 PCB 中的上下文数据读回寄存器就可以继续执行。

小Tips:当代计算机都是分时操作系统,每个进程都有它合适的时间片(其实就是⼀个计数器)。时间片到达,进程就被操作系统从CPU中剥离下来。

四、命令行参数

        C/C++ 的 main 函数是可以传参的,这两个参数就叫做命令行参数,如下所示:

int main(int argc, char* argv[])    
{       for(int i=0; i < argc; i++)    {    printf("argv[%d]:%s\n",i, argv[i]);    }      return 0;                                                                                                                                          
} 

命令行参数:argc 表示参数的个数,argv[] 是一个指针数组,里面保存的是字符串地址。

📒4.1命令行参数的作用

int main(int argc, char* argv[])    
{    if(argc != 2)    {    printf("./mycode -opt\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 命令行第三个参数

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

int main(int argc, char* argv[], char* env[])    {      for(int i=0;env[i]; i++)    {    printf("env[%d]:%s\n", i, env[i]);    }    return 0;                                                                                                                                        } 

我们平时写的 C/C++ 代码都会有两表,一张叫命令行参数表,另一张叫环境变量表。我们平时执行的指令,自己写的可执行程序都是 bash 的子进程,bash 本身在启动的时候,会从操作系统的配置文件中读取环境变量信息,子进程会继承父进程交给我的环境变量。这就是环境变量具有全局特性的本质。

五、环境变量

📒5.1基本概念

  • 环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数。
  • 如:我们在编写 C/C++ 代码的时候,在链接的时候,从来不知道我们所链接的动静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。
  • 环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性。
     

📒5.2常见环境变量

  • PATH:指定命令的搜索路径
  • HOME:指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)
  • SHELL:当前Shell,它的值通常是/bin/bash

📖5.2.1PATH

        我们在命令行中执行自己写的可执行程序时需要加 ./,表示当前目录下的可执行程序,告诉操作系统执行的时候在当前目录下查找,指令本质上也是可执行程序,但是我们在执行指令的时候却不用加任何路径,那操作系统是如何直到指令在哪个目录呢?之前我们提到过,所有的指令都在 /usr/bin/ 目录下,而我们自己写的可执行程序是在我们自己当前的工作目录下。我们可以看到 Linux 操作系统会为我们提供的环境变量 PATH 中有 /usr/bin/ 路径,它是 Linux 操作系统给我们提供的指令搜索路径,我们执行指令时,会到下面的路径中查找,而我们自己写的可执行程序的路径并不在 PATH 中,所以要指定路径。可以通过下面这条指令来查看 PATH 变量的值。

echo $PATH

执行指令的时候,因为系统会自动到 PATH 对应的路径下去搜索,我们自己写的可执行程序都是在当前的工作目录下,这个目录并不是 PATH 变量的值,如果不加 ./ 操作系统会自动到 PATH 对应的所有路径下挨个去搜索,最终都没有找到该可执行程序,也就无法执行。可以通过下面这条指令将当前的工作目录添加到环境变量里。

PATH=$PATH:/home/wtl/112/lesson9

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

小Tips:我们上面修改的环境变量是一种内存级的环境变量,保存在 shell 中,每次登陆 shell 会从系统的一些配置文件中将环境变量加载到 shell ,所以我们上面这种修改并不会影响到系统的配置文件,因此每次重启登陆环境变量就可以恢复如初。

📖5.2.2HOME

        我们每次登陆 shell 都默认处在家目录下,这是因为我们每次登陆的时候,shell 会识别到当前登陆的用户,自动帮我们填充 $HOME 环境变量,登陆的时候 shell 会为我们分配命令行解释器 bash,bash 本质上也是一个可执行程序,它会帮我们执行 cd $HOME 指令,这就是为什么我们每次登陆,都默认在家目录下。

📒5.3和环境变量相关的命令

  • echo:显示某个环境变量值
  • export:设置⼀个新的环境变量
  • env:显⽰所有环境变量
  • unset:清除环境变量
  • set:显⽰本地定义的shell变量和环境变量

📒5.4获取环境变量

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

 int main(int argc, char *argv[]){extern char **environ;for(int i=0; environ[i]; i++){printf("%s\n", environ[i]);}return 0;}

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


🎁结语: 

     本次的内容到这里就结束啦。希望大家阅读完可以有所收获,同时也感谢各位读者三连支持。文章有问题可以在评论区留言,博主一定认真认真修改,以后写出更好的文章。你们的支持就是博主最大的动力。

http://www.dtcms.com/a/576825.html

相关文章:

  • 浏览器能正常访问URL获取JSON,但是pycharm里调不通
  • AI代码开发宝库系列:PDF文档解析MinerU
  • 校园招聘seo行业网
  • 开发网站的技术路线博达高校网站群建设教程
  • 物联网运维中基于联邦学习的跨设备隐私保护与协同优化技术
  • 物联网AI模组:连接与智能的融合
  • 【底层机制】ART虚拟机深度解析:Android运行时的架构革命
  • 嵌入式硬件:如何理解高频电子线路,从入门开始
  • 物联网赋能校园共享站:打造24小时一站式服务新体验!
  • 萤石开放平台申请物联网卡指南
  • 矩阵在密码学的应用——希尔密码详解
  • 20251106给荣品RD-RK3588-MID开发板跑Rockchip的原厂Android13系统时适配AP6275P模块的WIFI【使用荣品的DTS】
  • 学校网站代码模板成都的网站建设开发公司哪家好
  • 怎么制作自己的小网站低代码前端开发平台
  • Elastic Stack 或 ELK —— 日志管理与数据分析方案
  • 手机、平板、电脑如何投屏画面到电视?ToDesk远程控制TV版教程分享
  • UEC++UNiagaraFunctionLibrary源代码
  • 小杰-大模型(twelve)——大模型部署与应用——gradipo-实现UI界面
  • Python基础入门
  • 【React Native】粘性布局StickyScrollView
  • 无人机RTMP推流平台EasyDSS:构建新一代智能交通视频监控系统
  • 从大数据角度看时序数据库选型:Apache IoTDB的实战经验分享
  • Apache Drill 连接 MySQL 或 PostgreSQL 数据库
  • React Native App 图表绘制完整实现指南
  • 做招商加盟网站怎么样济南网站优化的周期
  • 怡梦姗网站做么动漫与游戏制作专业就业方向
  • js原生、vue导出、react导出、axios ( post请求方式)跨平台导出下载四种方式的demo
  • Springboot + vue 宿舍管理系统
  • 【Python3教程】Python3高级篇之pip标准包管理工具
  • 段权限检查(Segement Privilege Check)