当前位置: 首页 > news >正文

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_进程的优先级&&环境变量&&上下文切换,感谢收看

相关文章:

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

文章目录 一、进程的优先级二、进程的四个重要概念三、上下文切换四、环境变量4.1 查看当前shell环境下的环境变量与内容 一、进程的优先级 什么是优先级&#xff1f; 指定一个进程获取某种资源的先后顺序本质是进程获取cpu资源的优先顺序 为什么要有优先级 进程访问的资源&am…...

【Rust】语言特点介绍

Rust 教程 Rust 语言是一种高效、可靠的通用高级语言。其高效不仅限于开发效率&#xff0c;它的执行效率也是令人称赞的&#xff0c;是一种少有的兼顾开发效率和执行效率的语言。 Rust 语言由 Mozilla 开发&#xff0c;最早发布于 2014 年 9 月。Rust 的编译器是在 MIT Licens…...

接口冒烟测试方法

接口冒烟测试方法 今年遇到了几个问题&#xff0c;与接口的功能和性能相关&#xff0c;恰巧最近公司也在组织以冒烟测试为主题的活动&#xff0c;于是乎突发奇想&#xff0c;寻思着能否将接口测试与冒烟测试结合起来&#xff0c;发掘一些新的接口测试思路与方法。 平时对接口…...

Redis 全景图(3)--- Redis 应用于缓存

前言 这是关于 Redis 全景图的最后一篇文章。因为一次写太多会限流&#xff0c;我也是没办法&#xff0c;才分成三篇文章来写。这篇文章是关于 Redis 应用于缓存的。 其实为什么要讲这个话题呢&#xff1f; Redis 应用在很多地方呀&#xff0c;为什么一定要挑着这个话题来讲呢…...

vue中splice方法总结

本文没有目录&#xff0c;很简单的几句话总结一下 1&#xff0c;参数解释2&#xff0c;使用方法 splice(index,len,item)是vue中对数组进行操作的方法之一&#xff0c;可以用来 删除&#xff0c; 更新&#xff0c;和 增加数组内容。 1&#xff0c;参数解释 index&#xff1a…...

【HTML】CSS样式(二)

上一篇我们学习了CSS基本样式和选择器&#xff0c;相信大家对于样式的使用有了初步认知。 本篇我们继续来学习CSS中的扩展选择器及CSS继承性&#xff0c;如何使用这些扩展选择器更好的帮助我们美化页面。 下一篇我们将会学习CSS中常用的属性。 喜欢的 【点赞】【关注】【收藏】…...

Java 学习和实践笔记(51):二分法查找(折半检索)

二分法查找&#xff08;折半检索&#xff09;又叫binary search. 要在一堆数据中查找是否存在某一个已知数&#xff0c;二分法查找的步骤&#xff1a; 第一步&#xff0c;对数据实现排序 第二步&#xff0c;将该数与排序后的数据集的中间一个数进行比较 第三步&#xff0c;…...

echarts 地图 自己圈地图 乡镇街道

这个是方式是我实在不愿意做的&#xff01; 如果有现成的最好&#xff0c;没有办法的情况下再用这个东西。 今天公司有一个项目&#xff0c;地方划分了一块区域&#xff0c;但是国家没有审核&#xff0c;但是项目里面用到了一个地图展示数据&#xff01;然后就需要我们自己把…...

12-1-CSS 常用样式属性

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; 文章目录 CSS 常用样式属性1 CSS 三角形2 CSS 用户界面样式2.1 什么是界面样式2.2 鼠标…...

微信小程序短链接工具推荐

现在微信小程序大行其道&#xff0c;但工作中大部分人选择了短链接的方式来推广微信小程序&#xff0c;那么微信小程序短链接工具哪个好?今天就分享一篇从网上看到的关于《微信小程序短链接工具推荐》文&#xff0c;作者是souki&#xff0c;一起来看看吧! 一、缩链 1、生成方…...

[Spring Cloud] gateway全局异常捕捉统一返回值

文章目录 处理转发失败的情况全局参数同一返回格式操作消息对象AjaxResult返回值状态描述对象AjaxStatus返回值枚举接口层StatusCode 全局异常处理器自定义通用异常定一个自定义异常覆盖默认的异常处理自定义异常处理工具 在上一篇章时我们有了一个简单的gateway网关 [Spring C…...

网络基础二——TCP可靠性实现机制补充2

验证客户端和服务端三次握手和四次挥手时的状态 三次握手 #include <sys/types.h> #include <sys/socket.h> int listen(int sockfd, int backlog);netstat ntp //查看连接的状态​ 将TCP服务端套接字设置为listen状态之后&#xff0c;此时服务端是处于L…...

SSM项目实战——哈哈音乐(四)前台模块开发

1、项目准备 ①导入依赖和前端资源 <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.x…...

Hadoop-入门

资料来源&#xff1a;尚硅谷-Hadoop 一、Hadoop 概述 1.1 Hadoop 是什么 1&#xff09;Hadoop是一个由Apache基金会所开发的分布式系统基础架构。 2&#xff09;主要解决&#xff1a;海量数据的存储和海量数据的分析计算问题。 3&#xff09;广义上来说&#xff0c;Hadoop…...

HarmonyOS(鸿蒙)——单击事件

2.4 实现ClickedListener接口并重写onClick方法 2.5 实现onClick方法中的具体逻辑&#xff0c;以此完成点击事件的相关业务操作 三、测试 3.1 登录远程模拟器 3.2 运行项目 四、精选好文 一、简介 1.1 什么是组件 组件就是文本、按钮、图片等元素的统称 1.2 什么是事件 …...

c# wpf template itemtemplate+dataGrid

1.概要 2.代码 <Window x:Class"WpfApp2.Window8"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"http://schemas.microsoft.com/expression/blend…...

总结UDP协议各类知识点

前言 本篇博客博主将详细地介绍UDP有关知识点&#xff0c;坐好板凳发车啦~ 一.UDP特点 1.无连接 UDP传输的过程类似于发短信&#xff0c;知道对端的IP和端口号就直接进行传输&#xff0c;不需要建立连接&#xff1b; 2.不可靠传输 没有任何的安全机制&#xff0c;发送端发…...

设计模式 --5观察者模式

观察者模式 观察者模式的优缺点 优点 当一个对象改变的时候 需要同时改变其他对象的相关动作的时候 &#xff0c;而且它不知道有多少具体的对象需要改变 应该考虑使用观察者模式 。观察者模式的工作就是解除耦合 让耦合双方都依赖与抽象 而不是具体 是的各自改变都不会影响另…...

跨平台的组播测试工具mping、udp_sender及udp_reciver的源码及使用教程

文章目录 1.前言2.mping工具编译3.mping工具使用3.1 参数说明3.1 组播播发&#xff08;-s&#xff09;3.1 组播播发&#xff08;-r&#xff09;3.3 Linux下mping测试 4.Linux组播udp_sender及udp_reciver使用4.1 udp_sender源码4.1 udp_reciver源码4.3 编译方法4.4 测试使用4.4…...

Linux基础篇:文件系统介绍——根目录下文件夹含义与作用介绍

Linux文件系统介绍——文件夹含义与作用 Linux文件系统是一个组织和管理文件的层次结构。它包括了目录、子目录和文件&#xff0c;这些都是按照一定的规则和标准进行组织的。以下是Linux文件系统的一些关键组成部分&#xff1a; 1./bin&#xff1a; 该目录包含了系统启动和运…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制

在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具&#xff0c;在大规模数据获取中发挥着关键作用。然而&#xff0c;传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时&#xff0c;常出现数据质…...

网站指纹识别

网站指纹识别 网站的最基本组成&#xff1a;服务器&#xff08;操作系统&#xff09;、中间件&#xff08;web容器&#xff09;、脚本语言、数据厍 为什么要了解这些&#xff1f;举个例子&#xff1a;发现了一个文件读取漏洞&#xff0c;我们需要读/etc/passwd&#xff0c;如…...

CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝

目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为&#xff1a;一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用

在工业制造领域&#xff0c;无损检测&#xff08;NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统&#xff0c;以非接触式光学麦克风技术为核心&#xff0c;打破传统检测瓶颈&#xff0c;为半导体、航空航天、汽车制造等行业提供了高灵敏…...

用鸿蒙HarmonyOS5实现中国象棋小游戏的过程

下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...

Java详解LeetCode 热题 100(26):LeetCode 142. 环形链表 II(Linked List Cycle II)详解

文章目录 1. 题目描述1.1 链表节点定义 2. 理解题目2.1 问题可视化2.2 核心挑战 3. 解法一&#xff1a;HashSet 标记访问法3.1 算法思路3.2 Java代码实现3.3 详细执行过程演示3.4 执行结果示例3.5 复杂度分析3.6 优缺点分析 4. 解法二&#xff1a;Floyd 快慢指针法&#xff08;…...