标题:[Linux] Linux操作系统 进程的优先级
个人主页@水墨不写bug
(图片来源于网络)
目录
一、进程优先级
1.PRI and NI
2.PRI vs NI 的补充理解
二、命令行参数和环境变量
正文开始:
一、进程优先级
基本概念
进程的调用需要CPU,CPU对进程的资源分配的先后顺序,就是指进程的优先权(priority)。
优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用,可以改善系统性能。
还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整体性能。
查看当前的系统进程
在linux或者unix系统中,用ps –l命令则会类似输出以下几个内容:
我们很容易注意到其中的几个重要信息,有下:
UID : 代表执行者的身份
【Linux下对用户的区分是按照一个特定的编号来进行的,这样做是为了提高效率,因为对字符串的比较需要O(N),而对于整形数字的比较只需要O(1)】
PID : 代表这个进程的代号
PPID :代表这个进程是由哪个进程发展衍生而来的,亦即父进程的代号
PRI :代表这个进程可被执行的优先级,其值越小越早被执行
NI :代表这个进程的nice值
1.PRI and NI
- PRI(priority)也还是比较好理解的,即进程的优先级,或者通俗点说就是程序被CPU执行的先后顺序,此值越小进程的优先级别越高。
- 那NI就是我们所要说的nice值了,什么是nice值?其表示进程可被执行的优先级的修正数值。
- PRI值越小越快被执行,那么加入nice值后,将会使得PRI变为: PRI(new)=PRI(old)+nice
- 这样,当nice值为负值的时候,那么该程序将会优先级值将变小,即其优先级会变高,则其越快被执行。
- 调整进程优先级,在Linux下,就是调整进程nice值。(为什么不直接调整PRI呢?因为调整PRI的时机不是确定的。修改了进程A的优先级表示在调用队列中A的位置发生了变化,但是这是不符合CPU的调用公平原则的)
- nice其取值范围是-20至19,一共40个级别。
当我们创建一个进程,他的优先级默认是80:我们可以修改它的优先级:
首先进入top;输入r(renice);输入需要修改的进程pid;输入要修改的nice值即可。
将进程的优先级调到最低:
将进程的优先级调到最低:
进程的优先级是不能被频繁修改的,如果想要成功修改进程的优先级,需要切换到超级用户(root)
2.PRI vs NI 的补充理解
需要强调一点的是,进程的nice值不是进程的优先级,他们不是一个概念,但是进程nice值会影响到进程的优先级变化。
可以理解nice值是进程优先级的修正修正数据。
二、命令行参数和环境变量
命令行参数
当初我们第一次打开编译器的时候,我们会发现默认的源文件里面的main函数是有参数的:
int main(int argc,char* argv[])
{
//...
return 0;
}
其实即使没有参数,main函数还是可以正常运行的。
如果main函数带了这些参数, 当我们调用这个可执行程序的时候,第一个参数就是我们调用的指令,如果我们在调用指令之后以空格为间隔,加上一些选项,这些选项会被以字符串的形式追加到 指针数组 argv[] 中。
这些工作实际上是父进程Bash做的。Bash(命令行解释器)会解释输入的命令,每一个指令的执行其实就是一个子进程的创建、运行、返回。
比如我们使用ls,可以加-a -l -al等:
ls -al
我们使用这样的指令,默认是输入给父进程bash的,父进程保存这些数据。由于子进程可以访问父进程数据,子进程mytest的main函数的参数是通过访问父进程的数据来传递的。
环境变量
我们生成的mytest可执行程序在执行的时候需要加上当前目录的标识符“./”然后加上程序名才能执行。但是我们最常使用的指令,比如:
ls
pwd
cd
等这些指令,却不需要指定这些程序文件的位置,为什么?
其实操作系统是通过环境变量来找到这些程序的位置的。依靠的环境变量就是:
PATH
我们可以通过echo指令查看环境变量:
echo $PATH
这些路径就是bash默认查找的路径:当我们执行常用的系统指令的时候,bash会默认在这些路径中查找指令的程序文件:
如果找到,则加载到内存中运行;
如果没有找到的,则报错:
ls等这些系统指令是存储在/user/bin中的,如果我们想要让自己写的指令拥有与系统指令相同的“待遇”,有如下两种方法:
方法一:
把自己的可执行程序拷贝到user/ben目录中。这样虽然可以达到目的,但是着实不太明智,这会污染系统的指令集。
方法二:
我们可以把自己的可执行程序的路径添加到bash默认查找的路径中;这就需要更改
PATH环境变量,对于PATH环境变量的更改,有如下两种方法:
PATH=(指定的目录)
这种方法会直接覆盖原来的默认路径。
PATH=$PATH:(指定的路径)
这种方法会追加在原来默认路径的后面。
我们更改了默认的搜索路径之后,就可以不用指定当前目录而执行自己的指令了。
但是当我们再次登录服务器的时候,会发现PATH环境变量被改回去了。这是因为环境变量是最开始不是在内存中,而是在系统对应的配置文件中的。 当我们登录服务器,bash启动就会把配置文件信息读取到环境变量中去。
这就是读取环境变量的配置文件: (默认是在每个人的工作目录: cd ~ 的目录中)
我们可以得出结论:环境变量是内存级的。
待续
未经作者同意禁止转载