Linux进程(二)---进程的优先级和环境变量

我想在这先完成上一章的一个未说完的话题.最后一个我们讲到了僵尸进程,是指子进程已经结束,但是父进程还在运行没有来得及回收.此时这个子进程便是僵尸进程.

但是如果父进程运行完了,也没有回收就直接结束了,那这个子进程改由谁维护呢?

此时孤儿进程会被1号init进程领养,当然要由init进程回收。

这个尾巴说完了,我们开始进入正题:

目录

进程的优先级

基本概念

查看进程优先级

PRI 和 NI

如何调整进程的优先级

PRI和NI区别

其它概念

竞争性

独立性

并行

并发

上下文

环境变量

概念

问题引入

常见环境变量

PATH

查看环境变量方法

导入PATH环境变量

HOME

SHELL

和环境变量相关的命令

环境变量的组织方式

获取环境变量

通过代码获取环境变量

通过系统调用获取或设置环境变量

环境变量通常具有全局属性

命令行参数


进程的优先级

基本概念

1.CPU分配资源的的先后顺序,就是指进程的优先权。

2.优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用,可以改善系统性能.

3.还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整体性能。

一句话:进程优先级是确认谁先得到资源,谁后得到资源.

那么为什么要有优先级呢?

本质是因为CPU有限,而进程太多.

进程太多,需要通过某种方式竞争资源.用例子来说:我们排队买票,军人可以享有优先权,普通人排队,这里军人的优先级就是比较高的.

在计算机中,我们可以用一些数据来表明优先级,只有优先级还不够,还得有评判,例如你在你们学校第一名,把你们放到孤岛上也没人在意你是年级第几,只有在学校,老师,领导才会根据这些成绩评判你,这样才有效.

这些评判优先级大小的叫做调度器.这个优先级便是我们的调度指标.优先级高的会先被调度到CPU执行.

查看进程优先级

先说结论:Linux下优先级具体的做法是:

优先级 = 老的优先级 + nice值.后面会说明这个.

我们先写一段程序.

 

然后老操作,一边执行,一边监视

 发现我们进程也会有两个属性,ps -al是显示更详细的进程信息.

其中PRI代表这个进程可被执行的优先级,其值越小越早被执行.

NI代表nice值.

 我们将分别介绍一下它们.

PRI 和 NI

关于PRI和NI,我们需要知道下面几个点.

1.PRI也还是比较好理解的,即进程的优先级,或者通俗点说就是程序被CPU执行的先后顺序,PRI值越小进程的优先级别越高.

2.NI就是我们所说的nice值了,其表示进程可被执行的优先级的修正数值.

3.PRI值越小越快被执行,那么加入nice值后,将会使得PRI变为:PRI(new)=PRI(old)+nice.

4.这样,当nice值为负值的时候,那么该进程将会优先级值将变小,即其优先级会变高,则其越快被执行
5.所以,调整进程优先级,在Linux下,就是调整进程nice值
6.nice其取值范围是-20至19,一共40个级别

如何调整进程的优先级

上面也说了,调整进程的优先级就是调整nice值.如何调整呢?

首先输入top指令,然后再按下‘r键.

 会出现这么一句话,提示你输入要修改nice值的进程.

 

 我们刚才运行进程的pid是23494,因此我们输入23494.

 之后让我们输入nice值,我们输入15,此时的进程优先级应为之前的80+15=95.

我们再来看一下:

 发现进程优先级确实如我们所想的,成为了95,NI值此时是我们调整的值15.

需要注意的是,每次调整都是以80为基准值开始调整,而不会受当前PRI值影响.

我们此时输入-15

 它不会95-15而变成80,而是从80开始,80-15=65.

这结果正如我们所说的. 

PRI和NI区别

PRI是进程的优先级,NI(nice)值是进程优先级的修正数据

进程的nice值不是进程的优先级,他们不是一个概念,但是进程nice值会影响到进程的优先级变化。

其它概念

竞争性

竞争性: 系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级.

独立性

独立性: 多进程运行,需要独享各种资源,多进程运行期间互不干扰.比如浏览器挂了不会影响qq的正常使用.子进程挂了不会影响父进程,父进程挂了不会影响子进程.

并行

并行: 多个进程在多个CPU下分别,同时进行运行,这称之为并行.

 

并发

并发: 多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发.

这里大家有没有这样一个疑惑:并发采用进程切换的方式,那如果这个进程没有执行完,你切换到别的进程了,那么下次再切回来这个进程的时候,它从哪开始呢?从头开始?那效率太低了吧,我们想的应该是从原来的位置开始,那么CPU是怎么知道上一次执行到哪了呢?

上下文

这里先说一个现象:如果进程A正在被运行,那么CPU的寄存器里面,一定保存的是进程A的临时数据!这些临时数据,称为A的上下文,包括函数最后一次返回值是什么,运行状态,运行位置等等.

所以当进程A暂时被切换下来的时候,需要进程A顺便带走自己的上下文数据,相当于保存到进程A中.

暂时保存的目的:一定是为了下次再拿出来,能恢复上去,就能按照之前的逻辑继续向后运行,就如同没有被中断过一样.

CPU内的寄存器只有一份,但是上下文有多份,分别对应不同的进程!每次寄存器只能读取一份上下文.

环境变量

概念

环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数.
如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。
环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性.

问题引入

大家有没有注意过这样的现象:

我们运行的自己写可执行程序需要加上./(即当前路径),而像ls,touch,rm这些命令执行的时候不需要加./ ,当然如果加上它的路径也可以.

 

 ls这些命令和我们写的唯一的不同点是:一个是我们自己写的,一个系统自带的命令,由于系统已经配置好了环境变量,所以才可以不用加路径直接运行.

现在知道这是环境变量的作用即可,后面讲完就会明白.

常见环境变量

PATH

查看环境变量方法

echo $PATH

 注意它们之间的路径是以:为分隔符.

当我们输入ls的时候,系统会先从第一个路径查找,如果有就直接执行,如果没有,继续向后查找,直至找到,如果找完了都没有,那么就会报错,command not found,命令没有找到.

所以想要我们的命令执行也可以不用加路径,我们可以把我们写的可执行程序写到这些PATH路径中,但是我们不建议这样做,因为会污染别人已经写好的命令池.

所以我们可以把我们写的放到环境变量中,相当于是单独一个.

导入PATH环境变量

输入指令:

export PATH=$PATH:/home/liqi/process

里面这个:后面的是你可执行文件的路径,可以使用pwd查看

然后我们再次查看环境变量.

 

发现已经成功导入了.

我们此时便可以直接运行process下的可执行程序了.

 

 当你退出登录重新进入的时候,环境变量又会初始化到最初的状态.

HOME

会记录显示当前用户的家目录.


所以之前说的cd ~,进入自己的家目录,实则是根据这个HOME进行的.

SHELL

显示当前的shell,通常是/bin/bash.

 

和环境变量相关的命令

1. echo: 显示某个环境变量值
2. export: 设置一个新的环境变量
3. env: 显示所有环境变量
4. unset: 清除环境变量
5. set: 显示本地定义的shell变量和环境变量

环境变量的组织方式

每个程序都会收到一张环境表,环境表是一个字符指针数组,每个指针指向一个以’\0’结尾的环境字符串

 

获取环境变量

通过代码获取环境变量

实际上,我们main函数有三个参数,int argc, char* argv[],这两个是命令行参数,稍后会讲.

char* env[]是环境变量参数.

这个是一个指针数组,就是我们上一部分的那张表.

我们可以写下面一段程序:

 

然后退出,make编译,然后运行

 

可以发现,这样就把所有的环境变量输出出来了. 

通过系统调用获取或设置环境变量

有两个接口:

putenv,是用来设置,后面会讲

getenv,获取环境变量.

例如我们想获得PATH环境变量.

输入代码:

 

然后make编译运行:

把PATH换成HOME:

 

同样地,也输出了出来. 

 我们有没有这么一个问题,是谁把这些环境变量导入到这些变量里呢?

其实是继承了父进程的环境变量,默认所有的环境变量都会被子进程继承。父进程正是我们的bash,这是一个简单的进程替换,后面会讲解.

这也另外说明了一个事实:环境变量具有全局属性

因为它可以被很多子进程拿到访问到.

环境变量通常具有全局属性

我们做个实验来证明它:

 我们把环境变量名改成了myenv.

可以发现什么都没有还出现了段错误.

此时我们再导入一个名为myenv的环境变量 .

export myenv="hello,world"

 此时bash已经有了myenv这个环境变量.而运行一个程序需要先创建一个子进程,子进程也会继承父进程.正是由于环境变量具有全局属性

此时我们再次make编译运行,便发现已经成功输出了这个环境变量.

这说明了两件事情:

1.子进程的环境变量是从父进程来的.

2.默认所有的环境变量都会被子进程继承(环境变量具有全局属性).

那么子进程的子进程也会继承子进程的环境变量

命令行参数

这个作为一个附加内容.

刚才我们讲解环境变量的时候说了,main()函数有三个参数,最后一个参数我们说了,那么还有前两个参数,这两个参数便叫做命令行参数.

我们写程序看看这是个什么东西.

 

 我们发现,它其实是把我们输入的选项作为参数传入到了argv中,具体有多少,是由argc决定的.

这些命令行参数这有什么意义呢?

最大的功能是:让同一个程序,通过不同的选项,使用不同的子功能!

例如ls -a,ls -a 或者ls -a -l都是如此.

这些内部都是命令行参数完成的.

或者我们自己实现一个简易的

会是如下的场景:

 

 所以这便是命令行参数的真正用法.

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用html+javascript打造公文一键排版系统3:获取参数设置、公文标题排版

我们用自定义函数setDocFmt()来实现对公文的排版。 一、获取公文参数值 要对公文进行排版,首先要读取公文“参数设置”区中的参数值。比如公文要求对公文标题的一般规定是:一般用2号小标宋体字,居中显示。标题与正文中间空一行。 这些是“参…

Python控制流程盘点及高级用法、神秘技巧大揭秘!

目录 一、条件语句(If-Elif-Else) 二、循环结构(For和While) 三、异常处理(Try-Except) 四、控制流程的高级用法! 1. 列表解析 2. 生成器表达式 3. 装饰器 One More Thing!&…

Microsoft 宣布今年底关闭开源软件托管平台 CodePlex

Microsoft 宣布,将关闭开源软件托管平台 CodePlex。Microsoft 2006 年推出这项服务,并决定在今年 12 月 15 日将其关闭。 Microsoft 公司副总裁 Brian Harry 在网上博客中写道,人们将可以下载他们的数据档案,Microsoft 正与面向开…

配电柜实时监测?这也太会省力了吧!

现代企业厂房的安全和效率对于业务的成功至关重要。在这个背景下,配电柜监控成为了一项关键的技术。通过实时监测和管理厂房内的配电柜,企业可以确保电力供应的稳定性,提高能源利用效率,并及时发现和解决潜在的故障和安全风险。 配…

matlab学习指南(2):安装工具箱Toolbox的方法(详细图解)

🌅*🔹** φ(゜▽゜*)♪ **🔹*🌅 欢迎来到馒头侠的博客,该类目主要讲数学建模的知识,大家一起学习,联系最后的横幅! 喜欢的朋友可以关注下,私信下次更新不迷路&#xff0…

Uniapp 版本更新

文章目录 前言Uniapp更新确定接口是否能够使用基本代码封装更新软件区别 前言 软件发布之后更新是经常出现的需求。我们希望软件能够自动连网更新软件,而不是重新去手动安装一个apk安装包。不需要更新的软件只有两个,一个是微信小程序,另一个…

openpnp - 汇川 Inovance IS620PS2R8I-IAB-C的参数读取

文章目录 openpnp - 汇川 Inovance IS620PS2R8I-IAB-C的参数读取概述笔记伺服和配套电机型号官方伺服调试软件笔记H00H01H02H03H04H05H06H07H08H09H0AH0BH0CH0DH0FH11H12H16H17H30H31自定义组备注END openpnp - 汇川 Inovance IS620PS2R8I-IAB-C的参数读取 概述 设备中用到了…

学习笔记——vscode界面设置界面缩放级别

使用vscode时,不知道按了什么快捷键,vscode窗口缩放了。 调整方法:设置 > 窗口(window) > Zoom Level

淘宝订单拉取更新历史状态~需求

&#x1f4da;目录 订单接口api需求问题解决 Map<String,TaobaoOrder> 订单接口api 可自行查询官网文档&#xff0c;点击进入 需求 通过接口中has_next 标识判断该时间断是否还有下一页数据,直到该值数据为false时,表面该时间范围内的订单数据获取完成. 拉取完成后需要对…

初阶C语言——指针

Hello&#xff0c;我们又见面了&#xff0c;时间过的好快啊&#xff0c;转眼间也已经写了这么多份博客了&#xff0c;在接下来的一年里&#xff0c;小编也会认真学习的敲代码&#xff0c;我们一起进步&#xff0c;那今天开始讲我们的指针&#xff0c;指针这一章节在C语言的学习…

【K8S系列】深入解析K8S监控

序言 做一件事并不难&#xff0c;难的是在于坚持。坚持一下也不难&#xff0c;难的是坚持到底。 文章标记颜色说明&#xff1a; 黄色&#xff1a;重要标题红色&#xff1a;用来标记结论绿色&#xff1a;用来标记论点蓝色&#xff1a;用来标记论点 Kubernetes (k8s) 是一个容器编…

微服务实例构建成 docker 镜像实例

&#x1f388; 作者&#xff1a;Linux猿 &#x1f388; 简介&#xff1a;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我&#xff0c;关注我&#xff0c;有问题私聊&#xff01; &…

使用WiFi测量仪进行机器人定位的粒子过滤器研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

PLSQL Developer怎样查看当前活动会话

点‘工具’-‘会话’&#xff1a; 选择‘Active sessions’: 点击某个会话&#xff0c;可以看到其对应的sql&#xff1a;

Flutter系列文章-Flutter环境搭建和Dart基础

Flutter是Google推出的一个开源的、高性能的移动应用开发框架&#xff0c;可以用一套代码库开发Android和iOS应用。Dart则是Flutter所使用的编程语言。让我们来看看如何搭建Flutter开发环境&#xff0c;并了解Dart语言的基础知识。 一、Flutter环境搭建 1. 安装Flutter SDK …

设计模式之模板模式

1. 模板模式介绍 1、模板模式即模板方法模式自定义了一个操作中的算法骨架&#xff0c;而将步骤延迟到子类中&#xff0c;使得子类可以不改变一个算法的结构&#xff0c;可以自定义该算法的某些特定步骤&#xff1b; 2、父类中提取了公共的部分代码&#xff0c;便于代码复用&am…

【ShenYu系列】ShenYu网关条件匹配的设计及原理分析

ShenYu网关中用到了很多有趣的设计&#xff0c;我对其中的条件匹配的实现尤其感兴趣&#xff0c;所以研究一下具体实现的原理。我这边用到的shenyu版本是2.6.0-SNAPSHOT。 应用入口 原理拆解 AbstractShenyuPlugin#execute&#xff0c;获取到SelectorData集合&#xff0c;进行…

MySQL基础篇第3章(基本的SELECT语句)

文章目录 1、SQL概述1.1 SQL背景知识1.2 SQL分类 2、SQL语言的规则与规范2.1 基本规则2.2 SQL大小写规范 &#xff08;建议遵守&#xff09;2.3 注释2.4 命名规则2.5 数据导入指令 3、基本的SELECT语句3.0 SELECT...3.1 SELECT...FROM3.2 列的别名3.3 去除重复行3.4 空置参与运…

OpenCV 入门教程: Sobel算子和Scharr算子

OpenCV 入门教程&#xff1a; Sobel 算子和 Scharr 算子 导语一、Sobel 算子二、Scharr 算子三、示例应用3.1 图像边缘检测3.2 边缘增强 总结 导语 在图像处理和计算机视觉领域&#xff0c;边缘检测是一项重要的任务。 Sobel 算子和 Scharr 算子是两种常用的边缘检测算子&…

MOVEit再现新漏洞,多个版本受影响

今年6月&#xff0c;文件共享工具MOVEit Transfer曾曝出SQL 注入漏洞&#xff0c;能让远程攻击者访问其数据库并执行任意代码。最近&#xff0c;MOVEit Transfer 母公司Progress Software又披露了三个新漏洞。 这三个漏洞分别是 CVE-2023-36932、CVE-2023-36933 和 CVE-2023-36…