Linux--进程的概念(二)

目录

  • 一、进程的优先级
    • 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.rhkb.cn/news/303341.html

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

相关文章

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 . 结构体类…

idea中jdk版本的配置

配置JDK版本的步骤如下: 下载JDK安装文件:首先,需要从Oracle官方网站(https://www.oracle.com/java/technologies/javase-jdk8-downloads.html)下载适合您操作系统的JDK版本。 安装JDK:双击下载的安装文件…

LangChain-15 Manage Prompt Size 管理上下文大小,用Agent的方式询问问题,并去百科检索内容,总结后返回

背景描述 这一节内容比较复杂: 涉及到使用工具进行百科的检索(有现成的插件)有AgentExecutor来帮助我们执行后续由于上下文过大, 我们通过计算num_tokens,来控制我们的上下文 安装依赖 pip install --upgrade --qu…

Cherno CPP学习笔记-01-背景知识

0、工具网站收集 C语言版本特性 https://en.cppreference.com https://www.cplusplus.com https://www.tutorialspoint.com/cplusplus https://www.learncpp.com https://github.com/fffaraz/awesomecpp https://stackoverflow.com 网页CPP编译器 [C] gcc 12.1.0 - Wa…

SpringBoot集成Skywalking日志收集

在实际项目中,为了方便线上排查问题,尤其是微服务之间调用链路比较复杂的系统中,通过可视化日志的手段仍然是最直接也很方便的排查定位问题的手段,比如大家熟悉的ELK就是一种比较成熟的可视化日志展现方式,在skywalkin…

在Windows电脑上上传iOS应用至App Store

引言 📱 使用UniApp开发iOS应用十分便捷,一套代码即可兼容多个平台。然而,UniApp开发iOS应用需要进行证书打包和将IPA文件上传至App Store,这两个步骤通常需要在Mac电脑上完成。那么,如果我们使用的是Windows开发环境…

Linux:gcc

Linux:gcc gcc概述语言发展史gcc的编译过程预处理编译汇编 gcc的链接过程动态库与静态库 gcc概述 GCC(英文全拼:GNU Compiler Collection)是 GNU 工具链的主要组成部分,是一套以 GPL 和 LGPL 许可证发布的程序语言编译…

C语言 | Leetcode C语言题解之第17题电话号码的字母组合

题目: 题解: char phoneMap[11][5] {"\0", "\0", "abc\0", "def\0", "ghi\0", "jkl\0", "mno\0", "pqrs\0", "tuv\0", "wxyz\0"};char* digits…

【算法】双指针算法

个人主页 : zxctscl 如有转载请先通知 题目 1. 283. 移动零1.1 分析1.2 代码 2. 1089. 复写零2.1 分析2.2 代码 3. 202. 快乐数3.1 分析3.2 代码 4. 11. 盛最多水的容器4.1 分析4.2 代码 5. LCR 179. 查找总价格为目标值的两个商品5.1 分析5.2 代码 6. 15. 三数之和…

MySQL 优化总结

目标知识 MySQL执行流程图 MySQL 优化成本路线图 优化成本&#xff1a;硬件>系统配置>数据库表结构>SQL及索引。优化效果&#xff1a;硬件<系统配置<数据库表结构<SQL及索引。 MySQL 五大优化原则 减少数据返回&#xff1a;设置合理字段数据类型、启用压缩…

C++——list类及其模拟实现

前言&#xff1a;这篇文章我们继续进行C容器类的分享——list&#xff0c;也就是数据结构中的链表&#xff0c;而且是带头双向循环链表。 一.基本框架 namespace Mylist {template<class T>//定义节点struct ListNode{ListNode<T>* _next;ListNode<T>* _pre…

京东云16核64G云服务器租用优惠价格500元1个月、5168元一年,35M带宽

京东云16核64G云服务器租用优惠价格500元1个月、5168元一年&#xff0c;35M带宽&#xff0c;配置为&#xff1a;16C64G-450G SSD系统盘-35M带宽-8000G月流量 华北-北京&#xff0c;京东云活动页面 yunfuwuqiba.com/go/jd 活动链接打开如下图&#xff1a; 京东云16核64G云服务器…

算法四十天-删除排序链表中的重复元素

删除排序链表中的重复元素 题目要求 解题思路 一次遍历 由于给定的链表是排好序的&#xff0c;因此重复的元素在链表中的出现的位置是连续的&#xff0c;因此我们只需要对链表进行一次遍历&#xff0c;就可以删除重复的元素。 具体地&#xff0c;我们从指针cur指向链表的头节…

Netty学习 应用Demo之“自动回复”聊天业务

Netty实现自动回复步骤 主要分成五步 1、创建EventLoopGroup实现循环组 管理EventLoop线程 2、创建Bootstrap &#xff0c;Bootstrap对于服务端而言&#xff0c;先后设置其中的线程组group、通道channel、处理器handler、客户端通道对应的处理器childHandler 3、自定义服务器接…

C#操作MySQL从入门到精通(6)——对查询数据进行排序

前言 在和MySql数据库交互的过程中,查询数据是使用最频繁的操作,并且我们经常需要对查询到的数据进行排序后输出,比如我想查询1列数据的最小值,那么我可以将查询到的数据进行升序(从小到大)排列,然后取第一个数据就是最小值。本文详细介绍了对查询数据进行排序的各种操…

HarmonyOS4-Stage模型

Stage模型介绍【舞台模型】&#xff1a; Stage模型 应用配置文件 全局应用配置文件&#xff1a; 模块配置文件&#xff1a; Ability生命周期 页面及组件的生命周期&#xff1a; 启动模式&#xff1a; "launchType": "multiton" // 会重新建&#xff0c…

本地项目提交 Github

工具 GitIdeaGithub 账号 步骤 使用注册好的 Github 账号&#xff0c;登陆 Github&#xff1b; 创建 Repositories (存储库)&#xff0c;注意填写图上的红框标注&#xff1b; 创建完成之后&#xff0c;找到存储库的 ssh 地址或 https 地址&#xff0c;这取决于你自己的配置…

matlab:有限差分求解纳维尔(Navier)边界的双调和(Biharmonic)方程,边值为零

我们考虑如下形式的双调和方程的数值解 其中&#xff0c;Ω是欧氏空间中的多边形或多面体域&#xff0c;在其中&#xff0c;d为维度&#xff0c;具有分段利普希茨边界&#xff0c;满足内部锥条件&#xff0c;f(x) ∈ L2(Ω)是给定的函数&#xff0c;∆是标准的拉普拉斯算子。算…

javaScript手写专题——实现instanceof/call/apply/bind/new的过程/继承方式

目录 原型链相关 手写instanceof 实现一个_instance方法&#xff0c;判断对象obj是否是target的实例 测试 手写new的过程 实现一个myNew方法&#xff0c;接收一个构造函数以及构造函数的参数&#xff0c;返回构造函数创建的实例对象 测试myNew方法 手写类的继承 ES6&…