当前位置: 首页 > news >正文

【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值了。
    PRI(new)=PRI(old)+nicePRI(new)=PRI(old)+nicePRI(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()函数的命令行参数!

相关文章:

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

进程优先级 环境变量 一、进程优先级1、基本概念2、查看以及修改系统进程的优先级3、一些其他的关于进程优先级的指令和函数调用4、与进程优先级有关的一些进程性质二、环境变量1、基本概念2、和环境变量相关的命令3、Linux中的常见环境变量介绍4、环境变量的组织方式以及在C代…...

UE实现建筑分层抽屉展示效果

文章目录 1.实现目标2.实现过程2.1 基础设置2.2 核心函数3.参考资料1.实现目标 使用时间轴对建筑楼层的位置偏移进行控制,实现分层抽屉的动画展示效果。 2.实现过程 建筑抽屉的实现原理比较简单,即对Actor的位置进行偏移,计算并更新其世界位置即可。这里还是基于ArchVizExp…...

【C语言进阶:刨根究底字符串函数】 strstr 函数

本节重点内容&#xff1a; 深入理解strstr函数的使用学会strstr函数的模拟实现⚡strstr strstr的基本使用&#xff1a; #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include<string.h>int main() {char arr1[] "abcdebcdef";char arr2[] &…...

SpringBoot实战(十二)集成Actuator

目录一、简介二、Maven依赖三、使用入门1.HTTP 方式访问端点2.JMX 方式访问端点3.端点信息整理4.端点的启用与禁用5.端点的公开6.保护 HTTP 端点7.配置 CORS 跨域官方文档&#xff1a; https://docs.spring.io/spring-boot/docs/2.4.5/reference/htmlsingle/#production-ready …...

学习系统编程No.7【进程替换】

引言&#xff1a; 北京时间&#xff1a;2023/3/21/7:17&#xff0c;这篇博客本来昨天晚上就能开始写的&#xff0c;但是由于笔试强训的原因&#xff0c;导致时间用在了做题上&#xff0c;通过快2个小时的垂死挣扎&#xff0c;我充分意识到了自己做题能力的缺陷和运用新知识的缺…...

【3.22】操作系统内存管理(整理)、Java并发

3. 内存管理 为什么要有虚拟内存&#xff1f; 我们想要同时在内存中运行多个程序&#xff0c;就需要把进程所使用的地址隔离&#xff0c;所以使用了虚拟内存。简单来说&#xff0c;虚拟内存地址是程序使用的内存地址。物理内存地址是实际存在硬件里面的地址。 操作系统为每个…...

电脑文件丢失怎么找回来

电脑文件丢失怎么找回来?最近打开电脑时&#xff0c;它启动得很慢。刚刚开始我没有没在意&#xff0c;就重启了当我再次打开电脑时&#xff0c;发现桌面上的文件消失了&#xff0c;面对这种意外情况&#xff0c;有什么办法可以快速找到呢? 电脑文件丢失后&#xff0c;想要找回…...

Python(白银时代)——面向对象

基本概念 面向过程 是早期的一个编程概念&#xff0c;类似函数&#xff0c;但是没有返回值 具体做法&#xff1a; 把完成某个需求的所有步骤&#xff0c;从头到尾 逐步实现 将某些功能独立的代码 封装成一个又一个 函数 然后顺序调用不同的函数 特点&#xff1a; 注重 步骤…...

Python流星雨代码

前言 用Python画场流星雨看看&#xff0c;源码见文末公众号哈。 流星类 def __init__(self): self.r ra.randint(50,100) self.t ra.randint(1,3) self.x ra.randint(-2000,1000) #流星的横坐标 self.y ra.randint(0,500) #流星…...

Java语言-----类与对象的秘密

目录 前言 一、类与对象的介绍 二、类的实例化 三.类与对象的使用方法 3.1对象的初始化 3.2内存显示图 四.this的使用方法 总结 &#x1f63d;个人主页&#xff1a; tq02的博客_CSDN博客-C语言,Java领域博主 &#x1f308;理想目标&#xff1a;努力学习&#xff0c;向Java进…...

大数据处理学习笔记2.1 初识Spark

文章目录零、本节学习目标一、Spark的概述&#xff08;一&#xff09;Spark的组件1、Spark Core2、Spark SQL3、Spark Streaming4、MLlib5、Graph X6、独立调度器、Yarn、Mesos&#xff08;二&#xff09;Spark的发展史1、发展简史2、目前最新版本二、Spark的特点&#xff08;一…...

太强了,英伟达面对ChatGPT还有这一招...

大家好&#xff0c;我是 Jack。 今年可谓是 AI 元年&#xff0c;ChatGPT、AIGC、VITS 都火了一波。 我也先后发布了这几期视频&#xff1a; 这是一个大模型的时代&#xff0c;AI 能在文本、图像、音频等领域大放异彩&#xff0c;得益于大模型。而想要预训练大模型&#xff0c…...

【微服务】—— Nacos注册中心

文章目录一、Nacos 注册中心的设计原理1、数据模型2、数据⼀致性3、负载均衡4、健康检查二、Nacos 注册中心服务数据模型1、服务&#xff08;Service&#xff09;和服务实例&#xff08;Instance&#xff09;1&#xff09;定义服务2&#xff09;服务元数据3&#xff09;定义实例…...

GPT-4是个编程高手,真服了!

上周给大家发了一个GPT-4教数学的介绍&#xff0c;很多人都被震撼了&#xff0c;感觉有可能在教育行业引发革命。它在编程领域表现如何&#xff1f;先不说能否替代程序员&#xff0c;这个还有待更多的测试和反馈&#xff0c;我想先试试它能不能像教数学那样教编程。我找了个Jav…...

基于深度学习的车型识别系统(Python+清新界面+数据集)

摘要&#xff1a;基于深度学习的车型识别系统用于识别不同类型的车辆&#xff0c;应用YOLO V5算法根据不同尺寸大小区分和检测车辆&#xff0c;并统计各类型数量以辅助智能交通管理。本文详细介绍车型识别系统&#xff0c;在介绍算法原理的同时&#xff0c;给出Python的实现代码…...

【蓝桥杯C++】3月21日刷题集训ABC-附百分代码,一目了然

目录 刷题集训 A Day 1 成绩分析 Day 1 饮料换购 刷题集训 B Day 1 分巧克力 Day 1 递增三元组 Day 1 小明的衣服 刷题集训 C Day 1 数字三角形 Day 1 跳跃 Day 1 蓝太子序列 刷题集训 A Day 1 成绩分析 题目描述 小蓝给学生…...

HBase高手之路4-Shell操作

文章目录HBase高手之路3—HBase的shell操作一、hbase的shell命令汇总二、需求三、表的操作1&#xff0e;进入shell命令行2&#xff0e;创建表3&#xff0e;查看表的定义4&#xff0e;列出所有的表5&#xff0e;删除表1)禁用表2)启用表3)删除表四、数据的操作1&#xff0e;添加数…...

聊聊SQL审计功能

什么是sql审计SQL审计是指对SQL语句的执行情况进行记录和追踪&#xff0c;包括SQL语句的执行时间、执行次数、执行结果等信息。通过SQL审计&#xff0c;可以对数据库的使用情况进行监控和管理&#xff0c;包括对SQL注入、非法访问、数据泄露等安全问题的检测和防范&#xff0c;…...

Markdown常用语法(字体颜色)

一些不错的帖子 写CSDN博客时&#xff0c;调节字体大小、颜色及其他样式的常用操作方法 设置字体颜色 使用<font>标记&#xff1a; 这是红色字体&#xff1a;<font colorred>我是红色的字体</font>显示效果如下&#xff1a; 这是红色字体&#xff1a;我是…...

I2C模块理解

I2C模块理解 文章目录I2C模块理解1.配置I2C2.信号3.数据传输3.1主机发送3.2主机接收3.3从机发送3.4从机接收4.中断传输5.Aardvark1.配置I2C I2C的特征 只需要两条公共总线&#xff08;线&#xff09;即可控制I2C网络上的任何设备无需像UART通信那样事先约定数据传输速率。因此…...

手把手教你使用--常用模块--HC05蓝牙模块,无线蓝牙串口透传模块,(实例:手机蓝牙控制STM32单片机点亮LED灯)

最近在学STM32&#xff0c;基本的学完了&#xff0c;想学几个模块来巩固一下知识&#xff0c;就想到了蓝牙模块。玩啥好难过有很多博客教怎么连的&#xff0c;但自己看起来还是有点糊涂。模块的原理和知识点我就不讲解了&#xff0c;这里我主要手把手记录一下我是如何对蓝牙模块…...

MyBatis高频面试题

目录 1、Mybatis中#和$的区别 2、Mybatis的编程步骤是什么样的 3...

Redis基础篇

redis的三大特点&#xff1a; 支持多数据类型&#xff0c;支持持久化&#xff0c;单线程 多路IO复用 对键操作的命令&#xff1a; keys * 查看当前库所有key exists key 判断key是否存在 del key 删除 unlink key 非阻塞删除&#xff0c;异步删除 expire key …...

unity的C#学习——静态常量和动态常量的定义与使用

定义常量 在C#中&#xff0c;常量是一种不可改变的量&#xff0c;一旦被定义&#xff0c;其值就不能被修改。C#中有两种类型的常量&#xff0c;静态常量和动态常量。 1、静态常量的定义 静态常量是在编译时就已经确定其值的常量&#xff0c;使用const关键字定义。由于在编译…...

栈----数据结构

栈&#x1f506;栈的概念&#x1f506;栈的结构&#x1f506;栈的实现&#x1f506;括号匹配问题&#x1f506;结语&#x1f506;栈的概念 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。**进行数据插入和删除操作的一端称为栈顶&am…...

【人人都能读标准】11. 原理篇总结:一个程序的完整执行过程

本文为《人人都能读标准》—— ECMAScript篇的第11篇。我在这个仓库中系统地介绍了标准的阅读规则以及使用方式&#xff0c;并深入剖析了标准对JavaScript核心原理的描述。 我们一路走了很远很远&#xff0c;终于到了本书原理篇的最后一站。 在原理篇中&#xff0c;我们先讲了…...

sheng的学习笔记-IO多路复用,NIO,BIO,AIO

基础概念IO分为几种&#xff1a;同步阻塞的BIO&#xff0c;同步非阻塞的NIO&#xff0c;异步非阻塞AIO&#xff0c;IO多路复用&#xff0c;信号驱动IO&#xff08;不常用&#xff09;对于一个network IO&#xff0c;它会涉及到两个系统对象&#xff0c;一个是调用这个IO的proce…...

【Python入门第三十五天】Python丨文件打开

在服务器上打开文件 假设我们有以下文件&#xff0c;位于与 Python 相同的文件夹中。 demofile.txt Hello! Welcome to demofile.txt This file is for testing purposes. Good Luck!如需打开文件&#xff0c;请使用内建的 open() 函数。 open() 函数返回文件对象&#xff…...

jsoup 框架的使用指南

概述 参考&#xff1a; 官方文档jsoup的使用JSoup教程jsoup 在 GitHub 的开源代码 概念简介 jsoup 是一款基于 Java 的 HTML 解析器&#xff0c;它提供了一套非常省力的 API&#xff0c;不但能直接解析某个 URL 地址、HTML 文本内容&#xff0c;而且还能通过类似于 DOM、CS…...

web前端开发和后端开发哪个难度大?

前言 因为涉及到的具体的应用的领域不同&#xff0c;所以说不能简单地说哪一个难&#xff0c;对于前端而言你会感觉到入门会非常的简单&#xff0c;这也是会给许多人一种错觉&#xff0c;前端很简单&#xff0c;但是只能说是在入门理解上是有利于新手的&#xff0c;前端在主要…...