【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++有了解了。
如果你感觉这篇博客对你有帮助,不要忘了一键三连哦

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

202406 CCF-GESP Python 四级试题及详细答案注释

202406 CCF-GESP Python 四级试题及详细答案注释 1 单选题(每题 2 分,共 30 分)第 1 题 小杨父母带他到某培训机构给他报名参加CCF组织的GESP认证考试的第1级,那他可以选择的认证语言有几种?( ) A. 1 B. 2 C. 3 D. 4答案:C解析:目前CCF组织的GESP认证考试有C++、Pyth…

Element中的表格组件Table和分页组件Pagination

简述&#xff1a;在 Element UI 中&#xff0c;Table组件是一个功能强大的数据展示工具&#xff0c;用于呈现结构化的数据列表。它提供了丰富的特性&#xff0c;使得数据展示不仅美观而且高效。而Pagination组件是一个用于实现数据分页显示的强大工具。它允许用户在大量数据中导…

【OJ】运行时错误(Runtime Error)导致递归爆栈问题

在进行OJ赛时&#xff0c; 题目&#xff1a;给你一个整数n&#xff0c;问最多能将其分解为多少质数的和。在第一行输出最多的质数数量k,下一行输出k个整数&#xff0c;为这些质数。 出现运行时错误 代码如下&#xff1a; def main():# code heren int(eval(input()))list …

RabbitMQ中常用的三种交换机【Fanout、Direct、Topic】

目录 1、引入 2、Fanout交换机 案例&#xff1a;利用SpringAMQP演示Fanout交换机的使用 3、Direct交换机 案例&#xff1a;利用SpringAMQP演示Direct交换机的使用 4、Topic交换机 案例&#xff1a;利用SpringAMQP演示Topic交换机的使用 1、引入 真实的生产环境都会经过e…

Apache Seata分布式事务原理解析探秘

本文来自 Apache Seata官方文档&#xff0c;欢迎访问官网&#xff0c;查看更多深度文章。 本文来自 Apache Seata官方文档&#xff0c;欢迎访问官网&#xff0c;查看更多深度文章。 前言 fescar发布已有时日&#xff0c;分布式事务一直是业界备受关注的领域&#xff0c;fesca…

【Mysql】记录MySQL中常见的错误代码及可能原因

希望文章能给到你启发和灵感&#xff5e; 如果觉得文章对你有帮助的话&#xff0c;点赞 关注 收藏 支持一下博主吧&#xff5e; 阅读指南 开篇说明一、基础环境说明1.1 硬件环境1.2 软件环境 二、常见的问题2.1 连接和认证相关2.2 权限相关2.3 表和数据操作相关2.4 资源限制和…

我使用HarmonyOs Next开发了b站的首页

1.实现效果展示&#xff1a; 2.图标准备 我使用的是iconfont图标&#xff0c;下面为项目中所使用到的图标 3. 代码 &#xff08;1&#xff09;Index.ets&#xff1a; import {InfoTop} from ../component/InfoTop import {InfoCenter} from ../component/InfoCenter import…

文章解读与仿真程序复现思路——太阳能学报EI\CSCD\北大核心《计及电-热-氢负荷与动态重构的主动配电网优化调度》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

Linux 搭建 Kafka 环境 - 详细教程

目录 一. Kafka介绍 1. 应用场景 2. 版本对比 二. Kafka安装 1. 前置环境 &#xff08;1&#xff09;安装JDK 2. 软件安装 &#xff08;3&#xff09;环境变量配置 &#xff08;3&#xff09;服务启动 三. Console测试 基础命令 &#xff08;1&#xff09;列出Kafk…

PLC电源模块

PM电源模块 为CPU信号模块及 其他的扩展设备、其他用电设备&#xff08;如传感器&#xff09;提供工作供电 接线和开关 状态显示 灯的闪烁示意看手册 PS电源模块 为CPU信号模块及其他的扩展设备提供工作供电。PS(System Power Supply) 外形与PM电源模块类似&#xff0c;状…

PLC【搭建服务端】

PLC搭建服务端 文章目录 PLC搭建服务端前言一、搭建PLC服务器二、打开ModSean32获取数据总结 前言 使用博图V16编写PLC搭建服务器&#xff0c;使用 ModSean32 读取其中数据 一、搭建PLC服务器 打开博图V16点击项目进行新建&#xff0c;编辑好项目名称、及项目路径&#xff0c…

Netty 启动源码阅读

文章目录 1. 入门2. Netty 代码实例3. Netty bind3.1 initAndRegister3.1.1 newChannel, 创建 NioServerSocketChannel3.1.2 init(channel); 初始化 NioServerSocketChannel3.1.3 register 注册channel 3.2 doBind0 绑定端口3.3 ServerBootstrapAcceptor 1. 入门 主从Reactor模…

MATLAB制作一个简单的函数绘制APP

制作一个函数绘制APP&#xff0c;输入函数以及左右端点&#xff0c;绘制出函数图像。 编写回调函数&#xff1a; 结果&#xff1a;

HTML 【实用教程】(2024最新版)

核心思想 —— 语义化 【面试题】如何理解 HTML 语义化 ?仅通过标签便能判断内容的类型&#xff0c;特别是区分标题、段落、图片和表格 增加代码可读性&#xff0c;让人更容易读懂对SEO更加友好&#xff0c;让搜索引擎更容易读懂 html 文件的基本结构 html 文件的文件后缀为 …

移动硬盘“需格式化”预警:专业数据恢复指南

移动硬盘“需格式化”危机&#xff1a;了解背后的真相 在日常的数字生活中&#xff0c;移动硬盘作为我们存储重要数据的“保险箱”&#xff0c;其稳定性与安全性直接关系到我们信息的完整与便捷访问。然而&#xff0c;当您尝试打开移动硬盘时&#xff0c;屏幕上赫然出现的“需…

科技赋能智慧应急:“数字孪生+无人机”在防汛救灾中的应用

近期&#xff0c;全国多地暴雨持续&#xff0c;“麻辣王子工厂停工”“水上派出所成水上的派出所了”等相关词条冲上热搜&#xff0c;让人们看到了全国各地城市内涝、洪涝带来的严重灾情。暴雨带来的影响可见一斑&#xff0c;潜在的洪水、泥石流、山体滑坡等地质灾害更应提高警…

aardio —— 今日减bug

打字就减bug 鼠标双击也减bug 看看有多少bug够你减的 使用方法&#xff1a; 1、将资源附件解压缩&#xff0c;里面的文件夹&#xff0c;放到aardio\plugin\plugins 目录 2、aardio 启动插件 → 插件设置 → 选中“今日减bug” → 保存。 3、重启 aardio&#xff0c;等aa…

BUUCTF[PWN][fastbin attack]

fastbin_attack例题 题目&#xff1a;[BUUCTF在线评测 (buuoj.cn)](https://buuoj.cn/challenges#[ZJCTF 2019]EasyHeap) 整体思路&#xff1a;利用编辑时edit_heap函数的栈溢出漏洞&#xff0c;覆盖heaparray中的栈指针指向free的got表&#xff0c;将其改为system的plt表&…

make工具

1、什么是make&#xff1f; make是个命令&#xff0c;是个可执行程序&#xff0c;是个工具&#xff0c;用来解析Makefile文件的命令&#xff0c;这个命令存放在/usr/bin/目录下 -rwxr-xr-x 1 root root 250K 2月 15 2022 make -rwxr-xr-x 1 root root 4.8K 2月 15 2022 ma…

Linux_实现简易日志系统

目录 1、认识可变参数 2、解析可变参数 3、打印可变参数 3.1 va_list 3.2 va_start 3.3 va_arg 3.4 va_end 3.5 小结 4、实现日志 4.1 日志左半部分 4.2 日志右半部分 4.3 日志的存档归类 结语 前言&#xff1a; 在Linux下实现一个日志系统&#xff0c;该日…