- 进程优先级
- 基本概念
- 查看系统进程
- PRI 和 NI
- 用top命令更改已存在进程的nice
- 其他关于进程得概念
- 环境变量
- 基本概念
- 常见环境变量
- 和环境变量相关的命令
- 环境变量的组织方式
查看系统进程
- CPU资源分配的先后顺序,就是进程的优先级(priority)
- 优先级高的进程有优先执行权力。配置进程优先级对多任务环境的linux很有用,可以改善系统性能
- 还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整体性
ps -al #查看系统的进程
PRI 和 NI
UID:代表执行该进程的身份
PID:代表这个进程的代号
PPID:代表这个 进程的父进程代号
PRI:代表这个进程的 可以被执行的优先级,值越小优先级越高
NI:代表这个进程的nice值
- PRI比较好理解,就是进程的优先级,通俗来讲就是程序被CPU执行的先后顺序,值越小优先级越高
- NI就是我们所说的nice值,表示进程可被执行优先级的修正数值
- PRI值越小程序就越快被执行,加入nice值之后,PRI(new) = PRI(old) + nice
- 当nice值为负数的时候,该程序会将优先级的值变小,即其优先级会变高,则其越快被执行
- 所以调整进程优先级,在linux下,就是调整进程的nice值
- nice值得**取值范围是-20 ~ 19,一共40个级别
用top命令更改已存在进程的nicePS:进程的nice值不是进程的优先级,他们不是一个概念,但是进程nice值会影响到进程的优先级变化,nice值是进程优先级的修正数据
进入top之后,按“r“ ==> 输入进程PID ==> 输入nice值
其他关于进程得概念值得一提的是,我们前面讲到PRI(new) = PRI(old) + nice,这里的PRI(old)每次在改变nice值得时候,都是以80作为PRI(old)
- 竞争性:系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性得。为了高效完成任务,更合理的竞争相关资源,便有了优先级。
- 独立性:多进程运行,需要独享各种资源,多进程运行期间互不干扰
- 并行:多个进程在多个CPU下分别同时进行运行,称之为并行
- 并发:多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发
-
环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数
例如:我们在编写C/C++代码的时候,在链接的时候,我们从来不知道我们所链接的动静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找
-
环境变量通常具有某些特殊用途,在系统当中通常具有全局特性
- PATH:指定命令的搜索路径
- HOME:指定用户的主工作目录(即用户登录到Linux系统中时,默认的目录)
- SHELL:当前shell,他的值通常时/bin/bash
查看环境变量的方法: echo $NAME # NAME是要查看的环境变量名称
举个例子:
我们在执行我们自己编写的程序时往往需要执行./myproc,这样才能执行我们写的程序。这个./其实就是在找我们可执行程序存在的路径,那么如果我们想不用./就能执行我们写的可执行文件要怎么弄呢?这时候只需要我们把我们的文件路径导入到PATH变量中即可。
export PATH=$PATH:文件路径和环境变量相关的命令
- echo:显示某个环境变量
- export:设置一个新的环境变量
- env:显示所有的环境变量
- unset:清除环境变量
- set:显示本地定义的shell变量和环境变量
举个例子:
每个程序都会收到一张环境表,环境表是一个字符指针数组,每个指针指向一个以" "结尾的环境字符串
Linux中可以使用env来查看环境变量的信息
这里不太明显,我们写一个程序来看看环境变量是怎么获取的。首先我们得先理解一个东西,叫做命令行参数。
我们在linux中使用ls -a -l等指令,其实就是使用的命令行参数,我们给程序传入不同的参数,它执行不同的操作。
1 #include2 #include 3 #include 4 using namespace std; 5 6 int main(int argc, char* argv[]) 7 { 8 if(argc > 2) 9 { 10 cout << "list:"<<"./myproc [-a|-b]" << endl; 11 } 12 13 if(strcmp("-a", argv[1])==0) 14 { 15 cout << "hello" << endl; 16 } 17 else if(strcmp("-b", argv[1])==0) 18 { 19 cout << "hello word" << endl; 20 } 21 else{ 22 cout << "error" << endl; 23 } 24 return 0; 25 }
同样的libc中定义了的全局变量environ指向环境变量表,environ没有包含在任何头文件中,所以在使用时要用extern声明
命令行第三个参数获取环境变量
1 #include2 #include 3 #include 4 using namespace std; 5 6 7 // 通过命令行参数获取环境变量 8 int main(int argc, char* argv[], char* env[]) 9 { 10 int i = 0; 11 for(;env[i];++i) 12 { 13 cout << env[i] < 通过第三方变量environ获取环境变量
1 #include2 #include 3 #include 4 using namespace std; 5 6 // 通过第三方变量environ获取环境变量 7 int main() 8 { 9 extern char** envrion; 10 int i = 0; 11 for(;environ[i];++i) 12 { 13 cout << environ[i] << endl; 14 } 15 return 0; 16 } 通过系统调用获取或设置环境变量
1 #include2 #include 3 #include 4 using namespace std; 5 6 // 系统调用获取环境变量 7 int main() 8 { 9 printf("%sn", getenv("PATH"));// 获取名为PATH的环境变量 10 return 0; 11 } 环境变量通常是具有全局属性,可以被子进程继承下去
1 #include2 #include 3 #include 4 using namespace std; 5 6 // 系统调用获取环境变量 7 int main() 8 { 9 int pid = fork(); 10 if(pid == 0)// 获取名为PATH的环境变量 11 { 12 printf("child:%d %sn",getpid(), getenv("MYENV")); 13 } 14 else{ 15 16 printf("father:%d %sn",getpid(), getenv("MYENV")); 17 } 18 return 0; 19 }



