




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
WordLinux进程优先级和环境变量详解一、进程优先级
1、基本概念
(cpu)资源分配的先后顺序,就是指进程的优先权(priority).优先权高的进程有优先执行权利。配置进程优先权对多任务环境的(Linux)很有用,可以改善系统性能。还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整体性能。
2、查看以及修改系统进程的优先级
在Linux或者unix系统中,用ps–al命令则会类似输出以下几个内容,其中:
UID:代表执行者的身份
(PI)D:代表这个进程的
PPID:代表这个进程是由哪个进程发展衍生而来的,亦即父进程的
PRI:代表这个进程可被执行的优先级,其值越小越早被执行
NI:代表这个进程的nice值,其表示进程可被执行的优先级的修正数值。
我们看到我们现在有两个进程bashps它们的进程优先级都是80,如果我们要修改它们的优先级就要用到NI的nice值了。
P
R
I
(
n
e
w
)
=
P
R
I
(
o
l
d
)
+
n
i
c
e
PRI(new)=PRI(old)+nicePRI(new)=PRI(old)+nice
从这个公式中我们知道新的PRI=老的PRI+nice值,但是这个老的PRI的值是指PRI最初的默认值,例如上面的bashps是80,那么这个PRI以后不论怎么改老的PRI都是80,当然大多数进程默认的PRI都是80。
此外nice是有范围的!其取值范围是-20至19,一共40个级别。
于是下面我们去尝试去更改processC进程的优先级。
注意:将进程优先级调高(即将nice值设置为负数)需要root用户进行操作!
修改进程优先级的Linux指令
top命令
进入top后按"r"->输入进程PID->输入nice值
按下“r”
输入-20
再次[查看进程]的相关信息:
我们发现进程的优先级确实改变了,但是我们能改变进程优先级有限[−20,19][-20,19][−20,19],因为调度器不允许我们将一个进程设置的优先级太高,进而导致其他进程难以被调度。
3、一些其他的关于进程优先级的指令和函数调用
nice指令,nice命令的功能是用于调整进程的优先级,合理分配系统资源。-n参数是nice值的优先级别,
以nice值为-5的方式执行指定程序
查看进程优先级
renice命令可以修改正在运行的进程的调度优先级。
renice更改一个或多个进程的调度优先级。第一个参数是要使用的优先级值,另一个参数被表示为进程标识信息。
renice
[-n]
priority
[-(gpu)]
iden(ti)fier
-g,后面加组的pgid,改变一个组的进程优先级
-u,后面加username或uid,改变一个用户所拥有的进程优先级。
-p,后面加pid,改变一个进程的进程优先级。
使用renice命令
函数调用
在Linux中关于改变进程优先级函数调用主要有两个:getpriority()与setpriority()。
4、与进程优先级有关的一些进程性质
竞争性:系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级
独立性:多进程运行,需要独享各种资源,多进程运行期间互不干扰。
并行:多个进程在多个CPU下,分别同时进行运行,这称之为并行
并发:多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发
二、环境变量
1、基本概念
环境变量(environmentvariables)一般是指在(操作系统)中用来指定操作系统运行环境的一些参数,环境变量通常具有某些特殊用途,在系统当中通常具有全局特性。
如:我们在编写C/(C++)代码的时候,在链接的时候,从来不知道我们的所链接的动态[静态库]在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。
2、和环境变量相关的命令
1.env:显示所有环境变量
2.echo:显示的变量值(需要带上$符号)
3.export:设置一个新的环境变量,或者将本地[变量提升]成环境变量。
4.unset:清除环境变量
5.set:显示本地定义的shell变量和环境变量
3、Linux中的常见环境变量介绍
PATH:指定命令的搜索路径
例如我们使用的Linux中lspwd命令,其实就是一个个C语言写的一个个小程序,为什么我们运行自己写的程序就要用./+自己的程序名,而我们运行lspwd从来不加./,这就和环境变量PATH有关了!
我们查看环境变量可以使用echo$环境变量命令:
默认情况下我们使用的Linux指令会去PATH路径下寻找源程序,由于ls指令的路径位置就在PATH的环境变量中所以我们可以不用加./
我们现在尝试将我们的路径添加到PATH环境变量里面,来让我们的程序也不需要加./,这时我们就需要使用一个新的指令了:export
export令可以将本地变量提升成环境变量,于是我们将我们的路径添加到PATH中就可以这样写:
export
PATH=$PATH:你要添加的路径
当然我们使用export命令是暂时将本地变量提升为环境变量,当我们退出云服务器或关机重启都会消除export暂时提升的环境变量,想要真正的修改我们要修改相应的配置文件。
当然我们还可以将我们写的程序拷贝到Linux的PATH默认路径下,这样我们也不用使用./了,在Linux中,把可执行程序,拷贝到系统默认路径下,让我们可以直接访问的方式,相当于Linux下软件的安装!
HOME:指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)
由于HOME环境变量的存在,我们使用相同的命令cd~却得到了不同的结果。
SHELL:当前Shell,它的值通常是/bin/bash。
4、环境变量的组织方式以及在C代码中如何获取环境变量
在Shell内部,环境变量其实是以环境变量表的方式进行维护的!
此外环境变量还具有全局性,我们知道我们在bash下运行的程序其父进程都是bash,那么bash就可以将自己的环境变量传递给子进程,并在子进程中发挥作用!
我们来看一段代码来验证环境变量具有全局性。
1.C库函数getenv()获得单个环境变量
在看验证代码之前我们先了解一个函数getenv()getenv()是一个C库函数,它可以获取一个环境变量的内容
函数原型:
函数的参数是环境变量的名称,返回值是一个char*字符串记录了环境变量里面的内容,如果调用失败会返回NULL指针。
实例代码
#include
#include
int
main(){
char*
env
=
getenv("USER");//USER是环境变量
if(env
==
NULL)
{
perror("getenv
fail:");
}
printf("%s",env);
return
0;}
代码输出结果
我们在代码里面多出来的USER变量就是来自Shell传递给我们的(te)st1c进程的环境变量!
2.main()函数参数获得环境变量
此外我们我们还可以用main函数的参数来获得所有环境变量的地址,通过地址我们也能遍历所有环境变量
函数原型
int
main(int
argc,
char
*argv[],
char
*envp[]);
在这里我们先不谈论函数的参数argc*argv[],我们来谈论第三个参数!其中*envp[]是一个字符数组指针,指向的是一个指针数组,数组名代表首元素的地址,首元素是一个字符指针,*envp[]刚好又是指向首元素的指针,故其实*envp[]其实是一个二级指针!
明白了这些,我们来看下面一段代码:
#includeint
main(int
argc,
int
*argv[],
int
*envp[]){
for(int
i
=0;
envp[i]
!=
NULL
;
++i)
{
//打印所有环境变量,相当于env命令!
printf("envp[%d]-->%s",
i,
envp[i]);
}
return
0;}
可以看到我们确实打印出了所有的环境变量,而且这个环境变量来自于其父进程bash。
3.C语言全局变量environ获得环境变量
变量详情:
environ变量是一个二级指针与main()函数参数的char*envp[]类似。遍历所有环境变量也可以这样写:
#include
#include
int
main(){
extern
char**
environ;
for(int
i
=0;
environ[i]
!=
NULL;
++i)
{
printf("environ[%d]-->%s",
i,
environ[i]);
}
return
0;}
5、不同用户的环境变量是怎么形成的
通过上面的讲解我们知道了环境变量的概念与作用,环境变量中的每一个,都有自己的用途:有的是进行路径查找的,有的时进行身份(认证)的,有的时进行动态库查找的,有的是用来进行确认当前路径等等每一个环境变量都有自己的特定应用场景。
我们也知道为什么,对于不同的用户其环境变量也并不相同,例如我们上面的root用户的环境变量与pan的环境变量有的一样有的不一样,那么Linux是怎样形成不同的环境变量的呢?
这里先给出结论:环境变量本质就是一个内存级的一张表,这张表由用户在登陆会统的时候,给特定用户形成属于自己的环境变量表。
在我们的家目录下有两个文件叫.bashrc.bash_profile在根目录下有一个bashrc的文件
打开这些文件看看!
6、main()函数的命令行参数
在前面我们谈论中我们说到过main()函数的参数问题,我们还有两个参数没有谈论intargcchar*argv[]。现在我们来讨论它们!
由于C语言中无法传递整个数组,所以在函数中想要获得数组元素的个数必须在传参时就要提前传递好,于是其中intargc就是char*argv[]数组指针指向的数组的有效元素个数,不包含NULL。
这个char*argv[]是一个数组指针,其指向的数组里面存放的都是char*的指针,这些char*的指针指向的内容需要我们使用命令行的方式进行设置。
我们先看下面一段代码:
#include
int
main(int
argc,
int
*argv[]){
printf("arg
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 诗歌创作的灵感来源试题及答案
- 突破财务成本管理的创新框架试题及答案
- 逻辑思维的框架与试题及答案
- 跨境电商对地方经济的推动分析试题及答案
- 计算机二级知识扩展试题及答案探索
- 计算机二级Web考试准备步骤试题及答案
- 2025年MySQL函数性能分析试题及答案
- 计算机基础知识精粹试题及答案
- 提升效率2025年计算机二级Python考试技巧试题及答案
- 2025年MySQL数据分析能力试题及答案
- 物流运输企业安全隐患排查记录表
- 神经病学题库及神经病学试题题库
- 糖尿病酮症完整版本
- 五年级下册数学约分练习100题附答案
- 跨文化交流中的语言适应性研究
- 第5.2课 《飞向太空的航程》同步练习 (原卷版)
- 新概念英语第二册Lesson8课件
- 地摊市集活动策划方案
- 劳务外包与劳务派遣课件
- 白酒行业财务知识培训课件
- 智慧仓储配送机器人案例
评论
0/150
提交评论