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

news2024/10/12 6:24:55

文章目录

  • 进程的优先级
    • 什么是进程的优先级?
      • 进程的优先级的划分
        • 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.coloradmin.cn/o/2207288.html

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

相关文章

四款pdf转图片在线转换免费工具推荐:

大家好!今天我来给大家推荐几款PDF转图片的在线转换工具,让你轻松将PDF文件转换成图片,无论是工作还是学习,都能派上大用场。下面,让我们来看看这几款工具吧! 一、福昕转换器 直通车(粘贴到浏览…

多线程(二):创建线程关键属性终止线程

目录 1、run & start 2、Thread类常见的属性和方法 2.1 构造方法 2.2 属性 3、后台进程 & 前台进程 4、后台线程的判断和设定——isDaemon & setDaemon 5、线程是否存活——isAlive 6、终止一个线程 6.1 lambda变量捕获 6.2 currentThread & isInterr…

atomic physics

​​​​​​​ https://www.youtube.com/watch?v6F8Wjblb0vE&listPLX2gX-ftPVXVqAS_q3OfJDmPn8-EQld_r&index18

Python 工具库每日推荐 【logging】

文章目录 引言Python日志记录的重要性今日推荐:logging模块主要功能:使用场景:快速上手基本使用代码解释实际应用案例案例:文件日志记录器案例分析高级特性日志过滤器上下文管理器扩展阅读与资源优缺点分析优点:缺点:总结【 已更新完 TypeScript 设计模式 专栏,感兴趣可…

钢管X射线 焊缝缺陷检测数据集,3408张x射线焊缝缺陷图像,也有更多的图像数据集,可以进行扩充 目标检测任务。可制作上位机软件。

钢管X射线 焊缝缺陷检测数据集,3408张x射线焊缝缺陷图像,也有更多的图像数据集,可以进行扩充 目标检测任务。可制作上位机软件。 B lowhole Undercut Broken arc Crack Overlap Slag inclusion L ack of fusion Hollow bead 钢管X射线焊缝缺陷…

正则表达式 | Python、Julia 和 Shell 语法详解

正则表达式在网页爬虫、脚本编写等众多任务中都有重要的应用。为了系统梳理其语法,以及 Python、Julia 和 Shell 中与正则表达式相关的工具,本篇将进行详细介绍。 相关学习资源:编程胶囊。 基础语法 通用语法 在大多数支持正则表达式的语…

Github 2024-10-11 Java开源项目日报 Top9

根据Github Trendings的统计,今日(2024-10-11统计)共有9个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Java项目9TypeScript项目1Vue项目1C++项目1JeecgBoot 企业级低代码开发平台 创建周期:2062 天开发语言:Java, Vue协议类型:Apache License 2.…

除了Devops、DevSecOps和TestOps ,您还了解ITOps吗?

大家可能听说过Devops、DevSecOps、TestOps ,但是对于ITOps这个词儿可能会感到陌生,今天就带大家来了解一下什么事ITOps ITOps 信息技术运营 — 通常称为 IT 运营,或是 ITOps ,是实施、管理、 交付和支持 IT 服务的过程&#x…

Odoo:免费开源的装备制造行业信息化解决方案

概述 满足装备制造行业MTO、ETO、MTS等多种业务模式,从个性化的订单选配、多层级计划管理模式、复杂的物料齐套规划、频繁的设计变更管理、精细化制造执行和用料管控、精准的售后服务等行业特性,提供一站式整体解决方案。 行业趋势洞察 个性化定制 洞察…

FPGA中的亚稳态

一、建立时间和保持时间 对于数字系统而言,建立时间(setup time,Tsu)和保持时间(hold time,Th)是数字电路时序的基础。数字电路系统的稳定性,基本取决于时序是否满足建立时间和保持时…

详细版的Jsoncpp的使用,包括在VS环境下配置

目录 准备环境VS 环境下配置编译使用 基础概述Json 数组Json 对象 Jsoncpp 的使用ValueFastWriterReader示例 如果想要 Json 部署在 Linux 上 参考: https://blog.csdn.net/2303_76953932/article/details/142703683?spm1001.2014.3001.5502 C中原生不支持 Json,所…

ClickHouse 数据保护指南:从备份到迁移的全流程攻略

一、背景 运行3年的clickhouse需要迁移机房,迁移单库单表的140亿条的数据。采用clickhouse-backup 的方式进行备份迁移,打包备份,再加上数据拷贝,数据恢复 一共花费30分钟。数据在一定量级,避免使用SQL 导入导出的方式…

配置 Visual studio 2022 Connector C++ 8.0环境 连接MySQL

Connector C 8.0 环境配置 1. 配置 Connector C 头文件地址 (1) 在Mysql的安装路径中找到 MySQL\Connector C 8.0\include\jdbc 例如 : C:\Program Files\MySQL\Connector C 8.0\include\jdbc (2) 打开VS2022&…

如何用好 CloudFlare 的速率限制防御攻击

最近也不知道咋回事儿,群里好多站长都反映被CC 攻击了。有人说依旧是 PCDN 干的,但明月感觉不像,因为有几个站长被 CC 攻击都是各种动态请求(这里的动态请求指的是.php 文件的请求)。经常被攻击的站长们都知道,WordPress /Typecho 这类动态博客系统最怕的就是这种动态请求…

塔吊识别数据集 yolo格式 共5076张图片 已划分好训练验证 txt格式 yolo可直接使用

塔吊识别数据集 yolo格式 共5076张图片 已划分好训练验证 txt格式 yolo可直接使用。 类别:塔吊(Tower-crane) 一种 训练数据已划分,配置文件稍做路径改动即可训练。 训练集: 4724 (正面3224 负面1500) 验证集&#xf…

【父子线程传值TransmittableThreadLocal使用踩坑-及相关知识拓展】

文章目录 一.业务背景二.TransmittableThreadLocal是什么?三.问题复现1.定义注解DigitalAngel2.定义切面3.TransmittableThreadLocal相关4.线程池配置信息5.Controller6.Service7.测试结果8.问题分析9 解决办法及代码改造10.最终测试: 四.与 ThreadLocal…

【大模型实战篇】创建有效的大模型提示词Prompt(提示词工程)

1. 背景介绍 随着chatgpt、llama、chatglm、claude AI等一系列生成式 AI 工具的普及,很明显能感受到,个人的生产力得到了大幅地提升。这些生成式算法模型能够帮助我们开发新想法、轻松获取信息,并简化各种个人和职业任务。个人在日常生活、工…

问卷调查毕设计算机毕业设计投票系统SpringBootSSM框架

目录 一、引言‌ ‌二、需求分析‌ 用户角色‌: ‌功能需求‌: ‌非功能需求‌: ‌三、系统设计‌ ‌技术选型‌: ‌数据库设计‌: ‌界面设计‌: ‌四、实现步骤‌ ‌后端实现‌: …

Python快速编程小案例——猜数字

提示:(个人学习),案例来自工业和信息化“十三五”人才培养规划教材,《Python快速编程入门》第2版,黑马程序员◎编著 猜数游戏是一种经典的密码破译类益智游戏,通常由两个人参与。一个人在心中设…

【C++网络编程】(三)多线程TCP服务端程序

文章目录 (三)多线程TCP服务端程序多线程服务端客户端 (三)多线程TCP服务端程序 图片来源:https://subingwen.cn/linux/concurrence 主线程负责监听和连接多个客户端,子线程负责和对应的客户端进行通信&am…