【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.mzph.cn/web/43680.shtml

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

相关文章

数字高压表0-30kv

最近在制作数字高压表&#xff0c;自己DIY玩玩&#xff0c;有没有朋友一起研究看看

SpringCloud--常用组件和服务中心

常用组件 Euroke和nacos 区别 负载均衡 负载均衡策略有哪些 自定义负载均衡策略

【Red Hat 4.6---详细安装Oracle 19c】---静默方式安装

&#x1f53b; 一、安装前规划 规划项:(本环境) 描述:操作系统版本Red Hat Enterprise Linux Server release 4.6 (Santiago)主机名langtest数据库版本 Oracle 19c IP规划10.10.10.164服务器空间要求根据实际要求数据库名/实例名orcl数据库块大小oracle建库一般设置数据库块大…

物业系统自主研发接口测试框架

1、自主研发框架整体设计 1.1、什么是测试框架? 在了解什么是自动化测试框架之前&#xff0c;先了解一下什么叫框架?框架是整个或部分系统的可重用设计&#xff0c;表现为一组抽象构件及构件实例间交互的方法;另一种定义认为&#xff0c;框架是可被应用开发者定制的应用骨架…

Redis 主从复制,集群与高可用

虽然Redis可以实现单机的数据持久化&#xff0c;但无论是RDB也好或者AOF也好&#xff0c;都解决不了单点宕机问题&#xff0c;即一旦单台 redis服务器本身出现系统故障、硬件故障等问题后&#xff0c;就会直接造成数据的丢失 此外,单机的性能也是有极限的,因此需要使用另外的技…

捷配生产笔记-细间距芯片的表面处理工艺:OSP与沉金工艺的重要性

在现代电子制造领域&#xff0c;随着技术的进步&#xff0c;电子设备变得越来越小型化和高性能化。细间距芯片作为实现这一目标的关键组件&#xff0c;其制造工艺要求极为严格。在这些要求中&#xff0c;表面处理工艺尤为关键&#xff0c;因为它直接影响到芯片的焊接质量和长期…

实验7 数据查询(2)

一、实验目的 学习SQL语言的定义、操纵功能熟悉通过SQL语言对数据库进行查询操作&#xff0c;包括单表查询、多表查询、嵌套查询、集合查询 二、实验软件 MySQL三、实验内容和要求 给定四个关联表&#xff0c;其定义和数据加载如下&#xff1a; 学生表 Student create tab…

Cesium中实现图层组

图层组 某天领导找我&#xff0c;说业务中可能存在多个影像服务为一个图层组&#xff0c;并且需要同时加载和同时在图层列表中上下移动的需求。 例如一些专题地图&#xff0c;包含所有学校、医院、公交站等图层&#xff0c;而这些图层都是单独发布的。 在 Cesium 中确实存在…

前端与嵌入式开发通信之QWebChannel(Qt)

前端与嵌入式开发通信之QWebChannel 最近开发中需要用到和c开发的操作台进行通信的的需求&#xff0c;就找到了这个技术&#xff0c;记录一下 首先需要安装导入 qwebchannel npm i qwebchannel import { QWebChannel } from "qwebchannel"; 初始化qwebchannel并封…

myeclipse开发ssm框架项目图书管理系统 mysql数据库web计算机毕业设计项目

摘 要 随着计算机的广泛应用&#xff0c;其逐步成为现代化的标志。图书馆的信息量也会越来越大&#xff0c;因此需要对图书信息、借书信息、还书信息等进行管理&#xff0c;及时了解各个环节中信息的变更&#xff0c;要对因此而产生的单据进行及时的处理&#xff0c;为了提高高…

智充科技营收增速放缓:经营成本飙升,应收账款大幅增长

《港湾商业观察》黄懿 6月10日&#xff0c; XCHG Limited 智能充电有限公司(下称&#xff1a;智充科技)在美国证监会(SEC)更新招股书&#xff0c;拟在美国纳斯达克上市&#xff0c;其股票代码为“XCH”。北京智充科技有限公司为其国内运营主体&#xff08;下称“北京智充科技”…

Linux-shell编程入门基础

文章目录 前言Shell编程bash特性shell作用域变量环境变量$特殊变量$特殊状态变量 $特殊符号(很重要)其他内置shell命令shell语法的子串截取统计 指令执行时间练习shell特殊扩展变量父子shell的理解内置和外置命令区别 数值计算双括号(())运算letexprexpr模式匹配 bcawk中括号 s…

数据结构(Java):Stack相关OJ习题

1、括号匹配问题 . - 力扣&#xff08;LeetCode&#xff09; 1.1 思路分析 根据栈的先进后出原则&#xff0c;我们可以这样解决问题&#xff1a; 遍历字符串&#xff0c;遇见左括号就将左括号push入栈&#xff1b;遇见右括号就pop出栈&#xff0c;将出栈的元素和该右括号比较…

最简单的vue3组件之间传值

localStorage 是 HTML5 引入的一个 Web Storage API 的一部分&#xff0c;它允许网页在用户的浏览器上存储数据。localStorage 提供了一种持久化的本地存储方案&#xff0c;数据不会因为浏览器关闭而丢失&#xff0c;除非用户或脚本显式地删除它们。 localStorage 是一种非常实…

批量提取网页表格内容至excel文件

问题背景 将网页的表格内容&#xff08;5237个股票信息&#xff09;复制粘贴到excel文件中 网址&#xff1a;A股上市公司名单-A股上市公司名录-A股上市公司大全-商业计划书-可研报告-中商产业研究院数据库-中商情报网 实现代码 # 导入包 import pandas as pd import time# 创…

超越传统:3D生物打印如何利用扩散创造奇迹?

超越传统&#xff1a;3D生物打印如何利用扩散创造奇迹&#xff1f; 组织工程和再生医学领域迫切需要能够模拟人体组织结构和功能的体外模型和组织替代物。然而&#xff0c;传统的体外模型和组织替代物往往难以满足高度特异性、复杂性和功能性的要求。3D生物打印技术应运而生&a…

Base64文件流查看下载PDF方法-CSDN

问题描述 数票通等接口返回的PDF类型发票是以Base64文件流的方式返回的&#xff0c;无法直接查看预览PDF发票&#xff0c; 处理方法 使用第三方在线工具&#xff1a;https://www.jyshare.com/front-end/61/ 在Html代码框中粘贴如下代码 <embed type"application/pd…

技术开发分享:商品详情APP原数据实时接口代码解析

商品详情app端原数据实时接口代码解析主要包括以下几个步骤&#xff1a; 获取商品ID&#xff1a;首先需要从淘宝的分享链接中提取商品ID&#xff0c;可以通过正则表达式匹配的方式获取。 构建请求URL&#xff1a;根据商品ID构建请求URL&#xff0c;通常包括淘宝的商品详情API地…

未来互联网的新篇章:深度解析Web3技术

随着技术的不断演进&#xff0c;Web3正逐渐成为引领未来互联网发展的关键驱动力。本文将深入探讨Web3技术的核心概念、关键特征以及其对未来互联网生态的深远影响&#xff0c;旨在帮助读者全面理解和把握这一新兴技术的发展方向和潜力。 1. Web3的基本概念和演进 Web3并非简单…

为什么键盘上F和J这两个键有两个凸起的横线呢?

不知道小伙伴们有没有注意过&#xff0c;我们常用的电脑键盘上&#xff0c;为什么F和J这两个键总是有两个凸起的横线的呢&#xff1f; 首先&#xff0c;让我们来回顾一下这位陪伴我们多年的老朋友——键盘。从最初的打字机到现在的机械键盘、薄膜键盘&#xff0c;键盘的形态和…