(13)Linux 进程的优先级、进程的切换以及环境变量等

前言:我们先讲解进程的优先级。然后讲解进程的切换,最后我们讲解环境变量,并且做一个 "让自己的可执行程序不带路径也能执行"的实践,讲解环境变量的到如何删除,最后再讲几个常见的环境变量。

一、进程优先级(Process Priority)

1、什么是优先级? 

cpu资源分配的先后顺序就是指进程的优先级(priority) 

先区分优先级和权限的区别:

  • 优先级代表一定能得到申请的资源
    只是现在要考虑得到资源的时间问题

  • 权限代表有没有资格得到申请的资源
    是要考虑能否的问题

 

 2、为什么会存在优先级?

我们不妨先思考下我们日常生活中排队的本质,排队的本质可以说是 "确定优先级" ,

而插队行为就是更改优先级。因为排队造就了优先级,那我们为什么要排队?

现实生活中一旦出现了抢,就难免会引发争执。

所以,排队主要是换了一种竞争方式,不以那么残酷的方式竞争,让进程都能 井然有序

因为 系统里面永远都是进程占大多数,资源是少数。 这就导致了进程竞争资源是常态!

排队和进程资源竞争都是一定要确认先后的,它们的本质都是 确认优先级

本章我们要讲的是 Linux 的进程优先级,Linux 下的优先级有很多方式,包括设置和修改。

我们不建议修改优先级,如果你不懂调度器的调度算法,你随便修改优先级其实就是变相地 "插队" 了。你可以让你的进程尽快地得到了某种 CPU 资源或其它资源,凡是可能会打破调度器的平衡。其实你在用户层再怎么设置,也不会对调度器的调度策略产生什么影响。

 3、查看系统进程:ps -l

 查看系统进程:在 Linux 或者 Unix 系统中,输入  ps -l  命令则会输出内容:

$ ps -l    # 查看进程的优先级

我们写一个简单的 Hello 程序,令其每隔一秒发送一次 Hello:

#include <stdio.h>
#include <unistd.h>int main(void) {while (1) {sleep(1);printf("Hello world! pid: %d\n" ,getpid());}
}

我们把它运行起来,此时我们使用  ps -l   查看: 

然而,并没有我们的的进程

因为  ps -l  只能显示当前终端下进程的相关信息,我们可以使用给它加上 \textrm{-a}​ 选项:

$ ps -la   

此时我们的进程 process 就显示出来了,我们重点关注 \textrm{PRI}​ 和 \textrm{NI}​ 列。

 Linux 中的进程优先级由两部分组成:\textrm{PRI\, +\, NI}

  • \textrm{PRI}​:优先级 (priority),默认进程优先级为 80​。
  • \textrm{NI}​:nice 值 (nice value) ,进程优先级的修正属性,取值区间为 [-20, 19]​ ,默认值为 0​ 。

注意:数字越小,表示优先级越高;数字越大,优先级越低。(Linux 下)

优先级的部分我们在 task_struct 中也是可以找到的。
它的优先级和我们上一章讲的进程状态一样,也是个整数,在 task_struct 中表示:

 

 4、进程优先级的修改

要更该进程的优先级,需要更改的是 \textrm{NI}​,而非 \textrm{PRI}​ 。

因为 nice 值是进程优先级的修正数据,所以一个进程不管是在启动前还是在运行中,想要修改优先级,都是通过修改它的 nice 值来达到目的。

使用一连串指令修改指定进程的优先级:

  1. 输入top启动任务管理器
  2. 输入r(renice)来修改NI的值
  3. 再输入目标进程的pid来定位
  4. 输入想要修改的NI值(注意不是输入PRI值)

其实,我们系统中是存在   nice  命令的,对应的还有   renice  。

$ nice  
$ renice

它们可以让我们在启动一个进程时直接指定优先级,或者启动中或启动前设置优先级。

感兴趣可以自行查阅,我们还是主要学习如何使用   top  命令去修改:

$ top

注:系统允许优先级的值被改高
如果想要将值改低要用sudo或root账号

进入 top 后我们键入 \textrm{r}​ ,此时会发出询问:PID to renice [default pid=x]

在后面输入我们要修改的进程的 \textrm{pid}​ 即可,我们刚才进程的 \textrm{pid}​ 是 ​:27428.

然后会询问:PID to renice [default pid=1] 问你要设置哪个进程的 \textrm{pid}​:

如果你没有提供权限,会

 如果你执意修改,你须具备 超级用户 的权限 —— \textrm{root}​ !这里我们 sudo top 就行:

$ sudo top 

我们来演示一下,给他增加10。

值得强调的是,Linux 不允许用户无节制地设置优先级,设置的优先级范围不能逾过下列区间:

\textrm{NICE}:\, [-20,19]

二、进程的切换(Process Switch) 

 CPU 资源只有少量,甚至一个,所以进程之间是具有竞争属性的。为了高效的完成任务、更合理竞争相关资源,便具有了优先级。进程运行具有独立性,不会因为一个进程挂掉或者异常而导致其它进程出现问题!

思考:那么操作系统是如何做到进程具有独立性的呢?

1、并行和并发 

并发:

当有多个线程在操作时,如果系统只有一个CPU,则它根本不可能真正同时进行一个以上的线程,它只能把CPU运行时间划分成若干个时间段,再将时间段分配给各个线程执行,在一个时间段的线程代码运行时,其它线程处于挂起状。.这种方式我们称之为并发(Concurrent)。

 特点:对单处理器而言–多个程序在同一时间段发生

并行:

当系统有一个以上CPU时,则线程的操作有可能非并发。当一个CPU执行一个线程时,另一个CPU可以执行另一个线程,两个线程互不抢占CPU资源,可以同时进行,这种方式我们称之为并行(Parallel)。 

特点:对多处理器而言–多个程序在同一时刻发生

 2、进程抢占

思考:OS 就是简单的根据队列来进行前后调度的吗?有没有可能突然来了一个优先级更高的进程? 

正在运行的低优先级进程,可能正在享受着它的时间片、推进着代码,但是如果来了优先级更高的进程,我们的调度器会直接把对应的进程从 CPU 上剥离,放上优先级更高的进程,这个操作就叫做 进程抢占。 

 a. 不允许不同优先级的进程存在的 
b. 相同优先级的进程,是可能存在多个的

 现在我们思考两个问题:

  1. 没运行完的进程数据后来去哪儿了?
  2. 当一个进程被取下时它在CPU的数据是否会被删除?

 举个例子:

int func() {int a = 10 + 20;return a;
}int z = func();

 z 是如何得到已经释放的临时变量 a 的数据的?

寄存器功不可没,拷贝一份到寄存器里去,然后再 mov 给 z 变量。 

CPU 内的寄存器是:可以临时地存储数据

寄存器分为 可见寄存器 不可见寄存器

当进程在被执行的过程中,一定会存在大量的临时数据,会暂存在 CPU 内的寄存器中。

寄存器上数据的重要性:

我们把进程在运行中产生的各种寄存器数据,我们叫进程的硬件上下文数据。

  • 当进程被剥离:需要保存上下文数据
  • 当进程恢复时:需要将曾经保存的上下文数据恢复到寄存器中。

一个进程被取下来时CPU并不会删除它的临时数据而是当下一个进程被放入时,用
下一个进程的数据将上一个进程的数据覆盖了!
 

 三、环境变量(Environment Var)

思考:为什么我们的代码运行要带路径,而系统的指令不用带路径?

 

 

如果我们直接输入我们的可执行程序,会显示 :

我们说过,执行系统的指令实际上也是程序,系统的指令你也是可以带上路径的: 

 

其实,我们可以通过它的报错 "command not found" 发现些什么!

要执行一个可执行程序,前提是要先找到它。

现在我们的问题就可以转化成:为什么系统的命令能找到,而我们自己的程序找不到? 

系统中是存在相关的 环境变量,保存了程序的搜索路径的!

为什么我们的代码运行要带路径,而系统的指令不用带?其本质是由环境变量 PATH

 引起的! 

1、环境变量 PATH  

 我们可以通过 env 指令查看环境变量:

$ env

 (一大堆数据)

这些变量每一个都有它特殊的用途,系统中搜索可执行程序的环境变量叫做 PATH。

我们可以通过 grep 去抓一下: 

$ echo $PATH

如何查看环境变量的内容?我们可以使用 echo  去显示: 

$ echo $PATH

环境变量 PATH中会承载多种路径,中间用冒号 ( : ) 作为分隔符。

我们再执行某一个程序时,比如执行 ls 时,我们的系统识别到 ls 的输入时,会在上面路径中逐个搜索,只要在特定的路径下找到了 ls,就会执行特定路径下的 ls 并停止搜索。

 换言之,PATH 就提供了环境变量,可执行程序搜索的路径。

我们的 ls 在  usr/bin  路径下,这说明当前的 ls 在 PATH

 中是可以被找到的,

所以执行 ls 的时侯自然可以不带路径,所以我们自己的  process 不带路径自然就不能执行。

因为当前的  process 所在的路径并没有这里的环境变量,程序在搜索的时侯找了路径也没有找到你这个可执行程序,搜索完找不到,自然就报 "command not found" 了。

现在就想让我的可执行程序 process 不带路径直接执行起来

我们先讲述一种简单粗暴的方式,直接把我们的可执行程序 cp 拷贝到系统的路径中:

$ sudo cp process /usr/bin/

既然系统的所有命令都在 usr/bin 路径下,那我们把我们的 process 拷进去就行了。

不建议你将你的指令拷贝到 Linux 系统路径下,因为这会污染 Linux 下的命令池。 

更好的方式是将 process 所处的路径也添加到环境变量中。 

在 Linux 命令行中,我们也是可以定义变量的,命令行变量分为两种:

  • 普通变量
  • 环境变量(具备全局属性)

 

Linux命令行也是可以定义变量的

用系统查看环境变量的命令 env 去查看一下这个本地变量,会发现根本找不到,

因为它不以环境变量的形式存在,但是它是存在的! 

如果你想让一个变量变成环境变量,你可以通过 export 导出一个在系统中可以查看的环境变量: 

$ export []=[]

 通过 env 并 grep 一下这个变量,我们就能找到我们导出的环境变量了:

 把我们的环境变量,当前路径导入到 PATH 路径中看看会发生什么:

$ export PATH=[路径]

 我们发现我们的 process 可以跟系统指令一样不带路径直接执行了,但是但是但是

你会发现你的命令全都不能用了。(ls,touch,mkdir,,,,,)

因为你把 PATH 里的环境变量都搞没了,只剩你自己的路径了,所以这些指令自然都找不到了。

出现了你刚才自己可执行程序不带路径后 Enter 的报错 "command not found" 。

在命令行上设置的环境变量是具有临时性的,只在你登陆期间有效。

关掉重启!!!就能解决

如果你想让你的环境变量设置永久有效的话,是需要更改配置文件的,该配置文件在系统当中,跟云服务器没有关系。

$ export PATH=$PATH:[路径]

 

2、环境变量的导入和解除 

刚才我们通过 export 去导入变量,如果想取消一个变量,就可以使用 unset 来取消变量设置: 

 

此时我们使用 unset 环境变量,就可以解除 foo: 

 

" 这些东西实际上都是 shell 命令,export 是导出,unset 是取消 " 

3、介绍几个常见的环境变量 

下面我们来详细介绍一下常见的环境变量,刚才我们就是用 env 指令去查看环境变量的: 

 

这个 HOSTNAME 就是表示 "对应这台主机的主机名" 。

 

我们同样也是可以通过 echo 指令带上 $ 去查看环境变量: 

echo $HOSTNAME

 

再比如 SHELL,它可以告诉你你的 shell 在哪里,通常是 /bin/bash  

echo $SHELL

 

得益于 Linux 存在历史命令的记录功能,我们可以在 Xshell 里 ↑ ↓ 显出历史命令,就像这样: 

Linux 最多允许你记录的历史命令条数是 10000。(有的就不一样唉)

而我们接下来要介绍的 HISTSIZE  (History Size),就是定义一共记录多少历史指令的环境变量: 

$ echo $HISTSIZE

 

当然还有很多,比如 SSH-CLIENT 记录了谁登的服务器、地址、端口号等。 

尾记 

 

命令行中启动的进程,父进程全部都是 bash 。

环境变量具有全局属性,环境变量是会被子进程继承下去的。

所谓的本地变量,本质就是在 bash 内部定义的变量,不会被子进程继承下去。

Linux 下大部分命令都是通过子进程的方式执行的,但是还有一部分命令不通过子进程的方式执行,而是由 bash 自己执行(调用自己的对应的函数来完成特定的功能,比如 cd 命令),我们把这种命令叫做 内建命令。
 

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

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

相关文章

跟着LearnOpenGL学习10--基础光照

文章目录 一、前言二、环境光照三、漫反射光照3.1、法向量3.2、计算漫反射光照3.3、全部代码3.4、法线矩阵 四、镜面光照4.1、全部代码 一、前言 现实世界的光照是极其复杂的&#xff0c;而且会受到诸多因素的影响&#xff0c;这是我们有限的计算能力所无法模拟的。 因此Open…

使用Rust发送邮件

SMTP协议与MIME协议 SMTP&#xff08;简单邮件传输协议,Simple Mail Transfer Protocol&#xff09;是一种用于发送和接收电子邮件的互联网标准通信协议。它定义了电子邮件服务器如何相互发送、接收和中继邮件。SMTP 通常用于发送邮件&#xff0c;而邮件的接收通常由 POP&#…

响应式绑定<a-textarea>的内容

项目中的 <a-textarea>组件需要自动填入下方数据表的物品名称数量单位&#xff0c;效果如下&#xff1a; 尝试 <a-textarea>{{插值}}</a-textarea>&#xff0c;实现不了&#xff0c;问ai得知需要使用v-decorator 指令的initialValue 属性 问&#xff1a; 如何…

地震烈度速报与预警工程成功案例的经验分享 | TDengine 技术培训班第一期成功落地

近日&#xff0c;涛思数据在成都开设了“国家地震烈度速报与预警工程数据库 TDengine、消息中间件 TMQ 技术培训班”&#xff0c;这次培训活动共分为三期&#xff0c;而本次活动是第一期。其目标是帮助参与者深入了解 TDengine 和 TMQ 的技术特点和应用场景&#xff0c;并学习如…

pybullet安装时出现fatal error C1083: 无法打开包括文件: “string.h”: No such file or directory

pybullet安装时出现fatal error C1083: 无法打开包括文件: “string.h”: No such file or directory 报错原文&#xff1a; -----CloneTreeCreator.cppD:\Program_Professional\Microsoft Visual Studio\2022\BuildTools\VC\Tools\MSVC\14.38.33130\include\cstring(11): fat…

腾讯云服务器如何买(购买腾讯云服务器的详细步骤)

腾讯云服务器购买流程直接在官方秒杀活动上购买比较划算&#xff0c;在云服务器CVM或轻量应用服务器页面自定义购买价格比较贵&#xff0c;但是自定义购买云服务器CPU内存带宽配置选择范围广&#xff0c;活动上购买只能选择固定的活动机&#xff0c;选择范围窄&#xff0c;但是…

canal 数据同步组件

canal 数据异构组件 为啥要使用这个组件&#xff1f; 在更新DB的时候不同步更新到redis&#xff0c;es等数据库中&#xff0c;时间太久&#xff0c;而且可能会存在同步失败的问题&#xff0c;因此引入canal去拉取DB的数据&#xff0c;再去更新到redis&#xff0c;es等数据库中&…

TiDB SQL调优案例TiFlash

背景 早上收到某系统的告警tidb节点挂掉无法访问&#xff0c;情况十万火急。登录中控机查了一下display信息&#xff0c;4个TiDB、Prometheus、Grafana全挂了&#xff0c;某台机器hang死无法连接&#xff0c;经过快速重启后集群恢复&#xff0c;经排查后是昨天上线的某个SQL导…

OpenGL 绘制Mesh数据(Qt)

文章目录 一、简介二、实现代码三、实现效果一、简介 Mesh数据的结构主要就是点与三角面片,因此本质上仍然是对三角面片进行绘制。这里我们借助VCG这个库实现对Mesh数据的读取,这个库相对简单轻巧,很方便使用。 二、实现代码 由于修改的部分很多,我们逐一进行解释一下: --…

Seata 中封装了四种分布式事务模式,分别是: AT 模式, TCC 模式, Saga 模式, XA 模式,

文章目录 seata概述Seata 中封装了四种分布式事务模式&#xff0c;分别是&#xff1a;AT 模式&#xff0c;TCC 模式&#xff0c;Saga 模式&#xff0c;XA 模式&#xff0c; 今天我们来聊聊seata seata 概述 在微服务架构下&#xff0c;由于数据库和应用服务的拆分&#xff0c…

【SAM系列】Auto-Prompting SAM for Mobile Friendly 3D Medical Image Segmentation

论文链接&#xff1a;https://arxiv.org/pdf/2308.14936.pdf 核心&#xff1a; finetune SAM,为了不依赖外部prompt&#xff0c;通过将深层的特征经过一个编-解码器来得到prompt embedding&#xff1b;finetune完之后做蒸馏

PTA-感染人数

设某住宿区域是一个nn的方阵&#xff0c;方阵中的每个小方格为一个房间&#xff0c;房间里可能住一个人&#xff0c;也可能空着。第一天&#xff0c;某些房间中住着的人得了一种高传染性的流感&#xff0c;以后每一天&#xff0c;得流感的人会使其邻居&#xff08;住在其上、下…

76 Python开发-内外网收集Socket子域名DNS

目录 Python开发相关知识点本篇文章涉及知识点演示案例:IP&Whois&系统指纹获取代码段-外网CDN&子域名&端口扫描&交互代码段-外网IP&计算机名&存活主机&端口扫描代码段-内网Py格式解析环境与可执行程序格式转换-Pyinstaller 涉及资源&#xff1…

git 学习 之一个规范的 commit 如何写

最好的话做一件完整的事情就提交一次

一种删除 KubeSphere 中一直卡在 Terminating 的 Namespace--KubeSphere Logging System的简单方法

文章目录 一、问题提出二、删除方法1&#xff0c;获取kubesphere-logging-syste的详细信息json文件2&#xff0c;编辑kubesphere-logging-system.json3&#xff0c;执行清理命令 三、检查结果 一、问题提出 在使用 KubeSphere 的时候发现有一个日志服务KubeSphere Logging Sys…

YoloV8改进策略:基于自研的图注意力机制改进| 独家改进方法|图卷积和注意力融合模块

摘要 SE注意力机制是一种通过显式建模卷积特征的信道之间相互依赖性的方法,旨在提高网络产生的表示的质量。SE注意力机制包括两个步骤:Squeeze和Excitation。在Squeeze步骤中,通过全局平均池化操作将输入特征图压缩成一个向量,然后通过一个全连接层将其映射到一个较小的向…

HTML的学习记录

<br /> 标签在 HTML 页面中创换行符。 <hr /> 标签在 HTML 页面中创建水平线。 段落是通过 <p> 标签定义的。 浏览器会自动地在段落的前后添加空行。&#xff08;<p> 是块级元素&#xff09; 文本格式 <b>This text is bold</b>字体加粗 …

2024年最新软件测试必问面试题,面试前一天刷效果更佳

1.你为什么选择软件测试行业 因为之前有了解软件测试这个行业&#xff0c;觉得他的发展前景很好。 2.根据你以前的工作经验描述一下软件开发、测试过程&#xff0c;由那些角色负责&#xff0c;你做什么 要有架构师、开发经理、测试经理、程序员、测试员。我在里面主要是负责所…

HOJ 项目部署-前端定制 默认勾选显示标签、 在线编辑器主题和字号大小修改、增加一言功能 题目AC后礼花绽放

# 项目拉取地址&#xff1a; https://gitee.com/himitzh0730/hoj.git # 切换到hoj-vue目录执行以下命令 #安装依赖 npm install #运行服务 npm run serve #修改代码后构建项目到dist文件夹&#xff0c;到服务器docker-compose.yml中修改hoj-frontend文件映射即可 npm run build…

dvwa问题篇 -- dvwa出现数据库无法访问的时候,Could not connect to the MySQL service. -- 小黑解决教程

各位小伙伴初次玩dvwa会出现各种问题&#xff0c;本来想把一些问题直接总结写一篇dvwa文章来着&#xff0c;但因为都是关键字搜索&#xff0c;所以将一些问题都拆分出来&#xff0c;以便大家方便查类似问题。&#xff08;大家有遇到不一样的问题欢迎投稿&#xff01;&#xff0…