进程相关内容(三)

news2024/12/30 1:29:47

目录

  进程优先级

  进程饥饿

  Linux当中优先级标识符

  优先级的修改参数NI

  进程最终优先级

  修改进程的优先级

  操作系统实现优先级的方法

  位图

  并发的概念

  进程切换原理

  环境变量

  其他环境变量

  获得环境变量的方式

  getenv系统调用函数

  命令行参数

  本地变量

  export添加环境变量

  unset删除环境变量

  由于我们操作系统当中的进程有很多种,但是我们的数据资源有限。所以我们的进程在运行的时候需要区分一定的顺序,这样才不会造成进程方面的干扰。所以在我们的操作系统当中引入了进程优先级的概念。

  进程优先级

  进程优先级是确定在操作系统当中哪一个进程先运行,哪一个数据后运行的标志。就像我们在上面所说到的那样,因为资源是有限的,但是进程有很多个,注定了进程之间存在竞争性。操作系统必须保证各个进程之间良性竞争,因此就有了进程的优先级。

  进程饥饿

  当我们的进程由于进程调度方面的问题,导致我们的进程长时间得不到调度,也就是该进程当中的代码长时间得不到执行,我们将这种现象叫做进程的饥饿现象。

  Linux当中优先级标识符

  在Linux当中我们也有表示先后运行的标识符:PRI,这个字符其实是priority优先权的缩写。我们可以通过ps指令进行查看:

  我们可以通过上面的图片当中查看到我们进程优先级的值为80。对于我们的进程的优先级来说,默认值为80。我们还可以通过nice值对进程的优先级进行修改,也就是我们上面图中的NI值。

  优先级的修改参数NI

  我们可以通过nice值对我们进程的优先级进行修改。但是我们可以无限度的放大或者缩小一个进程的优先级吗?

  假如我们无限制的放大一个进程的优先级,我们的这个进程就会一直被操作系统调度,假如该进程为一个死循环就会造成操作系统瘫痪。

  假如我们无限制的缩小一个进程的优先级,我们这个进程就会一直处于调用队列的对尾,永远都不会被调用。同样会造成资源上的浪费。

  因此我们的进程优先级不能被无限的放大或者缩小。为了解决这个问题,在Linux当中我们对NI值的修改进行了约束。我们要求nice值在修改的时候必须在 [ -20 , 19 ] 这个数据的范围之内变化。

  进程最终优先级

  一个进程最终的优先级等于进程的默认的值加上我们的nice值。进程的默认的优先级的值为80,加上我们的nice值,得到的取值的范围为:[ 60 , 99 ] 。

  当一个进程的优先级的值越小该进程就会先被操作系统调用执行。

  修改进程的优先级

  如果我们想要修改一个进程的优先级,我们可以通过top指令修改一个进程的优先级。测试示例如下:

    先通过ps -al | head -1 && ps -al | grep proc指令进行查看最终进程的优先级:

    之后输入top指令,通过修改nice值,进行修改进程的优先级:

  1.当我们输入top指令之后进入此界面就可以进行我们优先级的修改了。

  2.输入r,进行输入想要修改的进程的标识符

  如果不输入pid的话就会对我们的21864号进程进行修改进程的优先级。

  3.输入我们需要修改的进程PID之后,再输入我们修改的nice值即可

  4.再次对我们进程的优先级进行查看(输入q可以退出优先级修改界面)

  我们会发现,再修改完毕之后再通过PRI(before)+NI就得到了我们现在进程的优先级60。

  操作系统实现优先级的方法

  既然知道了进程优先级的使用方法,那么我们再来学习一下操作系统实现优先级的方法。

  由于我们的进程优先级的区间在 [ 60 , 99 ] 一共有40个数据值。每一个优先级都可以代表很多进程。我们将优先级相同的进程组成一个链表进行管理。 因此我们可以通过四十个链表的首节点的指针进行对于对四十个优先级的值的进程进行管理。

  结合我们之前学习的知识:我们运行的进程在资源都准备完毕的时候会将我们的PCB结构体加载到运行队列当中。我们的运行队列当中就规定了这一类的资源的判断方式:

  我们可以发现Linux实现运行队列的方式是实现一个指针数组,每一个指针管理着一个链表,该链表就是我们对应的需要运行的程序。

  如果对应的优先级没有相应的进程那么我们相应位置所对应的指针就设置为空。

  所以我们先要查看并实行特定优先级的进程就可以通过遍历一个指针数组实现。在Linux内核当中将优先级调度算法优化成为了O(1)。

  位图

  为了方便我们判断相应优先级是否存在相应的进行需要被执行,所以我们还可以通过位图的方式方便我们的管理。

  所谓的位图就是使用二进制位表达相对应的内容。例如我们就可以使用二进制位只存在0和1的特点,进行表示某一个优先级链表当中是否存在需要执行的进程。例如:1表示该优先级存在需要执行的进程,0表示该优先级不存在需要执行的进程。这样我们就可以仅仅通过一个整形变量就可以检查我们40个空间是否存在数据了。

  并发的概念

  一个进程在执行的时候可以分为并行和并发两种状态。所谓的并行就是我们多个进程在多个CPU上面运行,其实就是共同执行。

  而我们的并发的就是有多个进程在一个CPU当中依次执行。在一段时间之内我们的程序均可以被执行,我们将这种方式叫做并发。

  CPU只有一个为什么可以有多个程序共同执行呢?我们需要知道的是:进程的并发需要从两个方面进行观察。在很短的时间段里面一个CPU当中运行的只能有一个进程。但是在较长的一段时间内由于进程是经过快速切换的,一个进程运行完一个时间段之后就会切换下一个进程继续执行。又由于计算机切换进程的速度很快,所以表现出来的形式就是有多个进程共同在CPU上面执行。

  进程切换原理

  想要知道一个进程的在CPU上面的切换的原理,我们就需要想到两个问题:

     1.进程切换之后执行出来的数据怎么办?

     2.如何知道进程当中的代码执行到哪一行了呢?

  Q:函数的返回值是怎么被外部拿到的呢?

  A:当我们的函数在执行完之后,如果有需要会有一个返回值。但是我们的这个返回值是如何返回给我们main函数当中的变量的呢?

      当我们在返回一个数据的时候,我们会先将这个返回值的数据写入到寄存器当中,再回到我们的main函数当中,之后再将寄存器当中的数据写入到指定的变量当中。这就是函数返回值写入的原理。

    Q:我们是如何知道程序运行到哪一行的呢?

    A:在我们的程序运行的时候会产生一个指针,这个指针指向我们需要执行的下一行代码。我们可以通过这个指针找到我们需要运行的代码。我们讲个指针成为程序计数器,也就是我们常说的PC指针。

  在我们计算机当中有很多的寄存器供我们使用,比如通用的寄存器:eax,ebx,ecx 栈帧esp,eip,ebp 状态寄存器:status。这些寄存器当中存储着我们进程执行过程中产生的所有数据对应的值。我们将存储到寄存器当中的数据成为进程的上下文数据。

  当我们的进程想要进行切换的时候,为了方便我们的进程之后可以顺利的执行,我们需要将处理的数据拿走,也就是将我们寄存器当中的上下文数据拿走。等到我们的进程再次加载进入CPU上面的时候,再将我们相应的数据加载进入相应的寄存器当中,最终通过PC指针得到下一行代码的运行位置。

  因此我们的进程在被切换的时候最主要进行的操作为:1.保存上下文数据 2.恢复上下文数据  这样就实现了我们的进程切换。

  环境变量

  在Linux当中一切指令都是一个可执行程序文件,我们所编写的程序也是这样的。但是为什么我们编写的程序在执行的时候需要加上 ./ 但是我们执行的命令却不需要呢?

  这个时候就需要介绍我们环境变量当中的一个内容 PATH 。如果大家对于计算机比较了解的话,那么肯定在Windows当中肯定对环境变量进行过配置。

  当我们在PATH环境变量当中配置好目录地址的时候,我们就可以通过查找遍历PATH当中的目录进行直接执行相应的操作。不在需要我们一级一级输入我们文件的所在的位置。

  在Linux当中也是同样的原理。我们编写的一个程序在运行的时候由于PATH路径当中没有相应的路径,所以我们就需要手动指出该程序所处电脑当中的位置。也即是 ./程序名。前面的 ./ 代表的是文件的路径。同样的由于我们执行的命令所处代码的位置已经在PATH路径当中进行过配置,所以我们不需要指定特定命令文件所处的位置。我们可以进行测试:

  我们可以手动进行环境变量的配置:

  其中我们的PATH目录当中每一个路径都以 :进行分隔,所以我们在添加新的PATH路径的时候,可以直接使用:进行添加新的路径。

  需要注意的是:我们在修改PATH路径的时候必须加上我们之前的PATH路径,否则我们修改的路径就会被我们添加的路径所替代。在添加之后就可以直接运行我们的程序了。

  如果我们不小心将系统当中原本的环境变量覆盖,不需要着急,我们只需要退出系统重新登陆即可。每一次登录我们的环境变量都会重置,并变成我们最初的状态。

  其他环境变量

  在Linux当中PATH只是我们众多环境变量当中的其中一个,其中还包括很多其他的环境变量,例如:HOME,USER,SHELL等等。我们可以通过env命令进行查看Linux当中所有的环境变量。如下图:

  我们可以通过echo指令进行查看特定的环境变量:

  实质上我们在执行特定的命令的时候就是调用环境变量实现的,例如我们之前经常使用的pwd命令,其实就是执行的echo $PATH命令。测试如下:

  同样的当我们登上Linux系统的时候会默认进入/home/liuming目录,这个原因就是我们的操作系统在进入的时候直接执行了我们的echo $HOME命令。

  获得环境变量的方式

  getenv系统调用函数

  获得环境变量有很多种方式。上面直接执行env命令就是获得环境变量的方式之一。我们还可以通过系统调用接口进行查看特定的环境变量。测试代码如下:

  我们直接调用getenv函数就可以获得特定的环境变量的值,其中getenv的参数为我们想要查看的环境变量的名称。

运行结果如下:

  命令行参数

  第二种方式就是使用命令行参数进行查看系统当中的环境变量。对main函数比较熟悉的都会知道,我们的main函数其实是存在参数的。先来认识一下main函数的参数:

  我们先认识前两个参数。我们会发现在main函数当中会有一个int类型的数据,有一个指针数组。其中argv整数代表的就是我们在命令行当中一共输入的参数的个数,后面的指针存储的就是我们在命令行当中输入的参数字符串。我们可以通过打印的方式进行测试:

  我们还可以通过遍历向量表的形式进行打印参数。所谓的向量表实质上就是我们的argc指针数组,在操作系统当中存储着我们指针数组当中相关的数据,并在我们指针数组的末尾添加一个空指针,我们可以通过查看元素是否等于空指针判断参数是否打印完毕。测试代码如下:

  执行效果如下:

  程序和我们的预期结果相同。

  但是我们main函数里面一共有三个参数,其中的第三个参数同样是一个指针数组,其中保存的就是我们正在学习的环境变量,使用方法同样可以通过while循环进行,最后查找到末尾的NULL结束。测试代码如下:

  运行效果如下:

  我们发现运行完代码之后获得的环境变量和我们在命令行当中输入env命令查看到的相同。所以就引出了另一个概念:环境变量的继承。

  我们在创建一个子进程的时候,main函数当中的环境变量都是从父进程当中或得到的,因此我们获得的环境变量都是从父进程那里继承来的。和我们的环境变量相同。

  我们可以尝试改变我们父进程当中的环境变量,再次执行程序观察通过系统调用接口的环境变量是否改变:

  本地变量

  但是我们应该怎么设置环境变量呢?

  通常情况下我们通过name=value的形式进行环境变量的设置。但是如果只使用这种形式进行设置环境变量的话,我们会发现在env当中查看不到我们先添加进入的环境变量。例如:

  我们将这种可以被echo查看的环境变量,但是不能被env指令查看的环境变量叫做本地变量。由于我们子进程继承的环境变量是和env当中的环境变量相一致的。所以我们新设置的环境变量是父进程所特殊的,并不会被子进程继承。

  export添加环境变量

  如果想要添加新的可以被子进程继承的环境变量我们需要在添加的时候补上一个export例如:

  unset删除环境变量

  有添加就会有删除,我们可以通过unset命令删除指定的环境变量:

  在调用unset命令之后直接跟环境变量名即可删除指定的环境变量。删除之后的环境变量无论是通过echo命令还是通过env命令查看都查看不到。

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

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

相关文章

修改echarts的tooltip样式 折线图如何配置阴影并实现渐变色和自适应

图片展示 一、引入echarts 这里不用多解释 vue里使用 import echarts from “echarts”; html页面引用js文件或用script标签引用 二、定义一个具有宽高的dom div <div id"echart-broken" style"width:400px;height: 200px;"></div>三、定义…

头歌平台——基于数组的工资处理系统

第1关&#xff1a;数据输入和计算 任务描述 本关任务&#xff1a; 编写函数input_data(char uid[10][5], int salary[10], int csalary[10], int revenue[10], int _water_electricity[10], int _deductions[10])&#xff0c;作用为输入职工的代号&#xff0c;岗位工资&#…

LabVIEW应用开发——控件的使用(二)

上篇介绍数值型控件和布尔型控件&#xff0c;这篇介绍字符串、路径控件、下拉框和数组控件。 LabVIEW应用开发——控件的使用&#xff08;一&#xff09; 1、字符串控件 实际应用中&#xff0c;字符串控件的显示很常用的&#xff0c;可用于显示串口信息、通讯交互信息、…

JAVA-记一次BigDecimal,String千分位转换

在显示类上面添加JsonSerialize注解&#xff0c;指定对应的转换格式例如&#xff0c;同理可在属性为BigDecimal的字段上添加注解&#xff0c;指定方法&#xff1a; private String userTypeStr;/*** 交易金额*/JsonSerialize(using StringSerialize.class)private String tran…

零基础制作电子期刊,不用担心不会设计排版

亲爱的朋友们&#xff0c;你是否想制作一本自己的电子期刊&#xff0c;但又担心不会设计排版&#xff1f;别担心&#xff01;今天我将教你如何零基础制作电子期刊&#xff0c;让你轻松上手&#xff01; 首先&#xff0c;你需要选择一个适合你的电子期刊模板。我们可以使用FLBOO…

智慧停车场项目-SpringBoot的Smart-parking

基于SpringBoot的Smart-parking 智慧停车场项目 介绍 基于 SpringBoot Vue 的智能停车场项目 系统首页 作者 如需本项目源代码&#xff0c;可扫码或者VX:zxd1534124905联系作者。 基础环境 JDK1.8、Maven、Mysql、IntelliJ IDEA、payCloud 相关组件 ok-adminvueiViewec…

文件批量管理:轻松复制备份并删除原文件

在日常生活和工作中&#xff0c;我们经常需要处理大量的文件。为了确保文件的安全性和完整性&#xff0c;您需要一种高效的文件批量管理方法。本文将向您介绍如何一一复制备份并删除原文件里的文件&#xff0c;让您的文件管理变得轻松便捷。 首先&#xff0c;我们要进入文件批…

Unity3D 基础——Coroutine 协同程序

Coroutine 称为协同程序或者协程&#xff0c;协同程序可以和主程序并行运行&#xff0c;和多线程有些类似。协同程序可以用来实现让一段程序等待一段时间后继续运行的效果。例如&#xff0c;执行步骤1&#xff0c;等待3秒&#xff1b;执行步骤2&#xff0c;等待某个条件为 true…

Web安全测试详解

前言 随着互联网时代的蓬勃发展&#xff0c;基于Web环境下的应用系统、应用软件也得到了越来越广泛的使用。 目前&#xff0c;很多企业的业务发展都依赖于互联网&#xff0c;比如&#xff0c;网上银行、网络购物、网络游戏等。但&#xff0c;由于很多恶意攻击者想通过截获他人…

狄克斯特拉(Dijkstra) 算法 php实现

《算法图解》中提到的狄克斯特拉算法&#xff0c;用php实现。 一 原理及解释 根据示例图求出起点到终点的最小耗费路径。 因为涉及每条路径的权重&#xff0c;所以这种算法仅适合有向路径。 所谓有向路径&#xff0c;指仅从起点指向终点的路径。 相对的无向路径&#xff0…

zookeeper(目前只有安装)

安装 流程 学kafka的时候安装 Apache ZooKeeper 安装地址&#xff1a;https://archive.apache.org/dist/zookeeper/zookeeper-3.5.7/apache-zookeeper-3.5.7-bin.tar.gz 解压 tar -zxvf kafka_2.12-3.0.0.tgz -C /export/server/ 改配置 cd config cp zoo_sample.cfg z…

Harbor 安装部署

Harbor基本介绍 1、Harbor 是 VMware 公司开源的企业级 Docker Registry 项目&#xff0c;Harbor 是一个企业级的 Docker 私有仓库项目。 2、Harbor以 Docker 公司开源的 Registry 为基础&#xff0c;提供了图形管理 UI 、基于角色的访问控制(Role Based AccessControl) 、AD/L…

cppcheck新手指引

文章目录 一、简介功能原理特征 二、安装WindowsLinux 三、使用1、Manual2、Windows gui3、Windows Cli、Linux4、vscode5、严重等级6、常用示例7、Suppressions8、html报告 四、用户是否可以编写检查规则&#xff1f;五、Cppcheck Premium 一、简介 cppcheck 是一个开源的静态…

vue中echart-gl 3D地图纹理实例

1. 安装 npm install echarts npm install echarts-gl2. vue组件 html部分 <template><section class"chartapp"><div class"map-chart" ref"mapChart"></div></section> </template>JS引入 import * as…

MIPS64乘法器模拟实验

目录 忽略溢出的乘法器 溢出提示的乘法器 忽略溢出的乘法器 首先&#xff0c;我们得了解乘法器如何由加法器设计得到&#xff0c;此处&#xff0c;我们以32位乘法为例。 总共分为4步&#xff1a; 1. 测试乘数最低位是否为1&#xff0c;是则给乘积加上被乘数&#xff0…

Linux-Jconsole连接远程服务器

Jconsole连接远程服务器 一、修改jmxremote.password.template文件二、启动jar项目三、jconsole远程连接1、打开的你jconsole2、远程连接 一、修改jmxremote.password.template文件 进去你的/idk/jre/lib/management目录下可以看到jmxremote.password.template文件 修改jmxr…

“智能+”时代,深维智信如何借助阿里云打造AI内容生成系统

云布道师 前言&#xff1a; 随着数字经济的发展&#xff0c;线上数字化远程销售模式越来越成为一种主流&#xff0c;销售流程也演变为线上视频会议、线下拜访等多种方式的结合。根据 Gartner 报告&#xff0c;到 2025 年 60% 的 B2B 销售组织将从基于经验和直觉的销售转变为数…

lazada店铺商品评论数据采集,lazada商品评论数据接口,lazadaAPI接口

lazada店铺商品评论数据可以通过以下步骤进行采集&#xff1a; 注册Lazada开发者账号。首先在Lazada开放平台网站上注册并创建开发者账号&#xff0c;并创建一个应用&#xff0c;获取到所需的App Key和App Secret等信息。设置API密钥和访问令牌。使用获取到的App Key和App Sec…

(python)系统路径和文件操作 —— os和pathlib

文章目录 前言1、遍历目录下的文件 前言 pathlib 和 os 是 Python 中用于处理文件路径和文件系统操作的两个模块。os 模块提供了底层的操作系统相关功能&#xff1b;pathlib 提供了面向对象的路径操作接口。pathlib 模块实际上是在 os 模块的基础上进行了封装和扩展&#xff0…

2023年中国车载导航仪产量、销量及市场规模分析[图]

车载导航仪是一种用于汽车上的电子设备&#xff0c;用于帮助驾驶员找到目的地并规划路线&#xff0c;它通常使用地图软件和GPS定位技术来确定车辆的位置&#xff0c;并提供语音和图形指示&#xff0c;以指导驾驶员前往目的地。 车载导航仪行业分类 资料来源&#xff1a;共研产…