Linux基础——进程初识(三)

1. 进程优先级

首先我们要知道,进程优先级是操作系统用来确定多个进程同时运行时,哪个进程会获得更多CPU时间片的相对重要性或优先级的评估。他和权限的区别在于权限决定了能不能访问资源,而优先级是在能访问资源的前提下,决定了资源访问谁先访问,谁后访问。

那么我们为什么需要优先级呢?在去食堂的时候,如果能给我们每一个人配备一个厨师,那么我们就不需要进行排队了,问题是没有那么多的厨师分配给我们,而进程也是同理,因为资源是有限的,而进程有多个,那么注定了进程之间的关系为竞争关系——这就是进程的竞争性。对于操作系统来说,操作系统必须保证良性竞争,为此要确认进程的优先级。如果进程长时间得不到CPU资源的话,那么该进程的代码就会长时间无法得到推进,这样的情况我们将其称为该进程的饥饿问题。

说了这么多,那么在Linux中的优先级是怎么办到的呢?

我们以以下代码为例

运行后查看有

在这里我们可以看到有PRI(优先级)和NI(nice值)两个值,PRI是priority(优先)的缩写,其值越小就越早执行,NI是进程优先级的修正属性,PRI(new) = PRI(old) + nice,我们可以调整nice值来调整进程的优先级,既然优先级可以被调整,那么我们可以大幅更改nice值,从而使该进程一直被调度吗?答案当然是不行的,对于Linux来说,它不想过多的让用户参与优先级,只允许在一定范围内进行优先级调整,Linux给出nice的取值范围为[-20, 19],通过计算我们可以得知PRI的取值范围为[60, 99],一共40个级别。

知道了优先级后,操作系统如何通过其进行的调度呢?

在运行队列中有两个指针数组,优先级为相同的情况下,运行队列采取开散列的方法将其链接起来,在运行队列正在运行时,如果有新的相同优先级的进程产生,那么他会被放入到运行指针数组镜像数组中,在处理完当前运行队列的所有进程后,此时swap(run, wait)这样就将下一批调度队列放入了运行队列中。那么如何判断当前运行队列为空呢?——位图,这样就可以使时间复杂度降低到O(1),这就是Linux内核的O(1)调度算法。

2. 进程概念

竞争性:系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级

独立性:多进程运行,需要独享各种资源,多进程运行期间互不干扰

并行: 多个进程在多个CPU下分别,同时进行运行,这称之为并行

并发:多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发

对于并发来说,我们之前提到过他是由时间片和进程切换共同做到的,即其是基于进程切换与时间片轮转的调度算法。而我们以前学习语言时,曾经有一个问题就是一个函数的返回值是怎么被外部拿到的呢?

首先,我们知道在CPU中存在很多的寄存器,在函数返回时,如:return a(10); 此时他会被转换成move eax 10,即函数返回值会先由寄存器保存,这之后再通过寄存器返回该数据。此外,操作系统是如何得知我们的进程当前执行到了哪一行呢?——使用程序计数器如:pc, eip等,它们可以记录当前进程正在执行指令的下一行指令的地址。(注:for循环和if条件分支等操作的本质就是修改eip指针)。

那么寄存器有如此之多,那么它们在操作系统之中扮演什么角色呢?答案是由于寄存器贴近CPU,因此它们可以通过将进程中的高频数据存入寄存器中从而提高效率。因此,CPU寄存器中保存的是进程相关的临时数据,我们将这些临时数据称为进程的上下文。在此我们还有一个问题,就是一个进程是有时间片的,在时间片规定时间到达后,其会被进程切换而拿下来,那下次执行该进程的时候,如何得知上次代码执行到哪里了呢?——因此,在进程从CPU上离开时,要将自己的上下文数据保护好或者带走,带走的目的是为了下次运行时恢复从而做到无缝衔接。因此我们可以知道,进程在被切换时需要做两件事:1. 保存上下文;2. 恢复上下文。在这里我们可以认为上下文是可以储存到task_strcut中的。

3. 环境变量

①环境变量概念

环境变量是系统提供的一组name=value形式变量,不同的环境变量有不同的用户,且通常具有全局属性。举几个例子

在我们使用指令时不用加上./但是我们运行自己的程序时,却需要使用,其实这里存在一个环境变量PATH,它是Linux的指令搜索路径,我们可以使用echo $PATH查看

它是各个路径之间使用:连接的字符串,我们输入一个指令时有如下反馈

其本质是在PATH的路径下找指令,找不到就返回command not found。我们可以使用

PATH=$PATH:当前路径

来将当前路径添加到默认路径中,在添加后就可以不用./即可

此外,我们可以使用env指令来查看所有的环境变量

可以看到这里有很多的环境变量,这里拿几个举例

HOME:进入系统时默认使用cd+HOME路径

HISTSIZE:表示history指令中记录的最多条数

PWD:当前所处的工作路径

LOGNAME:登入用户

OLDPWD:上一个路径

除了使用指令外我们还可以使用代码的方式来获取——getenv(),查看手册有

我们以如下代码为例

因此,通过环境变量,系统可以判断当前用户是谁来给予对应权限。

②命令行参数与环境变量

其实main函数可以传入两个参数,我们以以下代码为例

运行可以发现

对于argv我们可以知道它是一个数组指针

他会将输入的命令行以空格为分隔符,分成若干个参数存入argv中。那么为什么需要这么做呢?——其目的是为指令、工具和软件等提供命令行选项的支持。以如下代码为例

此外,除了argc和argv两个参数外,还可以有一个env参数,即

我们打印有如下结果

至此,我们可以知道在调用main函数时,一共会传入两张核心向量表,一张是命令行参数表,另一张是环境变量表。我们所运行的进程都是子进程,bash在本身启动的时候,会从操作系统之中读取环境变量信息,而子进程会继承父进程的环境变量。那么我们如何验证呢?我们可以使用

export MY_VALUE=123456

来向bash中添加这个环境变量,再次运行mycode可以发现

而我们在bash中取消该环境变量

unset MY_VALUE

后,再次运行可以发现

此时MY_VAlUE又消失了。即子进程会继承父进程的环境变量。

③本地变量与内建命令

我们可以直接使用

a=1
b=2
c=3

来直接创建变量,这样创建出来的变量为本地变量,可以使用echo $a来查看变量值,即

也可以使用set来查看所有变量,即

对于本地变量,它只会在本bash内有效,而不会继承给子进程,若是想让它变为环境变量可以使用export,即

由于a是本地变量,对于echo $a来说,echo不应该是bash的子进程吗?既然是的话echo就不应该继承本地变量a,那么如何访问a的值呢?其实对于命令来说,一般分为两大类,一类是常规命令——即通过创建子进程完成的,另一类是内建命令——即bash不创建子进程,而是自己亲自执行,类似与bash调用自己写的或是系统提供的函数,如:echo, cd, end, export等,其实现大概是类似于下面的形式

if (argv[1] == "echo")
{
    chdir(argv[1]);
}

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

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

相关文章

Day7 vitest 之 vitest配置第三版

项目目录 runner Type: VitestRunnerConstructor Default: node, 当运行test的时候 benchmark,当运行bench测试的时候 功能 自定义测试运行程序的路径。 要求 应与自定义库运行程序一起使用。 如果您只是运行测试,则可能不需要这个。它主要由library作者使用 …

多线程实践项目

前言 前面几篇文章分别学习了多线程的基本知识和线程池使用,这篇则为项目实践和整理。 项目参考 选择了两个项目github地址,如果不方便下载可以下面留言评论私发。 1.马士兵老师的juc,讲述了多线程的基本知识线程讲解 2.基本的线程演示&am…

几种读nii图像方法的轴序比较

读 .nii / .nii.gz 图像并转成 numpy 可用 medpy.io、nibabel、itk、SimpleITK 几种方法,然而几种方法读出来的轴序有出入,本篇比较此几种方法。 Datum 所用数据来自 verse,经 iTomxy/data/verse/preprocess.py 预处理,朝向和轴…

【VTK三维重建-体绘制】第五期 vtkLODProp3D

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 前言 本文分享VTK中体绘制中的vtkLODProp3D对象,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞关注,小易会继续努力分享,一起进步! 你的点赞…

【数据挖掘】基于 LightGBM 的系统访问风险识别(附源码)

基于 LightGBM 的系统访问风险识别 文章目录 基于 LightGBM 的系统访问风险识别一、课题来源二、任务描述三、课题背景四、数据获取分析及说明(1)登录https://www.datafountain.cn并获取相关数据(2)数据集文件说明(3&a…

好代码网同款wordpress主题,适合搭建资源分享类网站,自带五六百的精品资源数据

代码简介: 好代码资源网是个还不错的资源分享类网站,基于wordpress搭建的。它的主题看起来还是不错的。这里分享一下这个网站的主题包。说是主题包,其实就是整站打包的,集成了主题(wordpress美化主题包几个插件&#…

从vue小白到高手,从一个内容管理网站开始实战开发第六天,登录功能后台功能设计--API项目中的登录实现(一)

从vue小白到高手,从一个内容管理网站开始实战开发第五天,登录功能后台功能设计--数据库与API项目-CSDN博客文章浏览阅读348次,点赞9次,收藏7次。本次文章主要讲了开发后台API项目给前台vue调用的话,需要使用的数据库并新建数据库和表、安装开发工具、如何创建API项目以及A…

05-微服务-RabbitMQ-概述

RabbitMQ 1.初识MQ 1.1.同步和异步通讯 微服务间通讯有同步和异步两种方式: 同步通讯:就像打电话,需要实时响应。 异步通讯:就像发邮件,不需要马上回复。 两种方式各有优劣,打电话可以立即得到响应&am…

深入解析美颜SDK:绿幕抠图功能的算法原理

当下,美颜SDK绿幕抠图功能成为许多应用中不可或缺的一环。本文将深入解析美颜SDK中绿幕抠图功能的算法原理,揭示其背后的技术奥秘。 一、什么是美颜SDK绿幕抠图? 美颜SDK的绿幕抠图功能是一种通过计算机视觉技术,将视频或图像中…

十六:爬虫-验证码与字体反爬

一:验证码 验证码(CAPTCHA)是一种计算机程序设计技术,用于确定用户是人类而不是机器。它通常表现为一种图像或声音,要求用户在输入框中输入正确的文本或数字来证明自己是人类。因为机器人和计算机程序无法像人类一样理…

《深入理解C++11:C++11新特性解析与应用》笔记八

第八章 融入实际应用 8.1 对齐支持 8.1.1 数据对齐 c可以通过sizeof查询数据的长度,但是没有对对齐方式有关的查询或者设定进行标准化。c11标准定义的alignof函数可以查看数据的对齐方式。 现在的计算机通常会支持许多向量指令,4组8字节的浮点数据&a…

C++ namespace 学习

源自:【C】-命名空间的概念及使用_命名空间的概念及作用-CSDN博客 摘抄:

ISP 基础知识积累

Amber:现有工作必要的技术补充,认识需要不断深入,这个文档后续还会增加内容进行完善。 镜头成像资料 ——干货满满,看懂了这四篇文章,下面的问题基本都能解答 看完思考 1、ISP 是什么,有什么作用&#xff…

加密算法和身份认证

前瞻概念 在了解加密和解密的过程前,我们先了解一些基础概念 明文:加密前的消息叫 “明文” (plain text)密文: 加密后的文本叫 “密文” (cipher text)密钥: 只有掌握特殊“钥匙”的人,才能对加密的文本进行解密,这里…

前端实战第一期:悬浮动画

悬浮动画 像这样的悬浮动画该怎么做&#xff0c;让我们按照以下步骤完成 步骤&#xff1a; 先把HTML内容做起来&#xff0c;用button属性创建一个按钮&#xff0c;按钮内写上悬浮效果 <button classbtn>悬浮动画</button>在style标签内设置样式,先设置盒子大小&…

显示所有中国城市需要多少个汉字?

显示所有中国城市需要多少个汉字呢&#xff1f; 需要3678个汉字&#xff0c;看看我怎么知道的。 第一步&#xff1a;先找到中国的所有城市的名称 去哪里找到中国的所有城市的名称呢&#xff1f; 进入中国天气网&#xff1a;http://www.weather.com.cn/ 使用 F12 打开浏览器的调…

使用results.csv文件数据绘制mAP对比图

yolov5每次train完成&#xff08;如果没有中途退出&#xff09;都会在run目录下生成expX目录&#xff08;X代表生成结果次数 第一次训练完成生成exp0 第二次生成exp1…以此类推&#xff09;。expX目录下会保存训练生成的weights以及result.txt文件&#xff0c;其中weights是训练…

【MFC】计算机图形学实验:熟悉开发环境及工具(代码)

实验内容&#xff1a; 【MFC】计算机图形学实验1&#xff1a;熟悉开发环境及工具_绘制多义线mfc-CSDN博客 画笔和字体只给出两处代码&#xff1a; //创建刷子&#xff0c;设置填充色为黑色 CBrush NewBrush; NewBrush.CreateSolidBrush(RGB(0, 0, 0)); pDC->SelectObjec…

excel公式名称管理器

1.问题 在日常使用excel的时候&#xff0c;发布一个表格文件&#xff0c;需要限制表格的某列或某行只能从我们提供的选项中选择&#xff0c;自己随便填写视为无效&#xff0c;如下图所示&#xff0c;上午的行程安排只能从"在岗"、"出差"、"病假"…

seo分享:慎重使用蜘蛛池

其实要提高搜索引擎蜘蛛的来访次数&#xff0c;唯一的方法还是要通过网站本身的内容更新。频繁更新有质量的内容&#xff0c;才能够提高蜘蛛的来访次数。如果本身内容更新不多&#xff0c;外部引流的蜘蛛过多&#xff0c;最终发现没什么内容索引&#xff0c;蜘蛛来访的次数也会…