Linux--进程的概念(二)

news2024/11/27 18:47:09

目录

  • 一、进程的优先级
    • 1.1 基本概念
    • 1.2 查看进程优先级
    • 1.3 PRI&NI
    • 1.4 如何更改进程的优先级
      • 1.4.1 用top命令更改进程的nice
      • 1.4.2 用renice命令更改进程的nice
    • 1.5 其他概念
  • 二、环境变量
    • 2.1 基本概念
    • 2.2 常见的环境变量
    • 2.3 查看环境变量
      • 2.3.1 测试PATH
      • 2.3.2 测试HOME
      • 2.3.3 测试SHELL
    • 2.4 和环境变量相关的命令
      • 2.4.1 echo命令
      • 2.4.2 export命令
      • 2.4.3 env命令
      • 2.4.4 set命令
      • 2.4.5 unset命令
    • 2.5 环境的组织方式
    • 2.6 通过代码获取环境变量
      • 2.6.1 main函数命令行参数的了解
      • 2.6.2 main函数的环境变量获取
      • 2.6.3 通过第三方变量environ获取
    • 2.7 通过系统调用获取环境变量(常用)

一、进程的优先级

1.1 基本概念

  • CPU资源分配的先后顺序,就是指进程的优先权(priority)。
  • 优先权高的进程有优先执行权力。配置进程优先权对多任务环境的Linux很有用,可以改善系统性能。
  • 还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整体性能。
    为什么要有优先级
    就是因为CPU是有限的!进程太多,需要通过某种方式竞争资源!
    什么是优先级
    确认是谁应该先获得某种资源,谁后获得。 我们是可以用一些数据表明优先级的!
      **Linux具体的优先级做法:**优先级=老的优先级+nice值。

1.2 查看进程优先级

  在Linux或者Unix操作系统中,用ps -l命令会类似输出以下几个内容:

[zl@VM-16-2-centos lesson13]$ ps -l

在这里插入图片描述
  当我们创建一个进程后,我们可以使用 ps -la命令查看该进程优先级的信息

[zl@VM-16-2-centos lesson13]$ ps -la

在这里插入图片描述
注意;在Linux操作系统中,初始进程一般优先级PRI默认为80,NI默认为40。

列出的信息当中有几个重要的信息,如下:

  • UID:代表执行者的身份
  • PID:代表这个进程的代号
  • PPID:代表这个进程是由哪个进程发展衍生而来的,亦即父进程的代号
  • PRI:代表这个进程可被执行的优先级,其值越小越早被执行
  • NI:代表这个进程的nice值

1.3 PRI&NI

  • PRI代表进程的优先级(priority),通俗点说就是进程被CPU执行的先后顺序,该值越小进程的优先级别越高。
    NI代表的是nice值,其表示进程可被执行的优先级的修正数值。
    PRI值越小越快被执行,当加入nice值后,将会使得PRI变为:PRI(new)=PRI(old)+NI。
    若NI值为负值,那么该进程的PRI将变小,即其优先级会变高。
    调整进程优先级,在Linux下,就是调整进程的nice值。
    NI的取值范围是-20至19,一共40个级别。

注意:在Linux操作系统当中,PRI(old)默认为80,即PRI=80+NI。
  需要强调的一点是,进程的nice值不是进程的优先级,他们不是一个概念,但是进程nice值会影响进程的优先级变化。
  可以理解nice值是进程优先级的修正数据。

1.4 如何更改进程的优先级

1.4.1 用top命令更改进程的nice

  top命令就相当于Windows操作系统中的任务管理器,它能够动态实时的显示系统当中进程的资源占用情况。
  使用top命令后按“r”键,会要求你输入待调整nice值的进程PID
  输入进程PID并回车后,会要求你输入调整后的nice值。
  输入nice值后按“q”即可退出,如果我们这里输入的nice值为20,那么此时我们再用ps命令查看进程的优先级信息,即可发现进程的NI变成了19,PRI变成了99(80+NI-1)。
注意:若是想将NI值调为负值,也就是将进程的优先级调高,需要使用sudo命令提升权限(sudo top)。
在这里插入图片描述

1.4.2 用renice命令更改进程的nice

  使用renice命令,后面跟上更改后的nice值和进程的PID即可。
  之后我们再用ps命令查看进程的优先级信息,也可以发现进程的NI变成了20,PRI变成了99(80+NI-1)
注意:若是想使用renice命令将NI值调为负值,也需要使用sudo命令提升权限(sudo renice)。

1.5 其他概念

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

切换
  如果进程A正在被运行,CPU内的寄存器里面,一定保存的是进程A的临时数据!
  寄存器中的临时数据,叫做A的上下文!
  上下文数据可以被丢弃吗?绝对不可以!
  当进程A暂时被切下来的时候,需要进程A顺便带走自己的上下文数据!
  带走暂时保存的目的:就是为了下次回来的时候,能恢复上去,就能继续按照之前的逻辑继续向后运行,就如同没有被中断过一样。
  CPU内的寄存器只有一份,但是上下文可以有多份,分别对应不同的进程!

二、环境变量

2.1 基本概念

  环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数。
  例如,我们编写的C/C++代码,在各个目标文件进行链接的时候,从来不知道我们所链接的动静态库在哪里,但是按照可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。
  环境变量通常具有某些特殊用途,并且在系统当中通常具有全局特性。
  子进程的环境变量是从父进程来的!
  默认,所有的环境变量,都会被子进程继承,环境变量具有全局属性

2.2 常见的环境变量

  • PATH:指定命令的搜索路径。
  • HOME:指定用户的主工作目录(即用户登录到Linux系统中的默认所处目录)
  • SHELL:当前Shell,它的值通常是/bin/bash

2.3 查看环境变量

  我们可以通过echo命令来查看环境变量,方法如下:

echo  $NAME    //NAME为待查看的环境变量名称

例如,查看环境变量PATH。

echo $PATH
在这里插入图片描述

2.3.1 测试PATH

  有没有想过一个问题:为什么执行ls命令的时候不用带./就可以执行,而我们自己生成的可执行程序必须要在前面带上./才可以执行?
在这里插入图片描述

  容易理解的是,要执行一个可执行程序必须要先找到它在哪里,既然不带./就可以执行ls命令,说明系统能够通过ls名称找到ls的位置,而系统是无法找到我们自己的可执行程序的,所以我们必须带上./,以此告诉系统该可执行程序位于当前目录下。
  而系统就是通过环境变量PATH来找到ls命令的,查看环境变量PATH我们可以看到如下内容:
在这里插入图片描述
  可以看到环境变量PATH当中有多条路径,这些路径由冒号隔开,当你使用ls命令时,系统就会查看环境变量PATH,然后默认从左到右依次在各个路径当中进行查找。
  而ls命令实际就位于PATH当中的某一个路径下,所以就算ls命令不带路径执行,系统也是能够找到的。

那可不可以让我们自己的可执行程序也不用带路径就可以执行呢?
方式一:将可执行程序拷贝到环境变量PATH的某一路径下
  既然在未指定路径的情况下系统会根据环境变量PATH当中的路径进行查找,那我们就可以将我们的可执行程序拷贝到PATH的某一路径下,此后我们的可执行程序不带路径系统也可以找到了。

sudo cp proc /usr/bin

方式二:将可执行程序所在的目录导入到环境变量PATH当中
  将可执行程序所在的目录导入到环境变量PATH当中,这样一来,没有执行路径时系统就会来到该目录下进行查找了。

export PATH=$PATH:/home/zl/lesson13

  将可执行程序所在的目录导入到环境变量PATH当中后,位于该目录下的可执行程序也就可以在不带路径的情况下执行了。

2.3.2 测试HOME

  任何一个用户在运行系统登录时都有自己的主工作目录(家目录),环境变量HOME当中即保存的该用户的主工作目录。
超级用户
在这里插入图片描述
普通用户
在这里插入图片描述

2.3.3 测试SHELL

  我们在Linux操作系统当中所敲的各种命令,实际上需要由命令行解释器进行解释,而在Linux当中有许多种命令行解释器(例如bash、sh),我们可以通过查看环境变量SHELL来知道自己当前所用的命令行解释器的种类。
在这里插入图片描述
  而该命令行解释器实际上是系统当中的一条命令,当这个命令运行起来变成进程后就可以为我们进行命令行解释。

2.4 和环境变量相关的命令

2.4.1 echo命令

  这个处理可以查看相关的环境变量,还可以直接打印一些数据
在这里插入图片描述

2.4.2 export命令

  设置一个新的环境变量,还可以将本地变量导出环境变量;所谓的本地变量就相当于我们在C/C++种定义一个变量
在这里插入图片描述

2.4.3 env命令

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

2.4.4 set命令

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

2.4.5 unset命令

  清除环境变量;处理环境变量外,还有本地变量,所谓的本地变量就相当于我们在C/C++种定义一个变量
在这里插入图片描述
部分环境变量说明

环境变量名称表示内容
PATH命令的搜索路径
HOME用户的主工作目录
SHELL当前Shell
HOSTNAME主机名
TERM终端类型
HISTSIZE记录历史命令的条数
SSH_TTY当前终端文件
USER当前用户
MAIL邮箱
PWD当前所处路径
LANG编码格式
LOGNAME登录用户名

2.5 环境的组织方式

  在系统当中,环境变量的组织方式如下:

在这里插入图片描述
  每个程序都会收到一张环境变量表,环境表是一个字符指针数组,每个指针指向一个以‘\0’结尾的环境字符串,最后一个字符指针为空。

2.6 通过代码获取环境变量

2.6.1 main函数命令行参数的了解

  你知道main函数其实是有参数的吗?
  main函数其实有三个参数,只有我们平时基本不用它们,所以一般情况下都没有写出来。

int main(int arge, char* argv[], char* envp[])//这里的三个参数就是命令行参数
{}

  我们可以在Windows下的编译器进行验证,当我们调试代码的时候,若是一直使用逐步调试,那么最终会来到调用main函数的地方。

  在Linux操作系统下,编写以下代码,生成可执行程序并运行。
在这里插入图片描述
  运行结果如下
在这里插入图片描述
  现在说说main函数的前两个参数,main函数的第二个参数是一个字符指针数组,数组当中的第一个字符指针存储的是可执行程序的位置,其余字符指针存储的是所给的若干选项,最后一个字符指针为空,而main函数的第一个参数代表的就是字符指针数组当中的有效元素个数。
在这里插入图片描述
在这里插入图片描述
  通过该程序可以观察到,使用main函数的前面两个参数可以实现,同一个命令的不同选项的功能(例如ls -a,ls-l)。

2.6.2 main函数的环境变量获取

  main函数的第三个参数接收的实际上就是环境变量表,我们可以通过main函数的第三个参数来获取系统的环境变量。
  例如,编写以下代码,生成可执行程序并运行。

在这里插入图片描述
  运行结果就是各个环境变量的值:
在这里插入图片描述

2.6.3 通过第三方变量environ获取

  除了使用main函数的第三个参数来获取环境变量以外,我们还可以通过第三方变量environ来获取。
在这里插入图片描述
  运行该代码生成的可执行程序,我们同样可以获得环境变量的值。
在这里插入图片描述
注意:libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头文件中,所有在使用时要用extern进行声明。

2.7 通过系统调用获取环境变量(常用)

  除了通过main函数的第三个参数和第三方变量environ来获取环境变量外,我们还可以通过系统调用getenv函数来获取环境变量。
  getenv函数可以根据所给环境变量名,在环境变量表当中进行搜索,并返回一个指向相应值得字符串指针。
  例如:使用getenv函数获取环境变量PATH的值。
在这里插入图片描述
  运行结果:
在这里插入图片描述

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

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

相关文章

Android14之智能指针的弱引用、强引用、弱指针、强指针用法区别及代码实例(二百零五)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

LTC4054 充电指示灯转灯电路

由于这个芯片只有CHRG# 引脚,不像4056 那样两个引脚能分别接一个LED,要实现充电指示就必须自己整整外围电路。先说明一下,网上常见的这种接法: 一个LED 直连CHRG# 引脚,我试了是不行的,即使充满电&#xff…

【国际会议火热征稿】2024年应用经济学、管理科学与社会国际学术会议(ICAEMSS 2024)

会议简介 2024年应用经济学、管理科学与社会国际学术会议将聚焦应用经济学和管理科学的前沿问题,深入探讨社会变革中的经济管理与科学应用。参会者将分享最新研究成果,交流学术观点,共同探索经济、管理与社会的融合发展之路。本次会议旨在推…

Zotero + Markdown论文工作流

文章目录 关键步骤Zotero Better BibTeXObsidian Citekey Plugin & WrittingPandoc Export 关键步骤 在Zotero中,使用Better BibTex生成.bib文件,用于提取索引信息。由于后续需要使用pandoc将markdown转换为word或者LaTeX,所以Better Bi…

记Kubernetes(k8s):访问 Prometheus UI界面:Warning: Error fetching server time

记Kubernetes(k8s):访问 Prometheus UI界面:Warning: Error fetching server time 1、报错详情2、解决3、再次访问 PrometheusUI界面 💖The Begin💖点点关注,收藏不迷路💖 1、报错详情 Warning:…

Linux启动过程、启动脚本目录介绍及检测思路分析

一、Linux系统启动过程 1、启动流程: Linux系统的启动过程可以分为5个阶段:内核的引导、运行init、系统初始化、建立终端、用户登录系统。 2、init程序的类型: 1)SysV:init,CentOS 5之前,配置文…

socuretree远程分支没有同步问题

1、选择命令行模式 2、输入git remote update origin --prune 并回车 git remote update origin --prune 是 Git 命令,用于从远程仓库更新本地分支,并删除本地已经不存在于远程仓库的远程跟踪分支

ADP-2-20+ 信号调节 20MHz-2GHzRF功分器 合路器

ADP-2-20 是一款由Mini-Circuits公司出产的功分器(power divider)。这款功分器的工作温度规模为-40C至85C,贮存温度规模为-55C至100C。作为分路器,它的电源输入最高可达1W,内部功耗最大为0.125W。假如超越这些限制&…

【Cesium学习笔记】一、加载Cesium并更换天地图底图

【Cesium学习笔记】一、加载Cesium 一、加载Cesium二、用Viewer显示地球三、更换天地图底图 Ps:本教程所有代码于同一个工程中,运行npm run dev默认首页为App.vue,只需替换App.vue的内容即可切换不同页面。 一、加载Cesium 本项目使用nvm管理node版本&…

李沐23_LeNet——自学笔记

手写的数字识别 知名度最高的数据集:MNIST 1.训练数据:50000 2.测试数据:50000 3.图像大小:28✖28 4.10类 总结 1.LeNet是早期成功的神经网络 2.先使用卷积层来学习图片空间信息 3.使用全连接层来转换到类别空间 代码实现…

Al+医学,用这个中文多模态医学大模型帮你看胸片

随着人工智能技术的飞速发展,AI 在医学领域的应用已经成为现实。特别是在医学影像诊断方面,AI 大模型技术展现出了巨大的潜力和价值,但目前针对中文领域医学大多模态大模型还较少。 今天为大家介绍的这款 XrayGLM,就是由澳门理工…

HackTheBox-Machines--Soccer

文章目录 1 信息收集2 CVE-2021-45010 漏洞利用3 横向移动4 权限提升 Soccer 测试过程 1 信息收集 a.端口扫描:发现22、80、9091端口    b.目录扫描:http://soccer.htb/tiny/    c.子域爆破    d.信息泄漏 nmap -sC -sV 10.129.87.151端口扫描结…

【APUE】网络socket编程温度采集智能存储与上报项目技术------多路复用

作者简介: 一个平凡而乐于分享的小比特,中南民族大学通信工程专业研究生在读,研究方向无线联邦学习 擅长领域:驱动开发,嵌入式软件开发,BSP开发 作者主页:一个平凡而乐于分享的小比特的个人主页…

JVM—jps、jstat、jinfo、jmap、jstack的使用

JVM—jps、jstat、jinfo、jmap、jstack的使用 jps jps全称:Java Virtual Machine Process Status Tool 可以查看Java进程,相当于Linux下的ps命令,只不过它只列出Java进程。 jps:列出Jav程序ID和Main函数名称 jps -q:只输出进程ID jps -m …

【星期计算】蓝桥杯

–> 因为这里是结果填空题,我们直接暴力用java自带的BigInteger类。 /*** 试题 A: 星期计算** 本题总分:5 分* 【问题描述】* 已知今天是星期六,请问20的22次方天后是星期几?* 注意用数字 1 到 7 表示星期一到星期日。* * 【答…

Adobe Photoshop 2024 v25.6强大的图形编辑工具

Adobe Photoshop 2024是一款非常强大的图像处理软件,具有丰富的功能和工具,可以满足各种图像处理需求。 软件下载:Adobe Photoshop 2024 v25.6中文激活版 它不仅支持基本的图像编辑和调整,还具有高级的特性,如智能对象…

自定义类型—结构体

目录 1 . 结构体类型的声明 1.1 结构的声明 1.2 结构体变量的创建与初始化 1.3 结构体的特殊声明 1.4 结构体的自引用 2. 结构体内存对齐 2.1 对齐规则 2.2 为什么存在内存对齐 2.3 修改默认对齐数 3. 结构体传参 4.结构体实现位段 4.1 位段的内存分配 1 . 结构体类…

w1r3s 靶机学习

w1r3s 靶机学习 0x01 IP C for command kali ip 10.10.10.128victim ip 10.10.10.1290x02 开扫 C sudo nmap -sn 10.10.10.0/24-sn 多一步入侵和轻量级侦察 发送四项请求 -sL 列表扫描,多用于探测可用ip,广播扫描 –send-ip 时间戳请求&#xff0…

急!开具数电票,提示风险预警怎么办?

随着数电票试点基本落地全国,越来越多的企业需要开具数电票。但一些财务伙伴在开具数电票时,却收到了风险预警弹窗,这是什么意思呢?财务遇到了该如何处理?今天,百小望和大家聊一聊。 1、什么是红黄蓝预警&a…

Java如何实现的跨平台

其实Java能够实现跨平台主要是依赖于虚拟机。 源代码 首先Java的源代码存在于.java文件中,这些源代码是与平台无关的,这就意味着这些源代码可以在任何一个平台上进行编写。 编译成字节码 通过Java编译器将这些源代码编译成字节码,字节码是…