【Linux进程篇5】理解分析更改->进程优先级❤️

server/2024/11/14 5:56:15/

 --------------------------------------------------------------------------------------------------------------------------------

每日鸡汤:无需匆忙,不要将就,缘分到了,就一定会在一起。

 --------------------------------------------------------------------------------------------------------------------------------

一:什么是优先级

优先级基本概念:

  • cpu资源分配的先后顺序,就是指进程的优先权(priority)。
  • 优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用,可能改善系统性能。
  • 还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整体性能

那么优先级到底是什么?

类比权限:优先级 VS 权限

权限:决定某文件资源能还是不能访问

优先级对于资源的访问,决定谁先访问,谁后访问。

二:为什么会有优先级

进程之间具有竞争性:

因为资源是有限的(本质)进程是多个的,就注定了进程之间属于竞争关系!!!

所以,操作系统就必须得保证大家良性竞争,确定优先级(谁先访问,谁后访问)。

优先级制定的不合理,进程长时间得不到CPU资源,该进程的代码无法得到推进。——就会引发该进程的饥饿问题!比如在用户层面的实例:“该页面长时间无响应”(该进程卡死了)。

三:Linux优先级是怎样实现的?

3.1:查看进程命令

进程:ps -l / ps -al

 输入:ps -al | head -1 ; ps -al | grep mypro

目前我们已经知道 PID 和 PPID 所代表的意思了。那么UID、PRI、NI它们代表什么意思呢? 

3.2:分析各个重要信息

UID

代表执行者的身份,用于代表用户的一个数据。

这里的 1001 就代表的该用户alin。 

PRI

优先级 (priority),数值越小,越早被执行,优先级也越高。

默认优先级PRI为80。

NI

代表这个进程的nice值,这个是进程优先级的修正数据。

默认NI值为0。

3.3:更改优先级

3.3.1:PRI and NI

  1. PRI也还是比较好理解的,即进程优先级,或者通俗点说就是程序被CPU执行的先后顺序,此值越小,进程优先级别越高
  2. NI,就是我们所要说的nice值了,其表示进程可被执行的优先级的修正数值
  3. PRI值越小越快被执行,那么加入nice值后,将会使得PRI变为:PRI(new)=PRI(old)+nice
  4. 这样,当nice值为负值的时候,那么该程序将会优先级值将变小,即其优先级会变高,则其越快被执行
  5. 所以,调整进程优先级,在Linux下,就是调整进程nice值
  6. nice其取值范围是-20至19,一共40个级别。PRI的取值范围 [80-20, 80+19],即PRI优先级的取值范围是60至99。

3.3.2:PRI vs NI

  1. 进程的nice值不是进程优先级,他们不是一个概念,但是进程nice值会影响到进程优先级变化()。
  2. 可以理解nice值是进程优先级的修正修正数据。 

3.3.3:更改优先级

更改优先级的本质:调整nice值来实现对优先级的调整。(PRI(new)=PRI(old)+nice

更改优先级的三种方法:nice,renice,top

nice法

nice [-n NI值] 命令

-n NI值:给命令赋予 NI 值,该值的范围为 -20~19

renice法

renice [优先级] PID

top法

普通用户无法更改,需要使用root用户

发现确实没有权限。 

进入top后按“r”–>输入进程PID–>输入nice值

比如先设定mypro进程的nice值是-10,那么该进程的PRI优先级就是80-10=70.

四:关于位图

4.1:运行队列数组和等待队列数组

操作系统是如何根据优先级而开展的调度呢?

// 操作系统运行队列
struct runqueue
{//...struct task_struct** run;struct task_struct** wait;struct task_struct* running[140];struct task_struct* waitting[140];//...
}

因为整个操作系统大概一共有140种指针进程,其中[0,99]这前100种指针进程我们大概一辈子也用不到,则就剩下的[100,139]共40个指针进程,正好对应40个优先级

操作系统运行队列中,有 run 二级指针指向运行队列指针数组running[140],有 wait 二级指针指向运行队列指针数组 waitting[140]。操作系统会根据进程优先级进程排进操作系统内运行队列或等待队列的各个位置。

比如有一个优先级为60的进程,会将其排入到运行队列数组的下标为100(专门链入优先级为60的进程)的位置之后。当该进程运行完后,则会将其“销毁”,但当一个时间片完后该进程任务没有做完,为了保证各个进程都能平等的运行,就会将该进程链入到等待队列的下标为100的PCB双向链表的位置之后。当然,在CPU运行进程(CPU运行队列数组内的进程)的时候,新加入生成的进程也会将其链入到等待队列当中(根据优先级链入到合适的位置)。

将running数组队列中的进程执行完毕后,即为空时,Swap(&run,&wait),这样,就有了新的运行数组和等待数组。此时,新的等待队列数组就是空的。新的运行队列数组就是“满的”。

那么,如何判断队列为空呢?判断队列是否为空,只能遍历数组。通过 位图 来判断是否为空。

4.2:位图 

位图的代码形式:

struct bitmap
{char bits[5];    
}

一个 char 类型8个比特位,所以5个char变量,就有40个比特位。正好对应了40个优先级。40个比特序列由0或者1组成的。例如:0000000011111111000000001111111111111111。一个比特位对应着一个优先级。当该优先级运行完为空时,对应的比特位就变为0,直至该40个比特位全为0时,该运行数组就为空了。即:通过这40个二进制来判断该40个指针是否为空。

调整优先级的本质:进程对应的PCB链入到对应的调度队列当中的子队列的数组下标上,即改变PCB的位置


http://www.ppmy.cn/server/141777.html

相关文章

以太坊系地址衍生算法分层确定性生成逻辑

文章目录 一、前言1.1 衍生算法生成的私钥1.2 随机生成的私钥二、私钥生成及私钥提取2.1 golang如何使用衍生算法生成私钥,然后为用户生成地址2.1.1 实现步骤2.1.2 golang代码示例2.1.3 代码说明2.2 地址交易时,如何提取地址私钥2.2.1 私钥恢复说明2.2.2 golang代码通过助记词…

k8s拓扑域 :topologyKey

主要用于定义Pod亲和性或反亲和性规则中的拓扑域,从而控制Pod在集群中的调度。 参数描述:仅支持在工作负载亲和/工作负载反亲和调度策略中使用。先圈定拓扑域(topologyKey)指定的范围,然后再选择策略定义的内容。 to…

详解二叉树(上)---堆

目录 一、树 1.2 树的相关术语 1.3 树的表示方法 二、二叉树 2.1 概念与结构 2.2 二叉树的特殊形式 2.3 二叉树的性质 2.4 二叉树的存储结构 1.顺序结构 2.链式结构 2.5 实现顺序结构二叉树(堆) 1.堆的概念 2. 堆的性质 3.堆的实现 三、全…

MySQL Workbench导入数据比mysql命令行慢

1.数据量 包含2812979条数据的csv文件 2.myql命令行用LOAD DATA INFILE命令导入 耗时1分钟13秒 3.用MySQL Workbench导入 从第一天晚上22点到次日下午16点才导入了45万条数据 4.原因 MySQL Workbench导入csv数据是使用自带的python和一系列的python代码,而mys…

【大数据学习 | HBASE】hbase shell基础实操

1. 查看hbase状态 # 进入hbase 命令行 hbase shell status 我这里没启用高可用hbase 1 active master, 0 backup masters, 2 servers, 1 dead, 1.0000 average load Took 5.2635 seconds 2. 查看版本号 version hbase:002:0> version 2.4.11, r7e672a0da0586e6b7449…

高效共享出行:基于SpringBoot的汽车管理系统

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及,互联网成为人们查找信息的重要场所,二十一世纪是信息的时代,所以信息的管理显得特别重要。因此,使用计算机来管理共享汽车管理系统的相关信息成为必然。开发…

Kotlin设计模式:Java中的桥接模式与中介模式

Kotlin设计模式:Java中的桥接模式与中介模式 abstract class AbsCls {abstract fun setFlag(f: Int)abstract fun getFlag(): Int }class ACls : AbsCls {private var flag 0constructor() {println("ACls constructor")}override fun setFlag(f: Int) {println(&qu…

开源TTS语音克隆神器GPT-SoVITS_V2版本地整合包部署与远程使用生成音频

文章目录 前言1.GPT-SoVITS V2下载2.本地运行GPT-SoVITS V23.简单使用演示4.安装内网穿透工具4.1 创建远程连接公网地址 5. 固定远程访问公网地址 前言 本文主要介绍如何在Windows系统电脑使用整合包一键部署开源TTS语音克隆神器GPT-SoVITS,并结合cpolar内网穿透工…