(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 只能显示当前终端下进程的相关信息,我们可以使用给它加上 选项:
$ ps -la
此时我们的进程 process 就显示出来了,我们重点关注 和
列。
Linux 中的进程优先级由两部分组成:
:优先级 (priority),默认进程优先级为
。
:nice 值 (nice value) ,进程优先级的修正属性,取值区间为
,默认值为
。
注意:数字越小,表示优先级越高;数字越大,优先级越低。(Linux 下)
优先级的部分我们在 task_struct 中也是可以找到的。
它的优先级和我们上一章讲的进程状态一样,也是个整数,在 task_struct 中表示:
4、进程优先级的修改
要更该进程的优先级,需要更改的是 ,而非
。
因为 nice 值是进程优先级的修正数据,所以一个进程不管是在启动前还是在运行中,想要修改优先级,都是通过修改它的 nice 值来达到目的。
使用一连串指令修改指定进程的优先级:
- 输入top启动任务管理器
- 输入r(renice)来修改NI的值
- 再输入目标进程的pid来定位
- 输入想要修改的NI值(注意不是输入PRI值)
其实,我们系统中是存在 nice 命令的,对应的还有 renice 。
$ nice
$ renice
它们可以让我们在启动一个进程时直接指定优先级,或者启动中或启动前设置优先级。
感兴趣可以自行查阅,我们还是主要学习如何使用 top 命令去修改:
$ top
注:系统允许优先级的值被改高
如果想要将值改低要用sudo或root账号
进入 top 后我们键入 ,此时会发出询问:
PID to renice [default pid=
]
在后面输入我们要修改的进程的 即可,我们刚才进程的
是 :27428.
然后会询问:PID to renice [default pid=1]
,
问你要设置哪个进程的 :
如果你没有提供权限,会
如果你执意修改,你须具备 超级用户 的权限 —— !这里我们
sudo top
就行:
$ sudo top
我们来演示一下,给他增加10。
值得强调的是,Linux 不允许用户无节制地设置优先级,设置的优先级范围不能逾过下列区间:
二、进程的切换(Process Switch)
CPU 资源只有少量,甚至一个,所以进程之间是具有竞争属性的。为了高效的完成任务、更合理竞争相关资源,便具有了优先级。进程运行具有独立性,不会因为一个进程挂掉或者异常而导致其它进程出现问题!
思考:那么操作系统是如何做到进程具有独立性的呢?
1、并行和并发
并发:
当有多个线程在操作时,如果系统只有一个CPU,则它根本不可能真正同时进行一个以上的线程,它只能把CPU运行时间划分成若干个时间段,再将时间段分配给各个线程执行,在一个时间段的线程代码运行时,其它线程处于挂起状。.这种方式我们称之为并发(Concurrent)。
特点:对单处理器而言–多个程序在同一时间段发生
并行:
当系统有一个以上CPU时,则线程的操作有可能非并发。当一个CPU执行一个线程时,另一个CPU可以执行另一个线程,两个线程互不抢占CPU资源,可以同时进行,这种方式我们称之为并行(Parallel)。
特点:对多处理器而言–多个程序在同一时刻发生
2、进程抢占
思考:OS 就是简单的根据队列来进行前后调度的吗?有没有可能突然来了一个优先级更高的进程?
正在运行的低优先级进程,可能正在享受着它的时间片、推进着代码,但是如果来了优先级更高的进程,我们的调度器会直接把对应的进程从 CPU 上剥离,放上优先级更高的进程,这个操作就叫做 进程抢占。
a. 不允许不同优先级的进程存在的
b. 相同优先级的进程,是可能存在多个的
现在我们思考两个问题:
没运行完的进程数据后来去哪儿了?
当一个进程被取下时
它在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 命令),我们把这种命令叫做 内建命令。
相关文章:

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

数的分解(100%用例)C卷 (JavaPythonNode.jsC++)
给定一个正整数n,如果能够分解为m(m >1)个连续正整数之和,请输出所有分解中,m最小的分解。 如果给定整数无法分解为连续正整数,则输出字符串"N" 输入描述 输入数据为一整数,范围为 (1,2^30] 输出描述 比如输入为: 21 输出: 21=10+11 示例1 输入输出示例…...

数字调制学习总结
调制:将基带的信号的频谱搬移到指定的信道通带内的过程。 解调:把指定信号通带内的信号还原为基带的过程。 1、2ASK调制 原理如下图所示,基带信号为单极不归零码,与载波信号相乘,得到调制信号。 调制电路可以用开关…...

AcWing 1129. 热浪(单源最短路)
题目链接 https://www.acwing.com/problem/content/1131/https://www.acwing.com/problem/content/1131/ 题解 此题属于单源最短路问题,根据数据范围,可以使用Dijkstra算法、堆优化版的Dijkstra算法、SPFA算法。本例采用SPFA算法,使用手写循…...

Mybatis Mapper XML文件-缓存(cache)
MyBatis包含一个强大的事务查询缓存特性,可以进行灵活的配置和自定义。在MyBatis 3的缓存实现中进行了许多改进,使其更加强大且更易于配置。 默认情况下,仅启用了本地会话缓存,该缓存仅用于缓存会话期间的数据。要启用全局的第二…...

电子科大软件系统架构设计——设计模式
设计模式概述 设计模式的背景 设计面向对象软件比较困难,而设计可以复用的面向对象软件更加困难不是解决任何问题都需要从头做起,最好能复用以往的设计方案经验面向对象软件设计经验需要有一定的模式记录下来,以提供给其他设计者使用&#…...

ubuntu20 安装缺失的字体
在/usr/share/fonts创建文件夹winfonts sudo mkdir winfonts 下载缺失的字体后,复制命令到对应的文件夹。 刷新字体库 sudo mkfontscale sudo mkfontdir sudo fc-cache...

2023年12月27日学习记录_加入噪声
目录 1、今日计划学习内容2、今日学习内容1、add noise to audio clipssignal to noise ratio(SNR)加入 additive white gaussian noise(AWGN)加入 real world noises 2、使用kaggel上的一个小demo:CNN模型运行时出现的问题调整采样率时出现bug 3、明确90dB下能否声…...

Java面试题86-95
86. Java代码查错(4)public class Something { public int addOne(final int x) { return x; }}此代码有错误吗?答案: 错。int x被修饰成final,意味着x不能在addOne method中被修改。87. Java代码查错(5&…...

看完谁再说搞不定上下角标?
一、需求 开发中有一些需要用到上下角标的地方,比如说化学式、数学式、注释。。。除了可以使用上下角标的标签,还可以通过css样式和CV大法实现,以下是具体实现方式。 二、实现方法 (1)标签写法: <sup…...

在 Python 中使用装饰器decorator的 7 个层次
在 Python 中使用装饰器的 7 个层次(7 Levels of Using Decorators in Python) 文章目录 在 Python 中使用装饰器的 7 个层次(7 Levels of Using Decorators in Python)导言Level 0: 了解基本概念Basic Concepts和用法Usages什么是装饰器decorator?我们为什么需要装…...

Vue.js项目部署至Linux服务器的详细步骤
引言 在现代Web开发中,Vue.js作为一款流行的前端框架,为开发者提供了灵活且高效的工具。然而,在将Vue.js项目成功部署到Linux服务器上,可能需要一些额外的步骤和注意事项。本文将深入介绍在Linux服务器上部署Vue.js项目的详细步骤…...

Java三层架构/耦合/IOC/DI
一.三层架构 controller/web 控制层。接收前端发送的请求,对请求进行处理,并响应数据。 service 业务逻辑层,处理具体的业务逻辑。 dao 数据访问层(Data Access Object),也称为持久层。负责数据访问操作,包括数据的增、…...

[调试]stm32使用过程debug记录,持续更新ing
遇到的bug:无法在串口助手接收到stm32向主机输出的数据,串口-USB RX灯不闪烁; 分析:闪烁灯实际上为一个二极管,CH 插入电脑USB接口时,RX处于高电平,当数据传输时,拉低电平导致其闪烁…...

知识付费小程序如何搭建?
随着互联网的发展和人们对知识的渴求,知识付费行业正逐渐崭露头角。而其中,知识付费小程序因其便捷性、个性化等特点,成为了越来越多人的首选。那么,如何搭建一个知识付费小程序呢?本文将为你揭秘从零到一的全过程&…...

springboot整合minio做文件存储
一,minio介绍 MinIO 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小&…...

拥抱鸿蒙 - 在展讯T606平台上的探索与实践
前 言 自OpenHarmony 问世后受到了社会各界的广泛关注,OpenHarmony 的生态系统在如火如荼的发展。 酷派作为一家积极拥抱变化的公司,经过一段时间的探索与实践,成功实现将OpenHarmony 系统接入到展讯平台上,我们相信这是一个重要…...

nginx源码分析-1
使用gdb查看函数上下文: gdb attach nginx的work线程 监听端口状态时: 断点打在ngx_http_process_request 并通过浏览器触发请求时:...

超分之SRGAN
Photo-Realistic Single Image Super-Resolution Using a Generative Adversarial Network使用生成对抗网络的逼真单图像超分辨率一作:Christian Ledig是Twitter2017年的一篇论文。 文章目录 0. 摘要1. 引言1.1 相关工作1.1.1 介绍了SR技术的发展历程1.1.2 介绍了SR…...

Illustrator脚本 #015 自动角线
这是一个在画板上自动生成辅助线和角线的脚本,只要单击最右边按钮运行脚本即可。 绿色的为参考线及出血线。 #target "Illustrator" var settings = {addTrim : true,addBleedGuide : true,addCenterGuide : true,addCover : false,overlapAlert : false,trimma…...

使用Vite创建React + TypeScript(pro和mobile,含完整的空项目结构资源可供下载)
PC端 安装指令: npm create vitelatest react-ts-pro -- --template react-tsVite是一个框架无关的前端工具链,可以快速的生成一个React TS的开发环境,并且可以提供快速的开发体验说明: 1. npm create vitelatest固定写法&#…...

第一次记录QPSK,BSPK,MPSK,QAM—MATLAB实现
最近有偶然的机会学习了一次QPSK防止以后忘记又得找资料,这里就详细的记录一下 基于 QPSK 的通信系统如图 1 所示,QPSK 调制是目前最常用的一种卫星数字和数 字集群信号调制方式,它具有较高的频谱利用率、较强的抗干扰性、在电路上实现也较为…...

每周一算法:区间覆盖
问题描述 给定 N N N个闭区间 [ a i , b i ] [a_i,b_i] [ai,bi],以及一个线段区间 [ s , t ] [s,t] [s,t],请你选择尽量少的区间,将指定线段区间完全覆盖。 输出最少区间数,如果无法完全覆盖则输出 − 1 -1 −1。 输入格式…...

im6ull学习总结(二)Framebuffer 应用编程
1 LCD操作原理 linux中通过framebuffer驱动程序来控制LCD。framebuffer中包含LCD的参数,大小为LCD分辨率xbpp。framebuffer 是一块内存 内存中保存了一帧图像。 关于图像的帧指的是在图像处理中,一帧(Frame)是指图像序列中的单个…...

数据仓库 基本信息
数据仓库基本理论 数据仓库(英语:Data Warehouse,简称数仓、DW),是一个用于存储、分析、报告的数据系统。数据仓库的目的是构建面向分析的集成化数据环境,为企业提供决策支持(Decision Support)…...

仓储革新:AR技术引领物流进入智慧时代
根据《2022年中国物流行业研究:深度探析行业现状(智能设备及智能软件)》,报告中提及:“中国社会物流总额依然保持着较为良好的增长态势,年增速已恢复至常年平均水平。2021年社会物流总额细分中工业物流总额…...

软件仓库部署及应用
随着某公司内部的Linux服务器不断增多,软件更新,系统升级等需求也逐渐凸显。为了提高软 件包管理效率,减少重复下载,公司要求部署一台软件仓库服务器,面向内网提供安装源。 需求描述 > 服务器使用CentOS7操作系统I…...

ASUS华硕ROG幻16笔记本电脑2023款GU604VI VZ VY原装出厂Windows11系统22H2
华硕玩家国度幻16笔记本原厂W11系统,适用型号:GU604VI、GU604VZ、GU604VY 链接:https://pan.baidu.com/s/166x6FNUFEpA3Qbzeory3Hg?pwdlwau 提取码:lwau 系统自带所有驱动、出厂主题壁纸、Office办公软件、MyASUS华硕电脑管…...

可视化云监控/安防监控系统EasyCVR视频管理平台播流失败的原因(端口篇)
安防视频监控EasyCVR平台兼容性强,可支持的接入协议众多,包括国标GB28181、RTSP/Onvif、RTMP,以及厂家的私有协议与SDK,如:海康ehome、海康sdk、大华sdk、宇视sdk、华为sdk、萤石云sdk、乐橙sdk等。平台能将接入的视频…...

边缘检测——PidiNet网络训练自己数据集并优化推理测试(详细图文教程)
PiDiNet 是一种用于边缘检测的算法,它提出了一种简单、轻量级但有效的架构。PiDiNet 采用了新 颖的像素差卷积,将传统的边缘检测算子集成到现代 CNN 中流行的卷积运算中,以增强任务性能。 在 BSDS500、NYUD 和 Multicue 上进行了大量的实验…...