Linux学习之路 -- PCB介绍 -- 进程优先级

news/2024/11/17 3:34:35/

1、什么是优先级?

进程需要某一种资源,而系统要通过特定的方式来决定谁先获得这些资源,而系统的做法就是给不同的进程安排不同的优先级。让优先级高的进程先享有一些资源。

2、为什么要有优先级

因为资源的缺乏,所以系统的才会设置优先级来安排哪一个进程先享有某些资源。在我们的电脑上可能只有一块cpu。但是,我们可能有上百个进程需要运行,这时候cpu资源就变得很紧缺了,所以我们就需要用优先来确定哪些进程可以先享有这些资源。

3、在Linux中的优先级

这里我们可以用一段简单的代码看看liunx系统中的优先级。

运行这段代码,并用ps -al 命令查看进程状态(这里ps -al 命令其实就是显示该用户运行的进程的情况)

这里右侧就是ps命令的执行结果,其中,我们可以看到一列PRI,这个就一般就可以看作linux系统下的优先级,而在我们的进程的task_struct里面,PRI其实就是一个整数。而这个整数默认一般都是80。(在其他操作系统中,默认值可能略有不同)。

在linux系统中,这个优先级是可以被修改,而linux的优先级的范围区间是[ 60 , 99 ],这里面有40个优先级,而这个表示优先级的数字越小,优先级越高。而在linux默认的优先级值是80(这里的PRI是内核调度器根据nice值来计算的,nice值的取值范围是[-20,19],这个nice是优先级的修正值。但是需要注意的,系统的PRI不一定是80,不同系统的PRI可能不同,这个值的计算也受多种因素的影响,主要分为这几个:

  1. nice值:这是用户可以通过nice命令设置的一个值,用于调整进程的优先级。nice值的范围是从-20到19,其中-20表示最高优先级(对于普通用户),19表示最低优先级。nice值越高,进程的优先级越低。

  2. 进程的调度类:Linux支持实时(RT)和标准(SCHED_OTHER)两种调度类。实时进程通常具有较高的优先级,可以抢占标准进程的CPU时间。

  3. 进程的状态:如等待(sleeping)、运行(running)、阻塞(blocked)等。不同的状态可能会影响进程的调度优先级。

  4. 进程的调度策略:Linux有多种调度策略,如CFS(Completely Fair Scheduler)、RR(Round Robin)等。不同的策略会对进程的优先级有不同的处理方式。(CFS其实算一个进程调度器,其调度策略是公平的,每个进程都可以得到公平的CPU时间)

  5. CPU亲和性:进程可以绑定到特定的CPU核心上,这可能会影响其优先级。绑定到高优先级核心的进程可能会获得更多的CPU时间。

  6. 进程的优先级队列:在某些调度策略中,如CFS,进程会被分配到一个优先级队列中。队列的优先级会影响进程的调度顺序。

  7. 进程的调度权重:在某些调度策略中,如CFS,每个进程都有一个调度权重,这会影响进程的调度优先级。

  8. CPU负载:如果系统处于高负载状态,调度器可能会调整进程的优先级以保证系统的稳定性和响应性。

  9. 系统配置:系统管理员可以通过修改系统配置文件(如/etc/sysctl.conf)来全局性地调整进程的优先级。

)

如果我们需要修改修改优先级,我们就可以根据上面的影响因素来对优先级进行调整(这里一般不建议随意调整),这里只介绍通过nice值调整优先级,其他方法可自行查阅(通过将进程调整为实时调度策略,cpu亲和性,修改系统文件改变进程调度权重等等)

这里我们可以先运行一个程序

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<stdlib.h>int main()
{while(1){printf("I am a process, pid:%d\n,",getpid());sleep(1);}return 0; 
}

然后打开top监视窗口,按R键,此时光标闪动的地方就是需要输入我们想要修改的进程的PID.

然后修改我们的nice值,输入10(意思就是让这个进程的优先级增加10)

此时我们就会发现,修改完后的PRI变成了90,NI(nice值)变成了10。这里的PRI = PRI(old) + nice ,需要注意的是,这里的nice值是覆盖式写入,意思就是第二次假如我输入的是-10,那这里的NI,就会变成-10,而不是0。同时,这里old也一直是80,所以第二次修正nice值后,PRI是变成了70,而不是由第一次的90变为80。

测试优先级的极值:我们可以测试一下当前进程的最大和最小优先级,这里我们直接把nice值输入成100,然后观察结果

这里我们可以看见,PRI最多就增长到99就停止了,而NI也没有变成100,而是变成19。同理,我们可以测出PRI最小减少到60就停止了,NI最小也就是-20。那这里为什么我们要对这些进程的优先级做一个限制呢? 如果我们的优先级不被限制的话,有人为了让自己的优先级更高,会无限制地调低优先级。而优先级更高地进程是能更快地享受CPU资源的,如果把用户把个人的进程优先级设置太高,就会造成常规进程迟迟无法享有CPU进程,这也叫做进程饥饿状态。

希望文章内容能对你有些许帮助,文中如有不当之处,还望各位大佬指正,谢谢!!!


http://www.ppmy.cn/news/1423038.html

相关文章

【JavaEE多线程】理解和管理线程生命周期

目录 ThreadThread类的常用构造方法Thread类的常见属性启动一个线程-start()终止一个线程等待一个线程-join()线程的状态 Thread Thread 就是在 Java 中&#xff0c;线程的代言人。系统中的一个线程&#xff0c;就对应到 Java 中的一个 Thread 对象。围绕线程的各种操作&#…

数据结构----顺序表

在学习顺序表之前&#xff0c;我们先来了解一下数据结构。 数据是什么呢&#xff1f; 我们在生活中常见的名字&#xff0c;数字&#xff0c;性别等都属于数据。 结构又是什么呢&#xff1f; 在计算机中&#xff0c;结构就是用来保存数据的方式。 总的来说&#xff0c;数据…

单片机入门还能从51开始吗?

选择从51单片机开始入门还是直接学习基于ARM核或RISC核的单片机&#xff0c;取决于学习目标、项目需求以及个人兴趣。每种单片机都有其特定的优势和应用场景&#xff0c;了解它们的特点可以帮助你做出更合适的选择。 首先&#xff0c;我们说一下51单片机的优势&#xff1a; 成熟…

Vue的虚拟DOM是什么

核心思想 虚拟DOM/Virtual DOM&#xff0c;是数据驱动视图的一种解决方案。核心思想&#xff1a;使用 js对象的形式来表现html的dom结构。 背景 由于现代网络和浏览器的发展&#xff0c;网页的内容也变得很复杂&#xff0c;ajax 诞生让用户可以在不刷新页面的条件下获取到数…

Spring Boot 学习(3)——Spring Initializr 创建项目问题解决

产生问题的原因&#xff0c;各种的版本都较老&#xff0c;所以导致出现问题。目前暂未打到合适的教程&#xff0c;按老教程学起来先。 小白瞎学&#xff0c;大神勿喷&#xff01; 再次强调环境&#xff1a;maven 3.3.9、jdk 1.8、idea 2017、Spring 4.3.13、Spring Boot 1.5.…

关键里程碑:自然语言处理的发展历程

关键里程碑&#xff1a;自然语言处理的发展历程 自然语言处理&#xff08;NLP&#xff09;是计算机科学和人工智能的一个分支&#xff0c;致力于使计算机能够理解和处理人类语言。以下是NLP发展过程中的一些关键里程碑&#xff1a; 1950s & 60s&#xff1a;NLP的基础 1954…

什么是交叉连接:全面概述

交叉连接是数据中心上下文中使用的术语&#xff0c;指的是在两个单独的硬件单元之间建立直接链接所需的物理电缆和连接。这些连接在促进数据中心内各个组件之间的高效和安全通信方面发挥着至关重要的作用。通过在硬件单元之间创建专用网络链接&#xff0c;交叉连接消除了对基于…

【域适应】基于深度域适应MMD损失的典型四分类任务实现

关于 MMD &#xff08;maximum mean discrepancy&#xff09;是用来衡量两组数据分布之间相似度的度量。一般地&#xff0c;如果两组数据分布相似&#xff0c;那么MMD 损失就相对较小&#xff0c;说明两组数据/特征处于相似的特征空间中。基于这个想法&#xff0c;对于源域和目…