Linux进程优先级/进程环境变量
文章目录
进程优先级
优先级:实际上就是CPU分配资源的先后顺序,指的就是进程的优先权。
优先级存在的原因
原因是:资源是有限的,CPU资源同样是有限的。CPU一次只能跑一个进程,但进程确是不止一个的,所以需要用进程优先级区分,进程获取CPU资源的先后顺序。
查看优先级
我们可以使用以下命令查看进程优先级。
[---@VM-8-4-centos day01]$ ps -l
其中有几个重要的信息:
- UID:代表执行者的身份
- PID:代表进程的代号
- PPID:代表父进程的代号
- PRI:代表进程的优先级
- NI:代表进程的nice值,用来修正进程的优先级
PRI & NI
- PRI是进程的优先级 通俗点说就是程序被CPU执行的先后顺序 此值越小进程的优先级别越高
- NI值就是我们所要说的nice值了 其表示进程可被执行的优先级的修正数值
- PRI和NI值的关系符合下面的公式 PRI(new) = PRI (old)+ NI
- 当NI值为负值的时候 那么该程序将会优先级值将变小 优先级会变高
- 调整进程优先级 就是调整进程的nice值
- nice的取值范围是-20~19 一共四十个值
在Linux系统中,PRI值默认为80,所以优先级PRI = 80 + NI。
NI
NI值的范围是-20~19
,如果超出这个范围,就会设置一个最接近这个区间的值也就是如果小于-20,就设为-20。如果大于19,就设为19。
为什么会有这个范围的规矩呢?
这是因为操作系统为了各个进程的公平运行,如果优先级(PRI)设置的很低操作系统就会更倾向于执行这个进程从而导致其他进程不能很好的被CPU执行。
nice(NI)值的修改
- top命令修改
1.输入top
2.按r
键,输入需要被修改的PID。
3.输入修改后的NI值
4.按q
键退出
查看修改后的PRI值和NI值:(我不小心退出了,新的PID是25409)
我们本来设置的100,被改为了19。
如果我们想改为负值,则需要sudo提升权限。
- 使用命令renice
[---@VM-8-4-centos day01]$ renice 10 26249
//26249 (process ID) old priority 0, new priority 10
如果想修改为负值,同样需要sudo提升权限。
环境变量
环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数。
一般环境变量在系统中是具有全局性的。
常见环境变量
- PATH:指定命令的搜索路径
- HOME:指定用户的主工作目录(用户登录Linux后的默认路径)
- SHELL:当前的Shell,通常是
bin/bash
。
查看环境变量
我们通过以下指令进行查看环境变量:
[---@VM-8-4-centos ~]$ echo $(PATH/HOME/SHELL/...)
PATH
我们在执行可执行程序时,为什么要加./
呢?为什么一些我们输入的命令就不用加呢?
原因是:我们在输入ls
等命令时,系统可以识别出这些命令存在的默认路径,而我们生成的可执行文件,系统可不知道它的路径是什么。所以我们需要给系统指明路径加上./
指明该可执行程序是在当前路径下的。
为什么系统知道ls
等命令的路径呢?
因为PATH中存了这些命令的路径。
[---@VM-8-4-centos day01]$ echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/wsj/.local/bin:/home/wsj/bin
[---@VM-8-4-centos day01]$ which ls
alias ls='ls --color=auto'
/usr/bin/ls
如果我们也想我们的可执行程序不加路径就可以被执行呢?
方法1.把可执行程序拷贝到PATH环境变量下的某一路径
[---@VM-8-4-centos day01]$ sudo cp mycode /usr/bin
方法2.把可执行程序的当前路径拷贝到PATH环境变量中
路径输入pwd
后的路径,从==/home/…==替换。
[wsj@VM-8-4-centos day01]$ export PATH=$PATH:/home/...
HOME
每个用户都有自己的主目录(工作目录)。
下面一个是普通用户,另一个是超级用户:
SHELL
我们在Linux操作系统当中所敲的各种命令,实际上需要由命令行解释器进行解释,而在Linux当中有许多种命令行解释器(例如bash、sh),我们可以通过查看环境变量SHELL来知道自己当前所用的命令行解释器的种类。
相关命令
- echo 显示某个环境变量的值
- export 设置一个新的环境变量
- env 显示所有环境变量
- set 显示本地定义的SHELL变量和环境变量
因为太多了就显示前5行。
- unset 清除环境变量
环境变量的组织方式
其实就是一个二级指针:
每个程序都会收到一张环境表,环境表是一个字符指针数组,每个指针指向一个以’\0’结尾的环境字符串。
通过main获取环境变量
main函数其实一共有3个参数,一般我们都不会去写它。
main(argc, argv, envp)
我们通过以下代码了解一下:
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中有效元素个数
- argv:指针数组,存储的第一个是可执行程序的位置,其余是后面跟的各种选项
- envp:接受环境变量表,通过它获取系统的环境变量
通过对这三个参数了解,我们写两段代码体会一下这三个参数:
代码1:
int main(int argc, char *argv[])
{
if (argc > 1)
{
if (strcmp(argv[1], "a") == 0)
{
cout << "hello" << endl;
}
else if (strcmp(argv[1], "b") == 0)
{
cout << "byebye" << endl;
}
else
{
cout << "nt" << endl;
}
}
else
{
cout << "ggwp" << endl;
}
return 0;
}
代码2:
int main(int argc, char* argv[], char* envp[])
{
int i = 0;
while(envp[i])
{
cout << envp[i] << endl;
i++;
}
return 0;
}
运行结果就是各个环境变量的值。
通过environ获取环境变量
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int main()
{
extern char** environ;
int i = 0;
while(environ[i])
{
cout << environ[i] << endl;
i++;
}
return 0;
}
和通过char* envp[]
的结果差不多。
libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头文件中,所以在使用时要用extern进行声明。
通过系统调用获取环境变量
系统调用:getenv
int main()
{
cout << getenv("HOME") << endl;//PATH SHELL
return 0;
}
感谢您的阅读,欢迎指正。