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

简介: 【Linux取经路】解析环境变量,提升系统控制力(一)

d17ffbf5d7974d90b5b290a402d827b4.gif

一、进程优先级

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

ba1c7cadcdb841b889c4982592c04197.png

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值

24b860a0a182427a9affe112bfe680eb.gif

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

2.4 进程优先级的实现原理

e0dd18392187411cb13183d2ba342168.png

修改进程的优先级,本质上就是修改进程 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++ 代码的时候,在链接的时候,从来不知道我们所链接的动静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。

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

63b3f693632e4ac091f5752084fd8414.png

上图是 Windows 系统下的环境变量,本质上就是一组 key-value ,接下来将以Linux中的一些现象来演示常见的环境变量。

3.2 PATH:Linux系统中的指令搜索路径

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

echo $PATH

78f9c9fd0e1945d9baa2b7b249ff923d.png

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

PATH=$PATH:/home/wcy/linux-s/lesson13
///home/wcy/linux-s/lesson13是当前工作目录
//只用=是覆盖写的意思,会把原本的PATH 覆盖掉

45c9c4d91cbe4f44896b439e44b61843.png

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

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


目录
相关文章
|
3月前
|
Ubuntu Linux Anolis
Linux系统禁用swap
本文介绍了在新版本Linux系统(如Ubuntu 20.04+、CentOS Stream、openEuler等)中禁用swap的两种方法。传统通过注释/etc/fstab中swap行的方式已失效,现需使用systemd管理swap.target服务或在/etc/fstab中添加noauto参数实现禁用。方法1通过屏蔽swap.target适用于新版系统,方法2通过修改fstab挂载选项更通用,兼容所有系统。
228 3
Linux系统禁用swap
|
3月前
|
Linux
Linux系统修改网卡名为eth0、eth1
在Linux系统中,可通过修改GRUB配置和创建Udev规则或使用systemd链接文件,将网卡名改为`eth0`、`eth1`等传统命名方式,适用于多种发行版并支持多网卡配置。
342 3
|
Ubuntu Linux 网络安全
Linux系统初始化脚本
一款支持Rocky、CentOS、Ubuntu、Debian、openEuler等主流Linux发行版的系统初始化Shell脚本,涵盖网络配置、主机名设置、镜像源更换、安全加固等多项功能,适配单/双网卡环境,支持UEFI引导,提供多版本下载与持续更新。
305 0
Linux系统初始化脚本
|
4月前
|
运维 Linux 开发者
Linux系统中使用Python的ping3库进行网络连通性测试
以上步骤展示了如何利用 Python 的 `ping3` 库来检测网络连通性,并且提供了基本错误处理方法以确保程序能够优雅地处理各种意外情形。通过简洁明快、易读易懂、实操性强等特点使得该方法非常适合开发者或系统管理员快速集成至自动化工具链之内进行日常运维任务之需求满足。
239 18
|
3月前
|
安全 Linux Shell
Linux系统提权方式全面总结:从基础到高级攻防技术
本文全面总结Linux系统提权技术,涵盖权限体系、配置错误、漏洞利用、密码攻击等方法,帮助安全研究人员掌握攻防技术,提升系统防护能力。
286 1
|
3月前
|
监控 安全 Linux
Linux系统提权之计划任务(Cron Jobs)提权
在Linux系统中,计划任务(Cron Jobs)常用于定时执行脚本或命令。若配置不当,攻击者可利用其提权至root权限。常见漏洞包括可写的Cron脚本、目录、通配符注入及PATH变量劫持。攻击者通过修改脚本、创建恶意任务或注入命令实现提权。系统管理员应遵循最小权限原则、使用绝对路径、避免通配符、设置安全PATH并定期审计,以防范此类攻击。
1012 1
|
4月前
|
缓存 监控 Linux
Linux系统清理缓存(buff/cache)的有效方法。
总结而言,在大多数情形下你不必担心Linux中buffer与cache占用过多内存在影响到其他程序运行;因为当程序请求更多内存在没有足够可用资源时,Linux会自行调整其占有量。只有当你明确知道当前环境与需求并希望立即回收这部分资源给即将运行重负载任务之前才考虑上述方法去主动干预。
1585 10
|
3月前
|
Linux 应用服务中间件 Shell
二、Linux文本处理与文件操作核心命令
熟悉了Linux的基本“行走”后,就该拿起真正的“工具”干活了。用grep这个“放大镜”在文件里搜索内容,用find这个“探测器”在系统中寻找文件,再用tar把东西打包带走。最关键的是要学会使用管道符|,它像一条流水线,能把这些命令串联起来,让简单工具组合出强大的功能,比如 ps -ef | grep 'nginx' 就能快速找出nginx进程。
二、Linux文本处理与文件操作核心命令
|
3月前
|
Linux
linux命令—stat
`stat` 是 Linux 系统中用于查看文件或文件系统详细状态信息的命令。相比 `ls -l`,它提供更全面的信息,包括文件大小、权限、所有者、时间戳(最后访问、修改、状态变更时间)、inode 号、设备信息等。其常用选项包括 `-f` 查看文件系统状态、`-t` 以简洁格式输出、`-L` 跟踪符号链接,以及 `-c` 或 `--format` 自定义输出格式。通过这些选项,用户可以灵活获取所需信息,适用于系统调试、权限检查、磁盘管理等场景。
297 137
|
3月前
|
安全 Ubuntu Unix
一、初识 Linux 与基本命令
玩转Linux命令行,就像探索一座新城市。首先要熟悉它的“地图”,也就是/根目录下/etc(放配置)、/home(住家)这些核心区域。然后掌握几个“生存口令”:用ls看周围,cd去别处,mkdir建新房,cp/mv搬东西,再用cat或tail看文件内容。最后,别忘了随时按Tab键,它能帮你自动补全命令和路径,是提高效率的第一神器。
688 57