Linux_进程的优先级环境变量上下文切换

文章目录

    • 一、进程的优先级
    • 二、进程的四个重要概念
    • 三、上下文切换
    • 四、环境变量
      • 4.1 查看当前shell环境下的环境变量与内容

一、进程的优先级

  • 什么是优先级?

    • 指定一个进程获取某种资源的先后顺序
    • 本质是进程获取cpu资源的优先顺序
  • 为什么要有优先级

    • 进程访问的资源(CPU)是有限的

操作系统关于调度和优先级的原则:分时操作系统,基本的公平,如果进程因为长时间不被调整,就造成了饥饿问题

  • Linux的优先级特点以及查看方式

  • 查看进程的优先级
ps -lA

在这里插入图片描述

  • PRI:进程优先级
  • NI:进程优先级的修正数据

  • 其中PRI值越低优先级越高

  • 因为PRI值是由操作系统内核动态调整的,我们无法直接去调整这个值,所以我们必须通过nice值去调整它。nice值就是上图PRI后面NI。

  • 因为PRI是系统内核去动态调整的,我们修改后需要经过内核的允许,如果这个PRI值超过了内核的最大限度,那么这个值就会保留在临界值

  • 我们的计算公式为:新的PRI = 进程默认PRI + nice值,这个nice值有正负数,我们可以举一个例子:一个进程的PRI为80,我们给NI值为-10,再根据上面的公式得出新的PRI为70


  • 那么如何修改呢?我们可以写一个代码来看一下:
#include<stdio.h>
int main()
{
  while(1){
  }
  return 0;
}

  • 我们可以查看它的PRI和NI值

在这里插入图片描述

  • 我们可以通过下面的命令进行修改

  • number为想要的nice值,PID为要操作的进程

renice [number] [PID]               
  • 首先查看一下该进程的id

在这里插入图片描述

  • 然后进行修改~

在这里插入图片描述

  • 修改后就变成了PRI是70,NI是-10

在这里插入图片描述

二、进程的四个重要概念

  • 竞争性:因为cpu资源优先,所以进程难免会存在竞争行为,具体体现在优先级上。
  • 独立性:进程运行期间,各个进程是不会相互干扰的,即使是父子进程。
  • 并行:当有多个cpu时,这些cpu同时处理多个进程的行为叫做并行。
  • 并发:在一段时间内,每个进程都可以被cpu处理一部分指令,这种行为称为并发。

假设cpu处理一个进程的时间为1秒,那么1个cpu处理99个进程的时间就是99秒。但是当有一台拥有3个cpu的计算机处理这99个进程时,只需要33秒。这就是并行,多个cpu同时处理多个进程。

三、上下文切换

  • 每个任务运行前,CPU 都需要知道任务从哪里加载、又从哪里开始运行,这就涉及到 CPU 寄存器 和 程序计数器(PC):

如何切换?

  • 将前一个 CPU 的上下文(也就是 CPU 寄存器和程序计数器里边的内容)保存起来;
  • 然后加载新任务的上下文到寄存器和程序计数器;
  • 最后跳转到程序计数器所指的新位置,运行新任务。

被保存起来的上下文会存储到系统内核中,等待任务重新调度执行时再次加载进来。

CPU 的上下文切换分三种:进程上下文切换、线程上下文切换、中断上下文切换。

  • 把临时数据转存到操作系统的行为叫做上下文保护,把临时数据写回寄存器内的行为叫做上下文恢复。

四、环境变量

  • 我们对于Linux的理解,指令就是程序,我们写的C语言代码也是一个程序,那么有一个问题,为什么Linux的指令他直接就可以在bash(终端)上运行,为什么我们写的代码生成的可执行文件

在这里插入图片描述

  • 在我们运行程序的时候,需要知道此程序在哪个位置

  • 在Linux的中的命令,它为什么不需要指定路径来执行呢?是因为有个叫【PATH】的环境变量,在我们输入指令后,会在指定路径下查找,如果找不到要执行的指令就会返回错误【command not found】

在这里插入图片描述

  • 因为【PATH】变量没有记录我们输入的指令的位置信息,所以我们必须手动指定指令的位置。那么我们可以总结出指令(程序)是如何执行的

  • 我们可以查看一下PATH下有哪些路径
echo $PATH

在这里插入图片描述

  • 可以看到上面是有各种路径每个路径是一下【:】分割,我们可以看到有一个/usr/bin目录,那么我们写的这个程序也就可以拷贝到这个目录下就可以不指定路径直接执行了
  • 第二个方法是将我当前这个目录的路径添加到这个环境变量中,这样也可以

  • 我们可以用下面的这条指令来修改系统变量
export PATH=路径

在这里插入图片描述

  • 发现我们刚刚查看的变量不在了,ls也无法执行了

在这里插入图片描述

  • 这个时候不要慌,我们可以另外再开一个终端再看

在这里插入图片描述

  • 那么我们如何正确的向[PATH]添加一个路径呢?我们用到下面的指令:
export PATH=$PATH:路径
  • 这就完成了添加一个环境变量的操作

在这里插入图片描述

  • 那么为什么新开了一个终端它就又恢复了呢?

    • 这是因为在我们默认查看的环境变量是内存级
    • 最开始的环境变量不是在内存中,是在对应的配置文件中,登录Linux系统的时候它会首先加载到bash进程中(内存)
  • 那么这个配置文件在哪?

.bash_profile # 当前登录用户环境变量
.bashrc       # 当前登录用户环境变量
/etc/bashrc   # 全局环境变量

4.1 查看当前shell环境下的环境变量与内容

env

在这里插入图片描述

  • 环境变量是随着启动操作系统时生成的,也就是说,环境变量是属于bash的。

  • 指令是一个程序,在bash上执行,那么这个程序就是bash的子进程

  • 我们平时所用的pwd命令就是有一个环境变量叫pwd,这个环境变量存储着用户当前的所在位置

在这里插入图片描述


  • 我们也可以自己实现一个pwd指令

  • 在实现的时候需要了解一个函数getenv,我们用man手册查看一下

在这里插入图片描述

#include<stdio.h>
#include<stdlib.h>
int main()
{
  char* ret = getenv("PWD");
  printf("%s\n",ret);
  return 0;
}
  • 可以看到我们就实现了这个

在这里插入图片描述

  • 我们在bash上运行的程序,是bash的子进程,而环境变量是属于bash的,子进程为什么能用父进程的环境变量?这是因为,子进程可以继承父进程的环境变量!并且,环境变量一定是全局属性的!

  • 在子进程是如何继承环境变量的?子进程是不是有一个主函数?这个主函数我们平时使用时是没有参数的,但实际上它是可以带参数的!还能带三个!
#include<stdio.h>
#include<stdlib.h>
int main(int argc, char* argv[], char* environ[])
{
  return 0;
}
  • 第一个参数代表的意思为:指令参数的个数(包括指令);
  • 第二个参数代表的意思为:指令参数的指针数组(因为指令参数是一个字符串);
  • 第三个参数代表的意思为:环境变量的指针数组(因为环境变量是一个字符串)。我们一般不使用第三个参数,而是使用操作系统提供的外部的指针数组指针【char** environ】或者是系统提供的接口函数getenv()

  • 我们就可以实现一个带参数的指令,就像ls类似的
#include <stdio.h>
#include <string.h>
int main(int argc,char* argv[])
{
    if(argc < 2)
    {
        printf("指令参数太少!\n");
        return 1;
    }
    if(strcmp(argv[1],"-a")==0)
    {
        printf("执行-a\n");
    }
    else if(strcmp(argv[1],"-b")==0)
    {
        printf("执行-b\n");
    }
    else
    {
        printf("指令有误!\n");                                                                                                                                                        
    }
    return 0;
}

在这里插入图片描述

  • 我们可以再写一个代码来验证一下
#include <stdio.h>
#include <string.h>
int main(int argc,char* argv[])
{
    printf("%d\n",argc);
    int i=0;                                                                                                                                                                           
    for(i=0;i<argc;i++)
    {
        printf("%s\n",argv[i]);
    }
    return 0;
}

在这里插入图片描述

  • 从上面 可以看出 [argc]是存储指令参数的个数的(包括指令),[char* argv[]]这个指针数组是存储指令参数的(包括指令)

  • 对于第三个参数,是一个指针数组,存储的是各个环境变量的内容,因为这些内容是字符串常量,而表示字符串常量通常使用其首字符地址

  • 我们是很少使用第三个参数的,因为这个数组存储了所有的环境变量,想要找到特定的环境变量还是挺困难的,那么我们使用这段代码,证明第三个参数存储了环境变量:

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

在这里插入图片描述

  • 或者使用另一种写法可以完成
#include <stdio.h>
#include <string.h>
int main(int argc,char* argv[])
{
    extern char** environ;
    int i=0;                                                                                                                                                                         
    for( i=0;environ[i];i++)
    {
        printf("[%d]-->%s\n",i,environ[i]);
    }
    return 0;
}

在这里插入图片描述

  • 环境变量是具有全局属性的,也就意味着子进程只能继承父进程的具有全局属性的环境变量。称作本地变量。如何设置本地变量呢?我们只需要在bash上面按这个格式敲指令:

  • 变量中间不能有空格

[变量名]=[内容]       

在这里插入图片描述

  • 我们发现使用env来查看我们设置的变量,并不能显示出结果,证明了我们刚刚设置的变量是本地变量

  • 但是使用【echo】命令还可以查看到,因为echo是可以操作环境变量的,所用echo命令是可以操作所有的变量的,不管是本地变量还是环境变量。

  • 子进程并没有继承父进程的本地变量,那我们如何使本地变量变成环境变量呢?我们输入下面这个指令:

export [变量名称]     

在这里插入图片描述

  • 现在我们学会了如何设置本地变量和如何把本地变量转换成环境变量了。那么如何查看本地变量呢,或者说如何查看所有的变量呢?我们使用下面这条命令:
set

在这里插入图片描述

  • 取消变量可以使用下面这条命令
unset [变量名]

在这里插入图片描述

最后,本文学习了Linux_进程的优先级&&环境变量&&上下文切换,感谢收看

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

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

相关文章

矩阵空间秩1矩阵小世界图

文章目录 1. 矩阵空间2. 微分方程3. 秩为1的矩阵4. 图 1. 矩阵空间 我们以3X3的矩阵空间 M 为例来说明相关情况。目前矩阵空间M中只关心两类计算&#xff0c;矩阵加法和矩阵数乘。 对称矩阵-子空间-有6个3X3的对称矩阵&#xff0c;所以为6维矩阵空间上三角矩阵-子空间-有6个3…

mysql 基本查询

学习了mysql函数&#xff0c;接下来学习mysql基本查询。 1&#xff0c;基本查询语句 MySQL从数据表中查询数据的基本语句为SELECT 语句。SELECT语句的基本格式是&#xff1a; SELECT (*I <字段列表>} FROM <表1>,<表2>..[WHERE<表达式> [GROUP BY <…

VUE——概述

vue是前端框架&#xff0c;基于MVVM思想。 引入 从官网下载vue文件 <script src"js/vue.js"></script> 定义vue对象 new Vue({el: "#x",//vue接管区域&#xff0c;#表示选择器&#xff0c;x是id名字data: {message: "y"} })案例…

宁波ISO45001认证费用

宁波ISO45001认证费用&#x1fae0;是许多企业在考虑&#x1f914;引入国际职业健康安全管理体系时&#x1f566;所关心的一个⁉️重要问题。ISO45001是一个&#x1f30f;全球性的标准&#xff0c;旨在帮助&#x1f3ef;组织建立并维护一个&#x1f388;有效的职业健康安全⭐️…

Flask学习(五):session相关流程

流程图如下图所示&#xff1a; 调用相关类如下图所示&#xff1a; 相关代码如下&#xff1a; from flask import Flask, sessionapp Flask(__name__)1. 加密会话数据&#xff1a;在 Flask 中&#xff0c;会话数据存储在客户端的 cookie 中。设置 app.secret_key 可以加密会话…

Java毕业设计-基于springboot开发的HTML问卷调查系统设计与实现-毕业论文(附毕设源代码)

文章目录 前言一、毕设成果演示&#xff08;源代码在文末&#xff09;二、毕设摘要展示1、开发说明2、需求分析3、系统功能结构 三、系统实现展示1、管理员功能模块的实现1.1 问卷列表1.2 新闻资讯信息管理1.3 新闻资讯类型管理 四、毕设内容和源代码获取总结 Java毕业设计-基于…

应用方案D78040场扫描电路,偏转电流可达1.7Ap-p,可用于中小型显示器

D78040是一款场扫描电路&#xff0c;偏转电流可达1.7Ap-p&#xff0c;可用于中小型显示器。 二 特 点 1、有内置泵电源 2、垂直输出电路 3、热保护电路 4、偏转电流可达1.7Ap-p 三 基本参数 四 应用电路图 1、应用线路 2、PIN5脚输出波形如下&#xff1a;

springdoc-openapi-用户界面如何将请求设置为HTTPS

一、问题描述 当我们的服务接口需要通过HTTPS访问时&#xff0c;通过swagger可视化页面请求接口的时候&#xff0c;发起的是HTTP请求&#xff0c;导致请求无法到达后端&#xff0c;影响测试。 二、解决方法 1、将服务的地址添加到配置文件中 swagger:server-list: #本地环境…

【Vue3源码学习】— CH2.8 Vue 3 响应式系统小结

Vue 3 响应式系统小结 1.核心概念1.1 Proxy和Reflect1.2 响应式API1.3 依赖收集与更新触发1.4 触发更新&#xff08;Triggering Updates&#xff09;&#xff1a;1.5 副作用函数&#xff08;Effect&#xff09;1.6 计算属性和观察者1.7 EffectScope1.8 性能优化&#xff1a; 2.…

数据库-root密码丢失的重置方案(win11环境)

当在windows系统中安装的mysql由于操作不当&#xff0c;或者密码遗忘&#xff0c;今天测试了一下&#xff0c;可以用以下方法重置root的密码。 mysqlwindows环境root密码重置问题 在win10/11环境下mysql8密码遗忘后的重置密码方案。 停止mysql服务 查找windows中的mysql服务名称…

软考高级架构师:性能评价方法概念和例题

一、AI 讲解 性能评价是衡量计算机系统或其组件在指定条件下执行预期任务的有效性的一种方式。性能评价的方法主要可以分为几种&#xff0c;每种方法都有其特点和适用场景。 性能评价方法 方法描述时钟频率法通过计算机的时钟频率来评估性能&#xff0c;时钟频率越高&#x…

morkdown语法转微信公众号排版(免费)

morkdown语法转微信公众号排版&#xff08;免费&#xff09; 源码来自githab&#xff0c;有些简单的问题我都修复了。大家可以直接去找原作者的源码&#xff0c;如果githab打不开就从我下载的网盘里下载吧。 效果

LeetCode 热题 100 | 动态规划(一)

目录 1 70. 爬楼梯 1.1 基本思路 1.2 官方题解 2 118. 杨辉三角 3 198. 打家劫舍 菜鸟做题&#xff0c;语言是 C 1 70. 爬楼梯 核心思想&#xff1a;把总问题拆解为若干子问题。 总问题&#xff1a;上到 5 楼的方式有多少种子问题&#xff1a;上到 4 楼的方式有多…

焦虑研究的实验设备——大小鼠高架十字迷宫KT-0856

高架十字迷宫是一种广泛应用于焦虑研究的实验设备&#xff0c;尤其适用于啮齿类动物如大鼠和小鼠。这种迷宫的设计基于啮齿类动物的自然探究行为&#xff0c;以及它们对于高悬敞开环境的恐惧。通过观察和量化动物在开臂和闭臂之间的行为选择&#xff0c;研究人员可以评估其焦虑…

逻辑回归(Logistic Regression)详解

逻辑回归&#xff08;Logistic Regression&#xff09;是一种常用的统计学习方法&#xff0c;用于解决二分类问题。虽然名字中包含“回归”&#xff0c;但逻辑回归实际上是一种分类算法&#xff0c;而不是回归算法。它的基本原理是使用逻辑函数&#xff08;也称为Sigmoid函数&a…

mysyl索引

图中一共分了三个部分&#xff1a; Index Key &#xff1a;MySQL是用来确定扫描的数据范围&#xff0c;实际就是可以利用到的MySQL索引部分&#xff0c;体现在Key Length。 Index Filter&#xff1a;MySQL用来确定哪些数据是可以用索引去过滤&#xff0c;在启用ICP后&#xff…

6、Cocos Creator 2D 渲染组件:​Sprite 组件​

Sprite 组件 Sprite&#xff08;精灵&#xff09;是 2D/3D 游戏最常见的显示图像的方式&#xff0c;在节点上添加 Sprite 组件&#xff0c;就可以在场景中显示项目资源中的图片。 属性功能说明Type渲染模式&#xff0c;包括普通&#xff08;Simple&#xff09;、九宫格&#x…

[C++]使用OpenCV去除面积较小的连通域

这是后期补充的部分&#xff0c;和前期的代码不太一样 效果图 源代码 //测试 void CCutImageVS2013Dlg::OnBnClickedTestButton1() {vector<vector<Point> > contours; //轮廓数组vector<Point2d> centers; //轮廓质心坐标 vector<vector<Point&…

深度学习理论基础(五)卷积神经网络CNN

目录 前述&#xff1a;卷积神经网络基础1.卷积网络流程2.卷积网络核心3.卷积下采样4.卷积上采样--转置卷积 一、卷积神经网络层1.卷积层&#xff08;1&#xff09;内部参数&#xff1a;卷积核权重&#xff08;2&#xff09;内部参数&#xff1a;偏置&#xff08;3&#xff09;外…

网络安全 | 什么是DDoS攻击?

关注WX&#xff1a;CodingTechWork DDoS-介绍 DoS&#xff1a;Denial of Service&#xff0c;拒绝服务。DDoS是通过大规模的网络流量使得正常流量不能访问受害者目标&#xff0c;是一种压垮性的网络攻击&#xff0c;而不是一种入侵手段。NTP网络时间协议&#xff0c;设备需要…