目录
进程的优先级
基本概念
如何查看优先级
PRI与NI
NI值的设置范围
NI值如何修改
修改方式一 : 通过top指令修改优先级
修改方式二 : 通过renice指令修改优先级
进程的四个重要概念
环境变量
基本概念
常见的环境变量
查看环境变量
三种环境变量的作用(不建议修改)
PATH
方式一: 将我们的可执行文件放到PATH路径中
方式二: 将我们当前的路径加入到PATH路径当中
HOME
SHELL
环境变量相关指令
环境变量的组织方式
main函数的参数
通过系统函数来获取环境变量
- 什么是进程优先级?
cpu资源分配的先后顺序 就是指进程的优先权(priority)
- 优先级存在的原因?
优先级存在的原因 本质上是因为资源的不足 在系统中表现为有多个进程却只有一个cpu
我们可以使用ps -l指令来查看进程
ps -l
在Linux系统中 PRI(old)值默认为80 所以说Linux中 优先级为 PRI(new) = 80 + NI
NI 的设置范围是固定的 必须是 -20~19 如果超出这个值 则设定的nice值会变为最接近这个区间的值
如果设定NI值为 -100 则它的值会被设置为 -20
如果设定NI值为100 则它的值会被设置为19
为什么NI值的范围被设置成这样子
因为操作系统要尽量保证每个进程的公平运行 如果我们可以随意将进程的优先级设置的很低那么操作系统就会倾向于执行这个进程 从而导致其他进程不能被很好的被cpu执行 所以说PRI值最好是在一个范围中
top命令就相当于任务管理器
我们调用top命令之后会出来这样子的界面
按住 r 键 就可以输入需要调整NI值的进程PID
输入PID之后回车 再输入NI值
输入修改的NI值为15之后回车 按住q键 退出top
这是因为6646是5850的子进程 会继承父进程的代码和数据
指令为renice + NI值 + 进程号
普通用户如果想要renice 需要使用sudo指令 临时提升权限
环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数
由于它是在操作系统中的 所以一般是全局变量
echo $PATH
为什么我们系统的可执行文件我们就可以直接执行 而我们自己编译的可执行文件却不可以
这个就是因为环境变量PATH的存在
自己的可执行文件之所以要指定位置的就是因为它们不在PATH路径中
export PATH=$PATH:路径
Linux操作系统当中所敲的各种命令 实际上需要由命令行解释器进行解释 而在Linux当中有许多种命令行解释器(例如bash、sh) 我们可以通过查看环境变量SHELL来知道自己当前所用的命令行解释器的种类
我们查看SHELL使用如下命令
env : 显示所有环境变量
set : 显示本地定义的shell变量和环境变量
unset :清除环境变量
在linux中 环境变量是通过一张表组织起来的 如果我们使用c语言的知识去理解的话其实就是环境变量表就是一个二级指针
它指向一个一级指针数组 这里面放置着各种环境变量 最后的环境变量是NULL
main函数是有参数的
它一共有三个参数 分别是 argc argv envp
其中argv是一个指针 它指向一个数组 里面储存的是char*类型的数据
argc是一个整数 它标识着argv中有效元素的个数
下面的代码来验证
int main(int argc, char* argv[])
{
if(argc != 2)
{
printf("Usage: %s -[a|h]\n", argv[0]);
return 1;
}
if(strcmp(argv[1], "-h") == 0)
{
printf("hello world\n");
}
else if(strcmp(argv[1], "-a") == 0)
{
printf("hello all\n");
}
else
{
printf("hello\n");
}
return 0;
}
可以通过边里获取环境变量
int main(int argc, char* argv[], char* env[])
{
for(int i = 0; env[i]; ++i)
{
printf("%d->%s\n", i, env[i]);
}
return 0;
}
还可以直接用二级指针 environ来获取环境变量
注意 libc 中定义的全局变量environ指向环境变量表 environ没有包含在任何头文件中 所以在使用时要用extern进行声明
extern char** environ;
for(int i = 0; environ[i]; i++)
{
printf("%d->%s\n", i, environ[i]);
}
可以使用getenv系统函数来查看环境变量
printf("PATH: %s\n", getenv("PATH"));
printf("HOME: %s\n", getenv("HOME"));
printf("SHELL: %s\n", getenv("SHELL"));