Linux下优先级和环境变量(初学者必备)
一.进程的优先级什么是进程的优先级呢?在日常生活中我们到处都有优先级,比如说我们在食堂排队打饭的时候需要排队而排在我们前面的人优先级比我们高?那为什么需要优先级呢?本质上了是资源太少,如果食堂打饭的窗口有很多很多个,我们也不需要排队。在linux下进程也是如此也有优先级。下面我们来看看进程优先级的概念:1.cpu资源分配的先后顺序,就是指进程的优先权(priority) 。2.优先权高的进程有优先
目录
一.进程的优先级
什么是进程的优先级呢?在日常生活中我们到处都有优先级,比如说我们在食堂排队打饭的时候需要排队而排在我们前面的人优先级比我们高?那为什么需要优先级呢?本质上了是资源太少,如果食堂打饭的窗口有很多很多个,我们也不需要排队。在linux下进程也是如此也有优先级。下面我们来看看进程优先级的概念:
1.cpu资源分配的先后顺序,就是指进程的优先权(priority) 。
2.优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用,可以改善系统性能。还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某CPU,可以大大改善系统整体性能。
如何查看进程的优先级:ps命令 ps -al:
下面有几个重要的信息需要解释一下:
1.UID:代表执行者的身份·
2.PID:代表这个进程的代号
3.PPID∶代表这个进程是由哪个进程发展衍生而来的,亦即父进程的代号PRI︰代表这个进程可被执行的优先级,其值越小越早被执行
4.NI∶代表这个进程的nice值PRI和NI
1.PRI也还是比较好理解的,即进程的优先级,或者通俗点说就是程序被CPU执行的先后顺序此值越小进程的优先级别越高
2.那NI呢?就是我们所要说的nice值了,其表示进程可被执行的优先级的修正数值PRI值越小越快被执行,那么加入nice值后,将会使得PRI变为:PRI(new)=PRl(old)+nice。这样,当nice值为负值的时候,那么该程序将会优先级值将变小,即其优先级会变高,则其越快被执行·所以,调整进程优先级,在Linux下,就是调整进程nice值nice其取值范围是-20至19,一共40个级别。
修改进程优先级:top
进入top后按"r"->输入进程PID->输入nice值几个重要的概念:
1.竞争性:系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级。
2.独立性:多进程运行,需要独享各种资源,多进程运行期间互不干扰。3.并行:多个进程在多个CPU下分别,同时进行运行,这称之为并行。
4.并发:多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发。
二.环境变量
1.环境变量的基本概念及常见环境变量
·环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数。
比如说:我们平时在写c或者c++代码的时候,对目标文件进行链接时,包含头文件时我们从来都不知道他们在哪里但是照样可以形成可执行程序,原因是因为有相关的环境变量帮助编译器进行查找。
我们在c语言或者c++定义变量的时候比如说我们定义一个整型变量int a=10;变量有变量名字和内容同样的环境变量也有变量名和变量的内容。也就是说环境变量=变量名+内容。
如何查看环境变量:
echo $NAME(NAME:环境变量名称)
实例:
2.为什么要有环境变量
为了方便用户,开发者和系统进行某种最简单的查找和定位及确认的问题。
大家可以发现我们在使用ls pwd cd 这些指令的时候我们是不需要指明路径的而我们在运行我们自己写的程序时却要带上路径呢?
我们需要./mytest这样系统才找得到,那说明./的功能就是找到mytest,那为什么ls 这些命令不需要带路径了:首先我们先来查看一下环境变量PATH:
通过上图我们可以知道ls指令的路径是被写入环境变量里面去了,所以当我们在使用环境变量时系统会去环境变量PATH中搜索是否存在,如果搜索到了就执行,没有找到就报错。
那我们是否也可以像ls pwd 一样不用指明路径也可以被系统执行了?当然可以下面介绍两种方法
方法一:直接被程序的路径拷贝到user/bin路径下永久有效(但是强烈不建议会污染linux系统的命令池)
方法二:export PATH=$PARH:路径。(关掉xsell之后失效)
这样就可以和ls 一样不指明路径就可以执行:
环境变量的相关命令:
1.echo:显示某个环境变量值
2.export:设置一个新的环境变量
3.env:显示所有环境变量
4.unset:清除环境变量
5.set:显示本地定义的shell变量和环境变量
3.环境变量的组织方式
我们在使用ls命令时我们可以使用不同的选项显示不出其他的功能。ls是怎么使用这样的功能呢?其实在c和c++中的main函数是用参数的,只是我们在平时没有写.原型如下:
int main(int argc ,char*argv[],char*env[]);其中第一个参数指的是参数列表的个数,我们不传命令时一般默认为1个,第二个参数是指针数组,数组中存放的是一个char*类型的指针,指向的是字符串,这些字符串对应着不同的参数。第三个参数了为环境变量。
下面通过一段代码演示:
1.#include<iostream> 2 using namespace std; 3 int main(int argc ,char*argv[],char*env[]) 4 { 5 for(int i=0;i<argc;i++) 6 { 7 cout<<argv[i]<<endl; 8 } 9 return 0; 10 }
我们运行这个程序:
下面我们在来看一段代码.
1 #include<string> 2 #include<iostream> 3 using namespace std; 4 int main(int argc,char*argv[],char*env[]) 5 { 6 for(int i=0;i<argc;i++) 7 { 8 cout<<"argv["<<i<<"]"<<":"<<argv[i]<<endl; 9 } 10 string str="-a"; 11 string str2="-b"; 12 if(argc<2) 13 { 14 cout<<"请输入命令行参数"<<endl; 15 } 16 else if(argv[1]==str) 17 { 18 cout<<"I am -a"<<endl; 19 } 20 else if(argv[1]==str2) 21 { 22 cout<<"I am a -b"<<endl; 23 } 24 else 25 { 26 cout<<"输入错误"<<endl; 27 } 28 return 0; 29 30 } ~ ~
我们运行这个程序:
这样我们大致就能够明白ls 和 cd 这些命令能够根据不同的选项,显示不同的内容本质是在程序里面将命令行参数拿到,然后再做各自判断实现不同的功能。
4.环境变量常见指令
1.echo:显示某个环境变量值
2.export:设置一个新的环境变量
3.env:显示所有环境变量
4.unset:清除环境变量
5.set:显示本地定义的shell变量和环境变量
5.环境变量的组织方式
1.每个程序都会收到一张环境表,环境表是一个字符指针数组,每个指针指向一个以’\0’结尾的环境字符串。
如何获取环境变量呢?上面我们提到了main函数的3个参数,我们可以借助main函数的参数进行获取,下面请看代码:
1 #include<string> 2 #include<iostream> 3 using namespace std; 4 int main(int argc,char*argv[],char*env[]) 5 { 6 for(int i=0;env[i];i++) 7 { 8 cout<<env[i]<<endl;//打印环境变量 9 } 10 return 0; 11 12 }
我们运行这个程序:
那还有没有其他方法了,可能很多老铁说我就不想传参。这时候我们就可以通过第三方变量environ获取:具体请看代码:
1 #include<string> 2 #include<iostream> 3 using namespace std; 4 int main() 5 { 6 extern char** environ;//通过第三方变量获取环境变量 7 for(int i=0;environ[i];i++) 8 { 9 cout<environ[i]<<endl; 10 11 } 12 13 return 0; 14 } ~ ~
同样的我们也能把环境变量获取到,但是我们发现我们这样获取到的是全部的环境变量我们要找特定的环境变量我们还要一个一个找,其实还有更好的方法通过 getenv;
#incude<stdlib.h> #include<string> 2 #include<iostream> 3 using namespace std; 4 int main() 5 { 6 cout<<getenv("PATH"); 7 return 0; 8 }
6.环境变量的全局属性
环境变量通常具有全局属性,可以被子进程继承下去
下面我们来看一个例子:
1.#include<stdlib.h> 2 #include<iostream> 3 using namespace std; 4 int main() 5 { 6 char* tmp=getenv("MYENV"); 7 if(tmp) 8 { 9 cout<<tmp<<endl; 10 } 11 12 return 0; 13 }
第一次运行没有结果这是因为MYENV是一个本地变量,第二次通过父进程导出环境变量MYENV我们再次运行:
为什么子进程也能够获取到这个环境变量了这是因为子进程会基础父进程bash的环境变量,子进程的创建以父进程为模板
总结:环境变量之所以具有全局属性是因为它可以被子进程继承。
更多推荐
所有评论(0)