[Linux] Linux操作系统 进程的优先级 环境变量

news/2024/9/28 12:57:43 标签: linux, 运维, 服务器, 环境变量

标题:[Linux] Linux操作系统 进程的优先级

个人主页@水墨不写bug

(图片来源于网络)

目录

一、进程优先级

1.PRI and NI

2.PRI vs NI 的补充理解

二、命令行参数和环境变量

1. 命令行参数

2.环境变量        

I,环境变量是内存级的 

II,其他更多的环境变量及具体意义

 III,整体理解环境变量系统

IV,环境变量和本地变量


正文开始:


一、进程优先级

基本概念

        进程的调用需要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值是进程优先级的修正修正数据


二、命令行参数和环境变量

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

         这些路径就是bash默认查找的路径:当我们执行常用的系统指令的时候,bash会默认在这些路径中查找指令的程序文件:

        如果找到,则加载到内存中运行;

        如果没有找到的,则报错:

         ls等这些系统指令是存储在/user/bin中的,如果我们想要让自己写的指令拥有与系统指令相同的“待遇”,有如下两种方法:

方法一:

        把自己的可执行程序拷贝到user/ben目录中。这样虽然可以达到目的,但是着实不太明智,这会污染系统的指令集。


方法二:

        我们可以把自己的可执行程序的路径添加到bash默认查找的路径中;这就需要更改

PATH环境变量,对于PATH环境变量的更改,有如下两种方法:

PATH=(指定的目录)

        这种方法会直接覆盖原来的默认路径。


PATH=$PATH:(指定的路径)

        这种方法会追加在原来默认路径的后面。

         我们更改了默认的搜索路径之后,就可以不用指定当前目录而执行自己的指令了。

但是当我们再次登录服务器的时候,会发现PATH环境变量被改回去了。这是因为环境变量是最开始不是在内存中,而是在系统对应的配置文件中的。 当我们登录服务器,bash启动就会把配置文件信息读取到环境变量中去。

        这就是读取环境变量的配置文件: (默认是在每个人的工作目录: cd ~ 的目录中)

         我们可以得出结论:环境变量是内存级的。

II,其他更多的环境变量及具体意义

        要查找所有的环境变量,就需要用到指令:

env

         要查找某一特定的环境变量,需要用到指令:

echo $+环境变量名称

         用第一个指令,查找所有的环境变量,会出现一大堆信息:

        这一堆信息就是系统内部的(内存级)环境变量 ,是启动Bash的时候bash从配置文件中读取的。

        仔细看,发现一些环境变量

        PATH:当前的目录

        HOME:当前登录用户的家目录

        SHELL:当前的SHELL,通常是/bin/bash

        PWD:当前的工作目录

        HISTSIZE:系统默认记录的历史指令数

         如果想要在这些环境变量中加入自己创建的变量,需要用到指令:

export name=value

         如果想要删除已经创建的环境变量,需要用到指令: 

unset name

 III,整体理解环境变量系统

        过程一:系统文件中首先包含了环境变量,Bash在启动的时候会在磁盘中读取文件信息,把环境变量的信息加载到内存中,加载到内存中的环境变量就是我们平常通过指令env查看到的环境变量

        

        过程二: 子进程是可以访问父进程的数据的,当我们创建一个子进程。我们写的进程通过父进程bash创建,那么我们在子进程中也当然可以访问父进程bash的环境变量数据!

想要访问父进程的环境变量数据,三种方法:

        1.通过main函数参数传递环境变量:

int main(int argc,char* argv[],char* env[])
{}

(这是main函数的第三个参数,对于参数的传递的理解,上文有详解)

        2.通过extern 声明 变量 :

extern char** environ;

        3.通过库函数

        在C语言的函数库stdlib.h中存在一个可以获取环境变量的函数getenv():

        可以通过这个函数获取bash的环境变量。本质是根据环境变量的名称来查找匹配的变灵名称,并返回对应的变量值。

        这三种方式,无论是哪一种,都声明了一个指针数组,这个指针数组里存储的就是父进程的环境变量 。由于进程的独立性,子进程对这些环境变量的修改并不会影响到父进程。(甚至并不能被修改)


IV,环境变量和本地变量

        我们已经知道了如何声明自己的环境变量,与环境变量相关的还有一种变量:本地变量。

 声明环境变量的时候,需要加上export:

export name=value

而声明本地变量,则不需要加上export:

name=value

 在声明本地变量之后,可以通过echo查询本地变量:

echo $变量名

但是本地变量不存在于环境变量表中,无法grep查询到。

想要将本地变量转化为环境变量,需要export再次声明:

export name

 操作过程记录:

        本地变量与环境变量的区别是环境变量具有全局属性,可以被所有的子进程访问;而本地变量则无法被子进程访问。 

内建指令:

        我们平时使用的指令,都是通过环境变量PATH来找到程序文件的位置的。但是对于特殊的命令,比如echo等在PATH变量被破坏时也可以正常使用。

        因为echo命令是内建命令,直接是一个可以被直接调用的函数,所以执行时不需要创建一个进程,本身就没有程序文件,自然不需要直到程序文件的位置。


完~

未经作者同意禁止转载 


http://www.niftyadmin.cn/n/5681148.html

相关文章

深度学习:迁移学习

目录 一、迁移学习 1.什么是迁移学习 2.迁移学习的步骤 1、选择预训练的模型和适当的层 2、冻结预训练模型的参数 3、在新数据集上训练新增加的层 4、微调预训练模型的层 5、评估和测试 二、迁移学习实例 1.导入模型 2.冻结模型参数 3.修改参数 4.创建类&#xff…

[element-ui]记录对el-table表头样式的一些处理

1、表头换行 & 列表项换行 可用element-table组件自带的方法实现列标题换行的效果 2、小圆点样式

MySQL 8.0.34 从C盘迁移到D盘

因为开始C盘够用,没注意mysql安装位置,如今C盘爆满,只能把mysql转移到D盘,以腾出更多的空间让我折腾。 一、关闭mysql服务 二、找到C盘MySQL安装文件和Data文件 1.找到C盘mysql bin文件目录安装文件路径: C:\Progra…

使用scroll-behavior属性实现页面平滑滚动的几个问题

在较长的页面中,为了便于用户浏览,开发人员经常会使用锚点链接,锚点链接默认的效果是瞬间跳转,为了让用户体验更好,往往会添加滚动效果。我记得要实现滚动效果,以前一般是结合一段JavaScript代码来实现。 后…

长效ip的特征除了稳定还有什么

长效IP(或持久IP)的特征除了稳定性之外,还包括以下几个方面: 可靠性:长效IP通常具有较低的掉线率,能够保持长时间的连接,适合需要持续访问的应用场景。 较低的被封锁风险:由于其使用…

数据结构及基本算法

目录 第一章 概论 第一节 引言 第二节 基本概念和常用术语 第三节 算法的描述与分析 第二章 线性表 第一节 线性表定义和基本运算个 一、线性表的逻辑定义 二、线性表的基本运算 第二节 线性表的顺序存储和基本运算的实现 一、线性表的顺序存储 二、顺序表上基本运算…

C++入门(2)--引用

6.引用 引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。 类型& 引用变量名(对象名) 引用实体; //引用 //类型& 引用变量名(对象名) 引…

Ruby基础语法

Ruby 是一种动态、反射和面向对象的编程语言,它以其简洁的语法和强大的功能而受到许多开发者的喜爱。以下是 Ruby 语言的一些基本语法: 1. 打印输出 puts "Hello, Ruby!" 变量赋值 x 10 name "John" 2. 数据类型 Ruby 有多种…