【Linux】进程优先级 环境变量

进程优先级 环境变量

  • 一、进程优先级
    • 1、基本概念
    • 2、查看以及修改系统进程的优先级
    • 3、一些其他的关于进程优先级的指令和函数调用
    • 4、与进程优先级有关的一些进程性质
  • 二、环境变量
    • 1、基本概念
    • 2、和环境变量相关的命令
    • 3、Linux中的常见环境变量介绍
    • 4、环境变量的组织方式以及在C代码中如何获取环境变量
    • 5、不同用户的环境变量是怎么形成的
    • 6、main()函数的命令行参数


一、进程优先级

1、基本概念

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

2、查看以及修改系统进程的优先级

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

  • UID : 代表执行者的身份
  • PID : 代表这个进程的代号
  • PPID :代表这个进程是由哪个进程发展衍生而来的,亦即父进程的代号
  • PRI :代表这个进程可被执行的优先级,其值越小越早被执行
  • NI :代表这个进程的nice值,其表示进程可被执行的优先级的修正数值。
    在这里插入图片描述
    我们看到我们现在有两个进程 bash ps 它们的进程优先级都是80,如果我们要修改它们的优先级就要用到NI的nice值了。
    P R I ( n e w ) = P R I ( o l d ) + n i c e PRI(new)=PRI(old)+nice PRI(new)=PRI(old)+nice

从这个公式中我们知道 新的PRI = 老的PRI + nice值,但是这个老的PRI的值是指PRI最初的默认值,例如上面的bash ps 是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] identifier

  -g,后面加组的 pgid,改变一个组的进程优先级
  -u,后面加user name 或 uid,改变一个用户所拥有的进程优先级。
   -p, 后面加pid ,改变一个进程的进程优先级。

在这里插入图片描述

使用renice命令

在这里插入图片描述

  • 函数调用
    在Linux中关于改变进程优先级函数调用主要有两个:getpriority()setpriority(),具体的详细使用在这里我们就不做介绍了,如果你有兴趣可以看我【Linux】专栏里面的另一篇关于getpriority()setpriority()的讲解。

4、与进程优先级有关的一些进程性质

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

二、环境变量

1、基本概念

  • 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数,环境变量通常具有某些特殊用途,在系统当中通常具有全局特性。

如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。

2、和环境变量相关的命令

  1. env: 显示所有环境变量
    在这里插入图片描述

  2. echo: 显示的变量值(需要带上 $ 符号)
    在这里插入图片描述

  3. export: 设置一个新的环境变量,或者将本地变量提升成环境变量。
    在这里插入图片描述

  4. unset: 清除环境变量
    在这里插入图片描述

  5. set: 显示本地定义的shell变量和环境变量
    在这里插入图片描述

3、Linux中的常见环境变量介绍

  • PATH : 指定命令的搜索路径
    例如我们使用的Linux中 ls pwd命令,其实就是一个个C语言写的一个个小程序,为什么我们运行自己写的程序就要用./ + 自己的程序名 ,而我们运行ls pwd 从来不加./,这就和环境变量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<stdio.h>    
#include<stdlib.h>   
int main()
{
    char* env =  getenv("USER");//USER是环境变量
    if(env == NULL)
    {
        perror("getenv fail:");
    }
    printf("%s\n",env);
    return 0;
}

代码输出结果
在这里插入图片描述
我们在代码里面多出来的USER变量就是来自Shell传递给我们的test1c进程的环境变量!
2. main()函数参数获得环境变量
此外我们我们还可以用main函数的参数来获得所有环境变量的地址,通过地址我们也能遍历所有环境变量

函数原型

int main(int argc, char *argv[]char *envp[]);

在这里我们先不谈论函数的参数 argc *argv[],我们来谈论第三个参数!其中*envp[]是一个字符数组指针,指向的是一个指针数组,数组名代表首元素的地址,首元素是一个字符指针,*envp[]刚好又是指向首元素的指针,故其实*envp[]其实是一个二级指针!

在这里插入图片描述

明白了这些,我们来看下面一段代码:

#include<stdio.h>
int main(int argc, int *argv[], int *envp[])
{
    for(int i =0; envp[i] != NULL ; ++i)
    {
       //打印所有环境变量,相当于 env 命令!
        printf("envp[%d]-->%s\n", i, envp[i]);
    }
    return 0;
}

在这里插入图片描述
可以看到我们确实打印出了所有的环境变量,而且这个环境变量来自于其父进程bash。

3. C语言全局变量environ获得环境变量

变量详情:

在这里插入图片描述
environ变量是一个二级指针与main()函数参数的char *envp[]类似。遍历所有环境变量也可以这样写:

#include<stdio.h>        
#include<unistd.h>                                                                                                                                          int main()
{
    extern char** environ;
    for(int i =0; environ[i] != NULL; ++i)
    {
        printf("environ[%d]-->%s\n", i, environ[i]);
    }
    return 0;
}

在这里插入图片描述

5、不同用户的环境变量是怎么形成的

通过上面的讲解我们知道了环境变量的概念与作用,环境变量中的每一个,都有自己的用途:有的是进行路径查找的,有的时进行身份认证的,有的时进行动态库查找的,有的是用来进行确认当前路径等等每一个环境变量都有自己的特定应用场景。

我们也知道为什么,对于不同的用户其环境变量也并不相同,例如我们上面的root用户的环境变量与pan的环境变量有的一样有的不一样,那么Linux是怎样形成不同的环境变量的呢?

这里先给出结论:环境变量本质就是一个内存级的一张表,这张表由用户在登陆会统的时候,给特定用户形成属于自己的环境变量表

在我们的家目录下有两个文件叫 .bashrc .bash_profile根目录下有一个bashrc的文件
在这里插入图片描述

打开这些文件看看!

在这里插入图片描述
在这里插入图片描述

6、main()函数的命令行参数

在前面我们谈论中我们说到过main()函数的参数问题,我们还有两个参数没有谈论int argc char *argv[]。现在我们来讨论它们!

由于C语言中无法传递整个数组,所以在函数中想要获得数组元素的个数必须在传参时就要提前传递好,于是其中int argc 就是char *argv[]数组指针指向的数组的有效元素个数,不包含NULL

这个char *argv[]是一个数组指针,其指向的数组里面存放的都是char *的指针,这些char *的指针指向的内容需要我们使用命令行的方式进行设置。

我们先看下面一段代码:

#include<stdio.h>    
int main(int argc, int *argv[])
{
     printf("argc = %d\n",argc);
     for(int i = 0; argv[i] != NULL; ++i)
    {
        printf("argv[%d]-->%s\n", i, argv[i]);
    }
    return 0;
}

运行结果:

在这里插入图片描述

在这里插入图片描述

我们Linux中ls命令有许多参数如-a -l -d -nls本质上就是C语言写的一个程序,它为什么能根据不同的参数执行不同的功能就是因为使用了mian()函数的命令行参数!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/2389.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

人脸识别经典网络-MTCNN(含Python源码实现)

人脸检测-mtcnn 本文参加新星计划人工智能赛道&#xff1a;https://bbs.csdn.net/topics/613989052 文章目录人脸检测-mtcnn1. 人脸检测1.1 人脸检测概述1.2 人脸检测的难点1.3 人脸检测的应用场景2. mtcnn2.1 mtcnn概述2.2 mtcnn的网络结构2.3 图像金字塔2.4 P-Net2.5 R-Net2…

蓝桥杯刷题冲刺 | 倒计时20天

作者&#xff1a;指针不指南吗 专栏&#xff1a;蓝桥杯倒计时冲刺 &#x1f43e;马上就要蓝桥杯了&#xff0c;最后的这几天尤为重要&#xff0c;不可懈怠哦&#x1f43e; 文章目录1.铁路与公路2.数字反转3.奖学金4.求阶乘1.铁路与公路 题目 链接&#xff1a; 4074. 铁路与公路…

论文阅读《Point NeRF:Point-based Neural Radiance Fileds》

论文地址&#xff1a;https://arxiv.org/abs/2201.08845 源码地址&#xff1a;https://xharlie.github.io/projects/project_sites/pointnerf 概述 体素神经渲染的方法生成高质量的结果非常耗时&#xff0c;且对不同场景需要重新训练&#xff08;模型不具备泛化能力&#xff09…

多线程 (六) wait和notify

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了 博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点!人生格言&#xff1a;当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友一起加油喔&#x1f9be;&am…

Qt实践项目:仿Everything软件实现一个QtEverything

⭐️我叫忆_恒心&#xff0c;一名喜欢书写博客的在读研究生&#x1f468;‍&#x1f393;。 如果觉得本文能帮到您&#xff0c;麻烦点个赞&#x1f44d;呗&#xff01; 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧&#xff0c;喜欢的小伙伴给个三…

九【springboot】

Springboot一 Spring Boot是什么二 SpringBoot的特点1.独立运行的spring项目三 配置开发环境四 配置开发环境五 创建 Spring Boot 项目1.在 IntelliJ IDEA 欢迎页面左侧选择 Project &#xff0c;然后在右侧选择 New Project&#xff0c;如下图2.在新建工程界面左侧&#xff0c…

GPT-4来了!看看她究竟强在哪里!

GPT-4来了&#xff01;OpenAI老板Sam Altman直接开门见山地介绍说&#xff1a;这是我们迄今为止功能最强大的模型&#xff01;GPT-4是一个超大的多模态模型&#xff0c;也就是说&#xff0c;它的输入可以是文字&#xff08;上限2.5万字&#xff09;&#xff0c;还可以是图像。我…

【洛谷刷题】蓝桥杯专题突破-深度优先搜索-dfs(7)

目录 写在前面&#xff1a; 题目&#xff1a;P1596 [USACO10OCT]Lake Counting S - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目描述&#xff1a; 输入格式&#xff1a; 输出格式&#xff1a; 输入样例&#xff1a; 输出样例&#xff1a; 解题思路&#xff1a; …

list底层的简单实现(万字长文详解!)

list底层的简单实现 文章目录list底层的简单实现list_node的实现&#xff01;list_node的构造函数list的迭代器&#xff01;——重点&#xff01;list迭代器的成员变量迭代器的构造函数* 重载前置 重载后置 重载前置-- 重载后置-- 重载! 重载 重载-- 重载list的const迭代器——…

提高曝光率:外贸网站如何充分利用谷歌优化赢得客户

自从我从事外贸行业以来&#xff0c;谷歌优化一直是我关注的重点。 作为一个外贸从业者&#xff0c;我深知提高网站在谷歌搜索引擎中的排名对企业的重要性。 那么&#xff0c;如何利用谷歌优化来提高外贸网站的曝光率&#xff0c;从而赢得更多客户呢&#xff1f; 以下是我在…

单例模式,饿汉与懒汉

文章目录什么是单例模式单例模式的两种形式饿汉模式懒汉模式懒汉模式与饿汉模式是否线程安全懒汉模式的优化什么是单例模式 单例模式其实就是一种设计模式&#xff0c;跟象棋的棋谱一样&#xff0c;给出一些固定的套路帮助你更好的完成代码。设计模式有很多种&#xff0c;单例…

Ubuntu-C语言下的应用

文章目录一、Ubuntu下C语言的应用&#xff08;一&#xff09;如何使用gedit创建/打开/保存/关闭文件&#xff08;二&#xff09;gedit中相关参数配置&#xff1a;首选项&#xff08;三&#xff09;ubuntu下C语言的编译器 -- gcc一、Ubuntu下C语言的应用 &#xff08;一&#x…

GPIO四种输入和四种输出模式

GPIO的结构图如下所示&#xff1a; 最右端为I/O引脚&#xff0c;左端的器件位于芯片内部。I/O引脚并联了两个用于保护的二极管。 输入模式 从I/O引脚进来就遇到了两个开关和电阻&#xff0c;与VDD相连的为上拉电阻&#xff0c;与VSS相连的为下拉电阻。再连接到TTL施密特触发…

机器学习算法——决策树详解

文章目录前言&#xff1a;决策树的定义熵和信息熵的相关概念信息熵的简单理解经典的决策树算法ID3算法划分选择或划分标准——信息增益ID3算法的优缺点C4.5算法信息增益率划分选择或划分标准——Gini系数&#xff08;CART算法&#xff09;Gini系数计算举例CART算法的优缺点其他…

RK3588平台开发系列讲解(显示篇)DP显示调试方法

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、查看 connector 状态二、强制使能/禁⽤ DP三、DPCP 读写四、Type-C 接口 Debug五、查看 DP 寄存器六、查看 VOP 状态七、查看当前显示时钟八、调整 DRM log 等级沉淀、分享、成长,让自己和他人都能有所收获!😄…

C++成神之路 | 第一课【步入C++的世界】

目录 一、认识C++ 1.1、关于 C++ 1.2、C++的前世今生 1.2.1、C+

【分享NVIDIA GTC大会干货】与Jetson嵌入式平台工程师的深度挖掘问答

Connect with the Experts: A Deep-Dive Q&A with Jetson Embedded Platform Engineers [CWES52132]NVIDIA Jetson 是世界领先的边缘人工智能计算平台。它具有高性能和低功耗的特点&#xff0c;是机器人、无人机、移动医疗成像和智能视频分析等计算密集型嵌入式应用的理想选…

【蓝桥杯集训·每日一题】AcWing 1051. 最大的和

文章目录一、题目1、原题链接2、题目描述二、解题报告1、思路分析2、时间复杂度3、代码详解三、知识风暴线性DP一、题目 1、原题链接 1051. 最大的和 2、题目描述 对于给定的整数序列 A{a1,a2,…,an}&#xff0c;找出两个不重合连续子段&#xff0c;使得两子段中所有数字的和最…

半入耳式蓝牙耳机哪款音质好?音质最好的半入耳蓝牙耳机推荐

蓝牙耳机分为头戴式、入耳式和半入耳式三种&#xff0c;大多数人都会选择入耳式和半入耳式&#xff0c;因为它的体积小&#xff0c;重量轻&#xff0c;更适合于随身携带。半入耳式采用了平头塞设计&#xff0c;大部分都位于耳道之外&#xff0c;所以戴起来更加舒适&#xff0c;…

【kubernetes云原生】k8s标签选择器使用详解

目录 一、标签选择器来源 二、什么是标签选择器 2.1 标签选择器概述 2.2 标签选择器概述属性 三、标签使用场景 四、标签选择器特点 4.1 基本特点 4.2 核心标签选择器 4.3 补充说明 五、标签选择器常用操作命令 5.1 前置准备 5.2 常用操作命令 5.2.1 查看namespac…