【Linux】进程优先级 + 环境变量

前言
在了解进程状态之后,本章我们将来学习一下进程优先级,还有环境变量等。。

目录

    • 1.进程优先级
      • 1.1 为什么要有优先级?
    • 2.进程的其他概念
    • 2.1 竞争性与独立性
    • 2.2 并行与并发
    • 2.3 进程间优先级的体现:
      • 2.3.1 O(1) 调度算法:
      • 2.4 进程上下文:
    • 3 .环境变量
      • 3.1 环境变量的概念:
      • 3.2 常用的环境变量:
      • 3.3 环境变量指令:
      • 3.4 linux修改环境变量的方法:
      • 3.5 通过代码如何获取环境变量:
        • 3.5. 1 **环境变量的组织方式**
        • 3.5. 2 方法一:main函数的第三个参数
        • 3.5. 3 方法二:通过C语言第三方变量environ获取
        • 3.5. 4 方法三:通过系统调用获取或设置环境变量
      • 3.6 环境变量通常是具有全局属性的

1.进程优先级

1.1 为什么要有优先级?

因为CPU是有限的,进程太多,需要通过某种方式竞争资源!Linux系统中进程占大多数,而资源是少数! 所以,进程竞争资源是常态!一定需要确认先后顺序

  • cpu资源分配的先后顺序,就是指进程的优先权(priority)。
  • 优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用,可以改善系统性能。
  • 还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整体性能
  • 什么是优先级?

就是确认是谁应该先获得某种资源,谁后获得
在Linux系统中,一般一个服务,是专属专机。优先级是操作系统是最清楚的(在创建进程task_struct时),你自己改的,并一定按照这个操作来的。(一般不需要调整的)
计算机为了保证每个进程能够,尽可能平均的使用进程,所以nice的调整范围只有40个。(-20~ 19)

  • Linux优先级的构成
  1. priority(PRI) + nice
    PRI(new)=PRI(old)+nice
  2. 需要强调一点的是,进程的nice值不是进程的优先级,他们不是一个概念,但是进程nice值会影响到进 程的优先级变化。
  3. 可以理解nice值是进程优先级的修正修正数据

注意:

  • 虽然我们可以对Linux进程的优先级进行修改

  • 但是Linux不允许进程无节制的设置优先级

  • 用top命令更改已存在进程的nice

输入top
进入top后按“r”–>输入进程PID–>输入nice值

  • nice值的修改并不是无节制的,是有一定取值范围的;nice [-20, 19] prio [60,99]

  • 当我们设置完该进程的pri为60之后,再次对该进程的nice进行修改,此时pri会再次恢复到80!!

    prio = prio_old + nice

2.进程的其他概念

2.1 竞争性与独立性

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

当一个进程在使用资源的时候,是不允许别的进程也来使用该资源的基本上所有的外设和CPU都是这样子的。

独立性: 多进程运行,需要独享各种资源,多进程运行期间互不干扰,进程运行是有独立性的。
进程运行具有独立性,不会因为一个进程挂掉或者异常,而导致其他进程出现问题!
使用STL将对象放到各种容器中,就像在linux系统当中,将PCB放来是一个道理。

2.2 并行与并发

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

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

  • 不要以为进程一旦占有CPU,就会一直执行到结束,才会释放CPU资源!
  • 我们遇到的大部分操作系统都是分时的
  • 在一个时间片内,多个进程都会通过切换交叉的方式,让多个进程代码,在一段时间内,都得到推进
  • 例如一个进程,只能在CPU内执行10ns ,就要从CPU上扒下来,让其他的进程来执行
  • 这种现象,叫做并发
    在这里插入图片描述

2.3 进程间优先级的体现:

操作系统,就是简单的根据队列来进行先后调度的嘛,有没有可能突然来了一个优先级更高的进程。。
当代计算机都具有的一种机制:抢占式内核!

正在运行的低优先级进程,但如果来个优先级更高的进程,我们的调度器会直接把进程从CPU上剥离,放上优先级更高的进程,进程抢占。

进程抢占:

有可能进程正在跑,突然来了个优先级更高的进程,操作系统直接就把这个进程扒下来了,让优先级更高的进程来跑。

2.3.1 O(1) 调度算法:

这里我们就简单介绍一下:

  • 允许不同优先级的进程存在
  • 相同优先级的进程,是可能存在多个的!

而我们之前学习过数据结构,我们知道队列是先进先出的,是不允许随意插入的,那么优先级如何体现出来呢?
操作系统采用的是哈希的数据结构.
在这里插入图片描述
根据不同的优先级,将特定的进程放入不同的队列中!

2.4 进程上下文:

CPU一定具有把数据暂时保存起来的能力。
CPU内的寄存器更多是用来保存一些临时数据。
CPU内的寄存器是:可以临时的存储数据,非常少,但是非常重要。
在这里插入图片描述

int func()
{int a = 10 + 20;return a;
}int main()
{int ret = func();return 0;
}

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

  • 当进程被剥离:需要保存上下文数据
  • 当进程恢复的时候:需要将曾经保存的上下文数据恢复到寄存器中
    上下文在哪里保存呢?—— task struct

task_struct- PCB的一种

在Linux中描述进程的结构体叫做task_struct。
task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息

在这里插入图片描述

3 .环境变量

3.1 环境变量的概念:

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

3.2 常用的环境变量:

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

3.3 环境变量指令:

显示某个环境变量值:echo $path

echo $NAME //NAME:你的环境变量名称

查看系统的所有环境变量:env
设置一个新的环境变量:export / (直接使用环境变量名)如 :Path
unset: 清除环境变量
Set: 显示本地定义的shell变量和环境变量

Linux export :命令用于设置或显示环境变量
在这里插入图片描述
解释:

环境变量PATH里面有多种变量,中间用冒号:分割开,其中我们在执行某个程序时:例如在执行Is时, 当识别到有Is输入时,
会在上面的路径中一个一个的搜索,只要在特定路径下找到了Is,就会执行特定路径下的Is,执行完就停止搜索不再往后走了,换言之PATH就提供了可执行程序搜索的路径。Is或者是很多指令在PATH里面是可以被找到的。

3.4 linux修改环境变量的方法:

  • 方式1:
    export PATH=$PAHT:/home/路径
    //临时修改,只对当前终端生效,立即生效 终端一关闭,就失效了

  • 方式2:
    修改 家目录下的 .bashrc 文件
    这个文件每个用户都有,都放在自己的家目录下
    用户每次登录时,都会加载(执行)这个文件
    所以,将export XXX=$XXX:xxx 放到.bashrc这个文件中
    就会对当前用户一直生效了
    修改.bashrc文件后 需要重新登录(重新打开终端 才会生效)
    或者 执行 source .bashrc 就可以立即生效了

  • 方式3:
    -修改系统时会加载的文件 如 /etc/environment 或者 /etc/profile
    因为这些文件在系统启动时候会被执行
    所以在这些文件中修改环境变量,没次启动系统都生效
    因为用户修改环境变量时 都是以 PATH=$PATH:的方式追加的
    所以每个用户第一次修改时取的基本变量值都是他
    所以修改这些文件,是对所有用户有效的
    重启生效
    或者执行 source /etc/profile source /etc/environment 生效

3.5 通过代码如何获取环境变量:

  • main函数可以带参数吗?可以带多少?

    我们先来看main函数带两个参数:

#include <stdio.h>int main(int argc, char* argv[]) 
{int i = 0;for(i = 0; i < argc; i++){printf("argv[%d]: %s\n", i, argv[i]);}return 0;
}

在这里插入图片描述
在这里插入图片描述

  • char* argv[]是个指针数组,而int argc则是指针数组中元素的个数。
  • 可执行程序和选项都是字符串,最后都以指针数组的方案存在了指针数组中。
  • 指针数组中存的是字符串的起始地址
  • 最后以NULL(’\0’)结尾
3.5. 1 环境变量的组织方式

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

3.5. 2 方法一:main函数的第三个参数
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>void func(void)
{printf("hehe\n");
}int main(int argc, char* argv[], char* env[])
{//func(1, 1);int i = 0;for(i = 0; env[i]; i++){printf("env[%d]: %s\n", i, env[i]);}return 0;
}

在这里插入图片描述

  • char* env[]也是个指针数组
  • 数组里的每个元素都是指向一个字符串,每个字符串就是一个环境变量
  • 最后以NULL结尾
3.5. 3 方法二:通过C语言第三方变量environ获取
int main()
{extern char** environ;for (int i = 0; environ[i]; i++){printf("%d: %s\n", i, environ[i]);}return 0;
}

libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头文件中,所以在使用时 要用extern声明。

3.5. 4 方法三:通过系统调用获取或设置环境变量
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("%s\n", getenv("PATH"));
return 0;
}

常用getenv和putenv函数来访问特定的环境变量。

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

  • 环境变量通常具有全局属性,可以被子进程继承下去。
  • 如果只进行 MYENV=“helloworld” ,不调用export导出,在用我们的程序查看,会有什么结果?为什
    么? 普通变量 不会被子进程继承下去
#include <stdio.h>
#include <stdlib.h>
int main()
{
char * env = getenv("MYENV");
if(env){
printf("%s\n", env);
}
return 0;
}

直接查看,发现没有结果,说明该环境变量根本不存在

导出环境变量 export MYENV=“hello world”
再次运行程序,发现结果有了!说明:环境变量是可以被子进程继承下去的!想想为什么

尾声
看到这里,相信大家对这个C++有了解了。
如果你感觉这篇博客对你有帮助,不要忘了一键三连哦

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

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

相关文章

【IMU】 确定性误差与IMU_TK标定原理

1、确定性误差 MEMS IMU确定性误差模型 K 为比例因子误差 误差来源:器件的输出往往为脉冲值或模数转换得到的值,需要乘以一个刻度系数才能转换成角速度或加速度值,若该系数不准,便存在刻度系数误差。 T 为交轴耦合误差 误差来源:如下图,b坐标系是正交的imu坐标系,s坐标系的三…

跨境干货|最新注册Google账号方法分享

谷歌账号对做跨境外贸业务的人来说是刚需&#xff0c;目前来说大部分的海外社媒平台、工具都可以用谷歌账号来注册。但是仍然有很多朋友并不知道如何注册这个谷歌账号&#xff0c;今天就来给大家分享2个注册谷歌账号的方法&#xff0c;一个是手机号注册&#xff0c;一个是如何跳…

SpringBoot+mail 轻松实现各类邮件自动推送

一、简介 在实际的项目开发过程中&#xff0c;经常需要用到邮件通知功能。例如&#xff0c;通过邮箱注册&#xff0c;邮箱找回密码&#xff0c;邮箱推送报表等等&#xff0c;实际的应用场景非常的多。 早期的时候&#xff0c;为了能实现邮件的自动发送功能&#xff0c;通常会…

Ubuntu 22.04.4 LTS 安装配置 MySQL Community Server 8.0.37 LTS

1 安装mysql-server sudo apt update sudo apt-get install mysql-server 2 启动mysql服务 sudo systemctl restart mysql.service sudo systemctl enable mysql.service #查看服务 sudo systemctl status mysql.service 3 修改mysql root密码 #默认密码为空 sudo mysql …

基于Android Studio订餐管理项目

目录 项目介绍 图片展示 运行环境 获取方式 项目介绍 能够实现登录&#xff0c;注册、首页、订餐、购物车&#xff0c;我的。 用户注册后&#xff0c;登陆客户端即可完成订餐、浏览菜谱等功能&#xff0c;点餐&#xff0c;加入购物车&#xff0c;结算&#xff0c;以及删减…

【Spring Cloud】微服务的简单搭建

文章目录 &#x1f343;前言&#x1f384;开发环境安装&#x1f333;服务拆分的原则&#x1f6a9;单一职责原则&#x1f6a9;服务自治&#x1f6a9;单向依赖 &#x1f340;搭建案例介绍&#x1f334;数据准备&#x1f38b;工程搭建&#x1f6a9;构建父子工程&#x1f388;创建父…

LabVIEW幅频特性测试系统

使用LabVIEW软件开发的幅频特性测试系统。该系统整合了Agilent 83732B信号源与Agilent 8563EC频谱仪&#xff0c;通过LabVIEW编程实现自动控制和数据处理&#xff0c;提供了成本效益高、操作简便的解决方案&#xff0c;有效替代了昂贵的专用仪器&#xff0c;提高了测试效率和设…

聊天室时间构思

记得选择数据库的Data.sql 如果有一方发信息&#xff0c;显示时间&#xff0c;显示发送信息 设置计时器&#xff0c;如果在一分钟&#xff0c;60*1000L毫秒有回复&#xff0c;不显示时间&#xff0c;否则显示时间在显示信息 具体就看哔哩哔哩哔哩哔哩 设置两个时间&#xff0…

短视频博主:成都柏煜文化传媒有限公司

短视频博主&#xff1a;数字时代的新星&#xff0c;创意与梦想的舞台 在移动互联网的浪潮中&#xff0c;短视频以其独特的魅力迅速崛起&#xff0c;成为连接亿万用户、展现生活百态的重要窗口。成都柏煜文化传媒有限公司 而在这片充满无限可能的土地上&#xff0c;短视频博主…

QCustomPlot+ vs2022+ qt

零、printSupport 步骤一&#xff1a;下载QCustomPlot 访问QCustomPlot的官网 QCustomPlot 下载最新版本的源代码。 步骤二&#xff1a;配置项目 创建新的Qt项目&#xff1a; 打开VS2022&#xff0c;创建一个新的Qt Widgets Application项目。 将QCustomPlot源代码添加到项目…

MySQL基础篇(二)字符集以及校验规则

在MySQL基础篇&#xff08;一&#xff09;中&#xff0c;我们知道了如何创建数据库&#xff0c;这篇文章带大家了解创建的一些细节。 红色框&#xff1a;可省略&#xff0c;作用如果存在相同的数据库名称&#xff0c;就不会再创建&#xff0c;反之&#xff0c;创建。 蓝色框&…

鸿蒙应用实践:利用扣子API开发起床文案生成器

前言 扣子是一个新一代 AI 应用开发平台&#xff0c;无需编程基础即可快速搭建基于大模型的 Bot&#xff0c;并发布到各个渠道。平台优势包括无限拓展的能力集&#xff08;内置和自定义插件&#xff09;、丰富的数据源&#xff08;支持多种数据格式和上传方式&#xff09;、持…

星光云VR全景系统源码

星光云VR全景系统源码 体验地址请查看

使用flask的web网页部署介绍

使用flask的web网页部署介绍 文章目录 前言一、网页介绍二、数据库设计介绍总结 前言 flaskbootstrapjquerymysql搭建三叶青在线识别网站&#xff0c;使用nginxgunicorn将网站部署在腾讯云上&#xff0c;配置SSL证书。网站地址&#xff1a;https://www.whtuu.cn 三叶青图像识…

STM32-输入捕获IC和编码器接口

本内容基于江协科技STM32视频学习之后整理而得。 文章目录 1. 输入捕获IC1.1 输入捕获IC简介1.2 频率测量1.3 输入捕获通道1.4 主从触发模式1.5 输入捕获基本结构1.6 PWMI基本结构 2. 输入捕获库函数及代码2.1 输入捕获库函数2.2 6-6 输入捕获模式测频率2.2.1 硬件连接2.2.2 硬…

Appium启动APP时报错Security exception: Permission Denial

报错内容Security exception: Permission Denial: starting Intent 直接通过am命令尝试也是同样的报错 查阅资料了解到&#xff1a;android:exported | App quality | Android Developers exported属性默认false&#xff0c;所以android:exported"false"修改为t…

ubuntu下运行程序时提示缺库问题的有效解决方法

目录 一、问题现象二、解决方式三、总结 一、问题现象 当我们平时在ubuntu上运行一个程序时时长会遇到如下情况&#xff0c;含义为本机缺少执行程序需要的库 这时候我们可能会根据缺少的库使用apt install 库名的模糊名字 进行安装&#xff0c;然后再去运行&#xff0c;此时可…

永磁同步电机控制算法--最大转矩电流比控制(虚拟信号注入法)

目前&#xff0c;国内外相关学者对 MTPA 控制方法进行了一系列的理论研究与仿真分析。通过研究取得的成果综合来看&#xff0c;该控制方法主要有&#xff1a;直接公式计算法、曲线拟合法、查表法、搜索法、高频信号注入法以及参数辨识法等。 之前的文章中已经介绍了直接公式计…

时间处理的未来:Java 8全新日期与时间API完全解析

文章目录 一、改进背景二、本地日期时间三、时区日期时间四、格式化 一、改进背景 Java 8针对时间处理进行了全面的改进&#xff0c;重新设计了所有日期时间、日历及时区相关的 API。并把它们都统一放置在 java.time 包和子包下。 Java5的不足之处&#xff1a; 非线程安全&…

Pycharm远程连接GPU(内容:下载安装Pycharm、GPU租借、配置SSH、将代码同步到镜像、命令行操控远程镜像、配置远程GPU解释器)

目录 windows下载安装pycharmGPU租借网站AutoDlfeaturize好易智算 GPU租借GPU选择选择镜像充值 然后创建镜像创建成功 复制SSH登录信息 远程进入镜像 在Pycharm中进行ssh连接新建SFTP配置SSH复制ssh根据复制的信息填写ssh配置测试连接 将代码同步到远程镜像上设置mappings将本地…