Linux系统之进程优先级和环境变量

1 进程优先级

1.1 基本概念

(1)cpu资源分配的先后顺序,就是指进程的优先权(priority)
(2)优先权高的进程有**优先执行权利,**配置进程优先权对多任务环境的linux很有用,可以改善系统性能。
(3)还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整体性能。

1.2 查看系统进程的优先级

在linux或者unix系统中,用ps –l命令则会类似输出以下几个内容:

img

我们关注第一栏列出的重要信息,其中许多我们在前文提到,【Linux学习】进程状态:https://blog.csdn.net/sdhajkdghjkawhd/article/details/134032016

现在,我们关注里面新出现的PRI与NI
(1)代表这个进程可被执行的优先级,其值越小越早被执行;
(2)代表这个进程的nice值。

1.3 PRI & NI

1.3.1 PRI

PRI是进程的优先级(Priority)值,决定操作系统先处理哪些进程,其中PRI值一般是一个动态值,内核会经常自动修改进程的PRI值。

1.3.2 NI

NI就是我们所谓的nice值,起到修正进程可被执行的优先级的作用,其中NI值一般是一个静态值,内核一般不会去主动修改,主要是用户手动修改,NI值有取值范围:-20至19,一共40个级别。

1.3.3 优先级计算

这里给大家一个进程优先级的计算公式:PRI(new)=PRI(old)+nice,**即:**nice为负值时,进程的优先级会提高,反之则降低。

**PLUS:**ps 输出 的PRI并非进程结构中的prio,ps 输出的PRI应该称为 opri,是从PRI(0-139转化而来)。

task_struct的prio成员取值范围是0139,prio为099的任务为实时任务,100139则为**非实时任务(**非实时任务只有在没有任何实时任务运行时才可能被运行**)**,非实时任务的默认值应该是120,而一个非实时任务的nice值(实时任务没有nice一说),就是其prio的取值同120的差(+19-20),所以差值为负则其被调度的可能性更高。

ps命令看到的优先级的来源应该是proc文件系统,也就是你看到的task_prio函数返回的值,对应的范围是-100到39。

显示为80,实际应该是20,原因在于ps在显示时做了转换,以对应UNIX标准的priority值。

img

1.3.4 相关概念拓展

**(1)竞争性:**系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高 效完成任务,更合理竞争相关资源,便具有了优先级;
**(2)独立性:**多进程运行,需要独享各种资源,多进程运行期间互不干扰;
**(3)并行:**多个进程在多个CPU下分别,同时进行运行,这称之为并行;
**(4)并发:**多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发

2 环境变量

2.1 基本概念

环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数;我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但 是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找,环境变量通常具有某些特殊用途,在系统当中通常具有全局特性

2.2 和环境变量相关的命令

命令意义
echo显示某个环境变量值。
export设置一个新的环境变量。
env显示所有环境变量。
unset清除环境变量。
set显示本地定义的shell变量和环境变量。

2.2.1 env

下面,我在自己的Linux环境下输入env指令,系统便向我返回了所有当前的环境变量。

img

2.2.2 echo

一般情况下,我们使用echo命令多数是向显示器打出一段文字,但实际上它也可以用来显示某个环境变量的值,这里我们就拿刚才env指令得到的环境变量来验证;

imgimg

我们首先已知SHELL=/bin/bash,再用echo查看SHELL变量时,系统正确向我们返回了/bin/bash。

注意:用echo查看环境变量时,要在环境变量名字前+$。

2.2.3 set和export

这里我得向大家区分两个概念:本地变量与环境变量。

(1)本地变量:当前进程有效,其他进程及当前进程子进程无效;
(2)环境变量:当前进程有效,并且能够被子进程调用,反之不行,子进程环境变量的设置对父进程无效。

如果要定义一个本地变量,我们只需要向命令框中输入,变量名=val(值);而定义一个环境变量,我们还需要在前面加上一个export命令,即:export 变量名=val(值) 。

img

这里,我们首先定义一个本地变量TEST,再使用env命令并结合grep过滤出TEST变量时,我们是可以看到当前系统是没有返回值的,这说明此时变量TEST是没有写入环境变量中的,而加上export后,明显可以看到TEST被成功写入了环境变量中。

2.2.4 unset

unset命令用于删除**已定义的shell变量(包括环境变量)**和shell函数,

img

这里我们就将原本定义的TEST变量删除。

2.3 常见的环境变量

常见的环境变量作用
PATH指定命令的搜索路径
HOSTNAME当前主机的类型
HOME指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)
SHELL当前Shell,它的值通常是/bin/bash
HISTSIZE能够存储的历史命令的最大条数
USER正在使用Linux系统的用户
SSH_CLIENTIP地址

本文重点讲解PATH变量

2.4 PATH变量

2.4.1 导入

说到PATH变量,大家也许会感到陌生,但我们试想一个常见的场景:初学时,我们编写完一个自己hello world,编译为可执行程序后,

img

img

为什么我们直接输入自己的程序名,系统会报错,而必须在前面加上./才能正常执行,可是系统的指令也是程序,为什么就可以直接输入指令名称执行呢?其实说到底,背后的底层原因就是PATH环境变量,这时候我们再来看一下PATH的功能。

2.4.2 PATH的功能

**功能作用:**可执行程序的搜索目录,可执行程序包括Linux系统命令和用户的应用程序。如果可执行程序的目录不在PATH指定的目录中,执行时需要指定目录。

**书写格式:**PATH环境变量存放的是目录列表,目录之间用冒号:分隔,最后的圆点“.”表示当前目录。例如:export PATH=目录1:目录2:目录3:…目录n:.

img

用echo查看PATH里的值

img

当我们随便查看PATH路径下的一条时,便可以看到其中放着密密麻麻的程序,这时我们可以知道,在我们在输入一个命令后,系统就会去PATH存储的路径下查找我们输入的命令并执行,这就意味着,我们如果把自己程序的路径写入PATH里便可以做到像系统命令一样的调用。

img

这时候我们执行export PATH=$PATH:我们自己程序的路径,此时就可以将自己程序的路径写入PATH环境变量中,这时候我们再直接输入我们程序的名字,程序成功运行!

2.5 环境变量的组织方式

img

每个程序都有一张环境变量表,环境变量表是一个字符指针数组,每个指针指向一个以 “\0” 结尾的环境字符串。

2.6 程序如何获取环境变量

main函数的三个参数,我们在之前学习C/CPP 时,写的程序的main函数是不带参数的,但是实际上,main函数是可以带三个参数的。

(1)第一个参数argc:表示argv数组中存放的字符指针个数;
(2)第二个参数argv:存储的是命令行选项相关的字符指针,类型是char;
(3)第三个参数env:存储的是环境变量相关的字符指针,类型是char。

2.6.1 argc与argv

img

这里我们专门编写一个程序来观察**argv[]**内存储的内容,

img

这里我们编译运行后,可以得知我们程序命令后附加的选项[-a],[-b],[-c]…都会被存储到argv字符指针数组里面来供程序使用,这在我们之后写到进程控制时会频繁使用

2.6.2 env

再编写一个程序获取env中存储得数据,

img

程序编译执行,

img

**我们不难发现里面存储的数据,就是我们用env命令获取的环境变量!**此时我们也便理解进程如何获取到环境变量。

文章已获作者授权转载,版权归原作者所有,如有侵权,与本账号无关,可联系删除。 原文作者:Chris在Coding
原文链接:https://chris-coding.blog.csdn.net/article/details/134053661

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值