进程的优先级详解(在Linux中观察进程优先级,优先级的概念,优先级范围,进程的切换和切换的过程和理解)

news/2024/10/16 7:10:36 标签: linux, 运维, 服务器, 操作系统

文章目录

  • 进程的优先级
    • 什么是进程的优先级?
      • 进程的优先级的划分
        • 1. 优先级的级别划分
        • 2. 动态与静态优先级
    • 那么为什么要有优先级呢?
      • 区分
    • 那么是怎么确定优先级的呢?
  • Linux中的优先级
    • Linux中的进程优先级
      • 补充
    • Linux优先级的范围
    • 进程的切换
    • 切换过程和理解

进程的优先级

什么是进程的优先级?

优先级就是获得某种资源的先后顺序,就比方说每次中午下课之后为什么同学们都争先恐的向食堂冲去,目的就是为了排队早点买饭,那么排队的本质就是确定优先级,谁先到谁的优先级高早买饭,谁晚到那么谁的优先级就是低那么就晚买饭,而这里竞争的资源就是午饭。

进程的优先级的划分

而进程的优先级是操作系统分配给各个进程的一个相对重要性的指标。它决定了在资源竞争时,哪个进程能够优先获得 CPU 时间、内存等系统资源。

1. 优先级的级别划分

通常,优先级被分为多个级别,例如高、中、低。高优先级的进程会在系统资源分配中获得更多的关注和更快的响应。例如,操作系统的关键服务进程通常具有较高的优先级,以确保系统的稳定运行。

2. 动态与静态优先级
  • 静态优先级:在进程创建时被分配,并且在整个进程的生命周期中保持不变。这种优先级通常基于进程的类型、重要性等因素确定。例如,系统内核进程可能被赋予较高的静态优先级。
  • 动态优先级:会随着进程的运行情况而变化。例如,如果一个进程等待输入 / 输出的时间较长,它的优先级可能会被提高,以确保它在资源可用时能够尽快得到服务。

那么为什么要有优先级呢?

上面说过优先级就是来让操作系统确定重要和次重要从而优先执行哪些进程使系统稳定,但是为什么要确定优先级呢?本质就是目标资源比较少,在一个电脑中CPU只有一个而电脑中的进程可能有即使上百个,所以CPU会被竞争。

区分

权限和优先级的区分,虽然这两个此八竿子打不着但是之前我有弄混过所以在这里说一下。
权限:能不能的问题,权限确定的是你能不能进门。
优先级:潜台词是你已经有权限了但是你需要有顺序,优先级是你进门了但是得排下队。


那么是怎么确定优先级的呢?

在进程属性中task_struct有几个特定的int类型的变量来表示优先级,而优先级越小代表这个进程的优先级越高。


Linux中的优先级

Linux中的进程优先级

1.我们在Linux中创建一个进程在这里插入图片描述
2.运行这个进程,在启动一个xshell在新的窗口查这个进程的详细信息
在这里插入图片描述

在这里插入图片描述
我们要进行观察的优先级就是PRI,NI这两个属性。

1.PRI(Linux的优先级)
2.NI(优先级的nice数据)

第一个PRI比较好理解但是第二个NI又是干什么的呢?
在Linux中最终优先级=pri(默认/老优先级)+nice来决定的而nice严格意义上来讲是优先级修正数据
在我们进程实际运行的时候我们可能想更改当前进程的优先级,虽然我们可以直接更改PRI,但是Linux中没有这样设计,有这种情况,就是在一个进程正在被调度的时候我们直接更改PIR会导致进程优先级混乱,所以Linux中加入一个nice值每当我们更改优先级的时候更改nice值,当遇到上面说的情况时并不是立即将这个进程的优先级进行更改,而是在这个进程调度结束之后重新计算最终优先级的值再进行更新。

补充

在这里插入图片描述
在这里有一个有趣的点就是UID,那么它是什么意思呢?
在这里插入图片描述
UID全称是:用户标识数字,再Linux系统中系统记录用户并不是用字符串来记录,而是给每个用户分配一个UID,字符串无论是修改还是比较时间复杂度都是比较高的,所以在每次确认和比较的时候都是用UID来进行的。

重点来了,UID的用处就是让系统知道是谁启动的这个进程,那么在Linux下

  1. 文件也会记录拥有者,所属组,和对应的权限
  2. Linux中一切皆文件
  3. 说有的操作都是进程,进程会记录谁启动的我

那么有了3.中的UID和1.中拥有者做对比就会得到对应的权限控制,所以因为文件可追溯,进程可追溯二者对照进而展开权限的管理 (例如:当我们启动一个进程来访问文件的时候,操作系统会检查看你是拥有者,所属组还是其他并找到对应权限,如果有权限进程继续运行,如果没有对应权限操作系统就是直接将你这个进程杀掉)


Linux优先级的范围

首先声明不建议大家修改优先级,因为我们用户并不是全局视角不能确定哪个进程最重要,我这里进行优先级修改是为了确定优先级的范围

首先我用top语句进行修改优先级,输入top之后按r输入要修改目标的pid之后就会像图片中一样,之后就可以修改优先级了(因为我想知道优先级最大多少所以我就直接输入了100)【注:如果修改不成功可能是OS禁止频繁修改,或者就是没有权限修改】
在这里插入图片描述
之后我们查看我们对应进程的属性
在这里插入图片描述

在刚在咱们把nice值由0➡100但是我们可以看到NI只到19,那么我们现在可以知道nice值最大取值是19。而老优先级是80+19=99就是现在得到的PRI(老优先级在上面图片中有 PIR=80,NI=0)

之后我们再次调整将nice值调成-100
在这里插入图片描述

之后我们查看我们对应进程的属性
在这里插入图片描述
在刚在咱们把nice值由100➡-100但是我们可以看到NI只到-20,那么我们现在可以知道nice值最小值是-20。而老优先级是80-20=60就是现在得到的PRI(老优先级在上面图片中有 PIR=80,NI=0)

那不知道大家注意到了吗,当我们更新优先级的时候老优先级都是从80开始从新计算的,所以我们这个操作严格来讲不应该叫更新优先级,而是应该叫优先级重置

至于为什么要有范围限制是因为我们用的操作系统是分时操作系统保证调度的公平不影响系统正常运行。


进程的切换

首先我们都知道每个进程都有时间片,时间到了,进程就会切换,Linux是基于时间片调度轮转的,而一个进程在时间片到了的时候,并不一定会跑完,所以必须可以在任何一个地方停止换入重新被调度切换————所以我们就引出了进程的切换这个问题。

我们用一个形象的例子来方便我们理解:
大学兵想必大家都听过,就是大学刚开始或者中途停学,学校保留学籍,等两年退伍之后继续回来上大学。
那么假设1.红狼这位同学现在是大一要去当大学兵,在他接到部队的通知之后,他做出了个伟大的决定,他回到寝室告诉了他好哥们乌鲁鲁这件事之后呢就收拾行李就去部队里了,但是呢学校也不到红狼同学是去部队了,于是按照旷课处理了,等红狼同学从部队回到学校之后人傻了,他被学校退学了…

假设2. 乌鲁鲁知道红狼去当大学兵之后呢,这位同学也要去当大学兵,他比红狼聪明一点,当他接到部队的之后呢之后呢,首先通知他的导员,导员告诉他办理大学兵的流程,他成功的向学校提交申请学校呢就把乌鲁鲁同学的学籍呢电脑保存一份,但是呢在部队回来之后乌鲁鲁同学呢,他忘记了给导员说了学校呢也不到他回来了,直接回到原来的寝室,听着之前老师讲的课,就这样这学期末的时候学校突然打电话说乌鲁鲁同学怎么还没回来呢?可是乌鲁鲁同学已经回来一个学期了,最后考试没有他的座位(-_-b),那是为什么呢?回来也要给学校打招呼,恢复学籍…

假设3. 威龙这位同学呢也是大一同学也要去当大学兵,当他接到部队的之后呢之后呢,首先通知他的导员,导员告诉他办理大学兵的流程,他成功的向学校提交申请学校呢就把威龙同学的学籍呢电脑保存一份,然后纸质档案一份,那么他做的事情呢是为了让学校给他保存学籍(保留历史运行痕迹),其实呢威龙同学保留他的学籍并不是目的而是手段那么他的目的呢是未来当兵结束回来继续学习才是目的。而威龙同学回来时候主动联系导员并且按学校流程恢复学籍,寝室还是保留他走之前的寝室,学习也是接着之前开始学习的。

说了这么多其实威龙同学的就是相当于进程,而学校呢就是操作系统,我们入伍当兵了呢就是时间片到了,那么我们每次时间片到了操作系统把进程从CPU上面拿下来这是要保留上下文数据,而再次到达这个进程的时间片的时候呢又要恢复上下文数据。就是我们进程调度100次那么我们就得保留和恢复上下文100(我要当100次大学兵,那么我就得保留恢复学籍100次…)

切换过程和理解

在进程运行的时候,会产生很多临时数据,都在CPU的寄存器中。
我们在上一篇博客里面说过想创建一个进程,那么先将磁盘中的数据加载到内存,再加入队列中如下图:
在这里插入图片描述

那么CPU怎么知道我再运行的时候运行到这个进程的哪行程序了呢?在CPU里面eip指针的作用呢就是保存当前正在执行指令的下一条指令的地址,例如:在CPU执行code1时,eip就会存储code2的地址,就好比一个秘书帮老板准备好下一个要处理的资料或者文件,如果有跳转比方程序执行完code2时,要直接执行code10那么在CPU执行code2的时候eip中存的就是code10的地址。如下图:
在这里插入图片描述

那么ir是什么呢?ir是指令寄存器,就是保存当前处理的指令。就是在CPU处理code1的时候实际上code1被保存在ir寄存器中。
在这里插入图片描述
所以寄存器保存我们的代码,加载到CPU中进行工作,CPU内部的寄存器保存的数据是进程执行时的瞬时状态的数据我们把这些数据叫做上下文数据
虽然CPU内有很多寄存器,但是所有寄存器被叫做一套寄存器寄存器不等于及寄存器里面的数据,所以寄存器不是上下文数据,寄存器里面的数据才是上下文数据
那么在进程的切换时,会先将停止的进程数据进行保存,之后在切换之间保存的上下文数据加载到寄存器中,所以进程的切换的核心就是上下文数据的保存与切换

那么上下文数据具体保存到哪里呢?
首先一定是保存到内存中的,但是具体在哪里呢,现在的计算机非常复杂我这里只是大概说一下,是会被保存到操作系统中的一个段叫做TSS,但是太复杂了(我现在不会嘿嘿)所以我现在认为进程的上下文就保存在每个进程的task_struck的程序计数器中。


http://www.niftyadmin.cn/n/5707532.html

相关文章

python机器学习(网络搜索和交叉验证)

""" 网格搜索: 指的是 GridSearchCV这个工具的功能, 可以帮助我们寻找最优的 超参数. 超参数解释: 在机器学习中, 我们把需要用户手动传入的参数称之为: 超参数. 交叉验证: 指的是对数据集进行划分, 即: 把数据分成N份进行验证 第1次:…

【Python语言进阶(二)】

一、函数的使用方式 将函数视为“一等公民” 函数可以赋值给变量函数可以作为函数的参数函数可以作为函数的返回值 高阶函数的用法(filter、map以及它们的替代品) items1 list(map(lambda x: x ** 2, filter(lambda x: x % 2, range(1, 10)))) # filter…

《诺贝尔物理学奖一百年》一书

郭奕玲、沈慧君编著,上海科学普及出版社2002年出版,我当时买到一本。全书400多页,讲解了从1901年至2001年所有物理诺奖得主的生平以及代表工作。 (1)高中物理课本是很厚的一本,当年我参加高考,据…

Java 二分查找算法详解及通用实现模板案例示范

1. 引言 二分查找(Binary Search)是一种常见的搜索算法,专门用于在有序数组或列表中查找元素的位置。它通过每次将搜索空间缩小一半,从而极大地提高了查找效率。相比于线性查找算法,二分查找的时间复杂度为 O(log n)&…

PyTorch单机多卡训练(无废话)

目前大家基本都在使用DistributedDataParallel(简称DDP)用来训练,该方法主要用于分布式训练,但也可以用在单机多卡。 第一步:初始化分布式环境,主要用来帮助进程间通信 torch.distributed.init_process_g…

【五】架构设计之接口幂等概述

架构设计之接口幂等 概述 在进行架构设计的过程中我们时常需要考虑接口幂等的实现方案,本文将梳理接口幂等相关的知识点,并且通过一个示例来进行讲解说明接口幂等的实现方案,实现接口幂等的方式有很多,通过本文我们可以整体了解到…

### 更新数据库时出错。原因:java.sql.SQLException: No database selected

更新数据库时出错。原因:java.sql.SQLException: No database selected 问题:原因:解决办法: 问题: 在基于idea环境中学习搭建mybatis框架时,MySQL数据库执行插入语句遇到以下异常: com.intel…

Excel:vba实现身份信息填写

实现的效果是“点击一键填写性别和年龄”,表的呈现如下: 代码如下: Sub 判断性别年龄()Dim idCard As StringDim birthDate As StringDim nian As Integer, yue As Integer, ri As IntegerDim currentDate As DateDim age As IntegerDim ge…