南飓风 发表于 2024-10-24 22:04:24

[Linux] Linux利用体系 进程的优先级 && 环境变量

标题: Linux利用体系 进程的优先级
个人主页@水墨不写bughttps://i-blog.csdnimg.cn/direct/fa91dbb6f36f46a09fc600c1406fc0ed.png
(图片来源于网络)
目次
一、进程优先级
1.PRI and NI
2.PRI vs NI 的增补明白
二、命令行参数和环境变量
1. 命令行参数
2.环境变量        
I,环境变量是内存级的 
II,其他更多的环境变量及具体意义
 III,整体明白环境变量体系
IV,环境变量和本地变量
正文开始:
一、进程优先级

   基本概念
        进程的调用需要CPU,CPU对进程的资源分配的先后顺序,就是指进程的优先权(priority)。
        优先权高的进程有优先实行权利。配置进程优先权对多任务环境的linux很有用,可以改善体系性能。
        还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大大改善体系整体性能。
查看当前的体系进程
        在linux或者unix体系中,用ps –l命令则会类似输出以下几个内容:
https://i-blog.csdnimg.cn/direct/9c6eddf31d89485aa58d6fe5c0cc5440.png
我们很轻易注意到其中的几个重要信息,有下:
           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:https://i-blog.csdnimg.cn/direct/01d1cefb49c7451f8b2443dfd76578e8.png我们可以修改它的优先级:
           首先进入top;输入r(renice);输入需要修改的进程pid;输入要修改的nice值即可。
 将进程的优先级调到最低:https://i-blog.csdnimg.cn/direct/53b8989380ee41999c2da7e4983b3a8b.png
将进程的优先级调到最低:
https://i-blog.csdnimg.cn/direct/42c80933efa54a1e976883a23d6139b4.png
           进程的优先级是不能被频仍修改的,如果想要乐成修改进程的优先级,需要切换到超级用户(root)
2.PRI vs NI 的增补明白

           需要夸大一点的是,进程的nice值不是进程的优先级,他们不是一个概念,但是进程nice值会影响到进程的优先级变化。
        可以明白nice值是进程优先级的修正修正数据。
二、命令行参数和环境变量

1. 命令行参数

        当初我们第一次打开编译器的时候,我们会发现默认的源文件里面的main函数是有参数的:
int main(int argc,char* argv[])
{
    //...
    return 0;
}         其实即使没有参数,main函数还是可以正常运行的。
        如果main函数带了这些参数, 当我们调用这个可实行程序的时候,第一个参数就是我们调用的指令,如果我们在调用指令之后以空格为间隔,加上一些选项,这些选项会被以字符串的形式追加到 指针数组 argv[] 中。
        这些工作实际上是父进程Bash做的。Bash(命令行解释器)会解释输入的命令,每一个指令的实行其实就是一个子进程的创建、运行、返回。
        比如我们利用ls,可以加-a -l -al等:
ls -al          我们利用这样的指令,默认是输入给父进程bash的,父进程保存这些数据。由于子进程可以访问父进程数据,子进程mytest的main函数的参数是通过访问父进程的数据来传递的。
2.环境变量        

I,环境变量是内存级的 

        我们生成的mytest可实行程序在实行的时候需要加上当前目次的标识符“./”然后加上程序名才气实行。但是我们最常利用的指令,比如:
           ls
        pwd
        cd
        等这些指令,却不需要指定这些程序文件的位置,为什么?
        其实利用体系是通过环境变量来找到这些程序的位置的。依赖的环境变量就是:
           PATH
        我们可以通过echo指令查看环境变量:
echo $PATH https://i-blog.csdnimg.cn/direct/1b96da1b67b94ce5824d3d76d74fb550.png
         这些路径就是bash默认查找的路径:当我们实行常用的体系指令的时候,bash会默认在这些路径中查找指令的程序文件:
           如果找到,则加载到内存中运行;
        如果没有找到的,则报错:
https://i-blog.csdnimg.cn/direct/e027f34102e14947bf8c5eecafddf917.png

         ls等这些体系指令是存储在/user/bin中的,如果我们想要让自己写的指令拥有与体系指令雷同的“待遇”,有如下两种方法:
方法一:
        把自己的可实行程序拷贝到user/ben目次中。这样虽然可以到达目的,但是着实不太明智,这会污染体系的指令集。
方法二:
        我们可以把自己的可实行程序的路径添加到bash默认查找的路径中;这就需要更改
PATH环境变量,对于PATH环境变量的更改,有如下两种方法:
   
PATH=(指定的目录)        这种方法会直接覆盖原来的默认路径。
PATH=$PATH:(指定的路径)        这种方法会追加在原来默认路径的后面。
         我们更改了默认的搜索路径之后,就可以不消指定当前目次而实行自己的指令了。
但是当我们再次登录服务器的时候,会发现PATH环境变量被改回去了。这是因为环境变量是最开始不是在内存中,而是在体系对应的配置文件中的。 当我们登录服务器,bash启动就会把配置文件信息读取到环境变量中去。
        这就是读取环境变量的配置文件: (默认是在每个人的工作目次: cd ~ 的目次中)
https://i-blog.csdnimg.cn/direct/7b78d48182fc4735a04f1c824cbc2ac4.png
            我们可以得出结论:环境变量是内存级的。
II,其他更多的环境变量及具体意义

           要查找全部的环境变量,就需要用到指令:
env         要查找某一特定的环境变量,需要用到指令:
echo $+环境变量名称         用第一个指令,查找全部的环境变量,会出现一大堆信息:
https://i-blog.csdnimg.cn/direct/18599a56a59c4ee586c0fbfc9b1dd5eb.png
        这一堆信息就是体系内部的(内存级)环境变量 ,是启动Bash的时候bash从配置文件中读取的。
        仔细看,发现一些环境变量:
           PATH:当前的目次
        HOME:当前登录用户的家目次
        SHELL:当前的SHELL,通常是/bin/bash
        PWD:当前的工作目次
        HISTSIZE:体系默认记载的历史指令数
             如果想要在这些环境变量中到场自己创建的变量,需要用到指令:
export name=value         如果想要删除已经创建的环境变量,需要用到指令: 
unset name III,整体明白环境变量体系

        过程一:体系文件中首先包含了环境变量,Bash在启动的时候会在磁盘中读取文件信息,把环境变量的信息加载到内存中,加载到内存中的环境变量就是我们寻常通过指令env查看到的环境变量。
        https://i-blog.csdnimg.cn/direct/2fa3b4bab2bb491e952c146fb4fa1b94.png
        过程二: 子进程是可以访问父进程的数据的,当我们创建一个子进程。我们写的进程通过父进程bash创建,那么我们在子进程中也固然可以访问父进程bash的环境变量数据!
https://i-blog.csdnimg.cn/direct/00283def5fa84612a65a498228608701.png
   想要访问父进程的环境变量数据,三种方法:
        1.通过main函数参数传递环境变量:
int main(int argc,char* argv[],char* env[])
{}(这是main函数的第三个参数,对于参数的传递的明白,上文有详解)
        2.通过extern 声明 变量 :
extern char** environ;        3.通过库函数
        在C语言的函数库stdlib.h中存在一个可以获取环境变量的函数getenv():
https://i-blog.csdnimg.cn/direct/b9ef071551bb43bbb1ce18f824106c52.png
        可以通过这个函数获取bash的环境变量。本质是根据环境变量的名称来查找匹配的变灵名称,并返回对应的变量值。
        这三种方式,无论是哪一种,都声明白一个指针数组,这个指针数组里存储的就是父进程的环境变量 。由于进程的独立性,子进程对这些环境变量的修改并不会影响到父进程。(甚至并不能被修改)
IV,环境变量和本地变量

        我们已经知道了如何声明自己的环境变量,与环境变量相干的还有一种变量:本地变量。
 声明环境变量的时候,需要加上export:
export name=value 而声明本地变量,则不需要加上export:
name=value  在声明本地变量之后,可以通过echo查询本地变量:
echo $变量名 但是本地变量不存在于环境变量表中,无法grep查询到。
想要将本地变量转化为环境变量,需要export再次声明:
export name  利用过程记载:https://i-blog.csdnimg.cn/direct/bfbc817656754b2ea0a4d65110b3e549.png
        本地变量与环境变量的区别是环境变量具有全局属性,可以被全部的子进程访问;而本地变量则无法被子进程访问。 
   内建指令:
        我们平时利用的指令,都是通过环境变量PATH来找到程序文件的位置的。但是对于特殊的命令,比如echo等在PATH变量被破坏时也可以正常利用。
        因为echo命令是内建命令,直接是一个可以被直接调用的函数,所以实行时不需要创建一个进程,本身就没有程序文件,自然不需要直到程序文件的位置。
完~
未经作者同意禁止转载 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: [Linux] Linux利用体系 进程的优先级 && 环境变量