【Linux】进程优先级

简介: 【Linux】进程优先级

🌎进程的优先级




前言:

  进程优先级是操作系统中的一个重要概念,它直接影响着进程的调度顺序和执行权。了解进程优先级对于理解和优化系统的性能至关重要。那么话不多说,开启我们今天的话题!


🚀优先级相关

✈️什么是优先级

  在日常生活中,我们有很多排队的场景,公路上等红灯,在医院挂号,或者是在食堂吃饭等等,但是我们在公路上救护车可以无视红灯,医院里急诊病人可以优先挂号,以及食堂里老师肆意的插队…

  这些需要排队的事物,就可以看作进程,而像救护车,急诊病人,以及食堂的老师等等,这些都是具有优先权的象征,为什么要有优先权呢?一定是有更重要的事情去做

  所以我们就知道优先级是什么?进程要访问某种资源,进程通过一定的方式(排队),确认享受资源的先后顺序。

  相信细心的你也发现了,优先级不就是我们前面学习的权限吗?其实优先级和权限是有区别的:权限决定的是能不能的问题,而优先级是决定先后顺序的问题


✈️为什么要有优先级

  如果我们食堂的窗口远大于人数,如果我们自习室里的座位非常多,人却非常少,我们是不需要排队的,也就是说,当资源充足的时候,我们并不需要排队。

  所以,优先级产生的本质是因为资源相对比较少


✈️进程的优先级

  为了更直观的看到优先级,我们可以执行下面的代码:

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int main()
{
  while(1)
  {
    printf("this is a process, pid=%d\n", getpid());
    sleep(1);
  }
  return 0;
}

  我们让改程序跑起来变为进程,我们使用如下命令查看 进程属性

ps -la#显示当前用户的所有进程

  我们看到,横着的蓝色框是我们启动的进程,竖着的蓝色框有一栏叫做 PRI 的数值,其实 PRI 就是 priority ,优先权的意思

  竖着蓝框里是优先级,而优先级具有数值,那么就一定是 task_struct 里的一个属性:

struct task_struct
{
  int PRI;//优先级
  //...
}

  而我们运行自己写的程序,查询改进程的权限为80,这也就说明 Linux下进程的优先级本质就是数字

  其实Linux下优先级是可以被修改的,修改范围为 [60, 99] 这40范围内,且 进程的默认权限值是80而优先级 数字越小,表示该进程的 优先级越高


🚀调整进程优先级

✈️调整优先级

  我们清楚了进程的优先级是什么,以及为什么,接下来我们看一下到底该怎么做?

  运行上面的程序,打印出进程的pid,使用 top 命令进入到 Linux任务管理器

top#进入任务管理器

  打开top进入到任务管理器之后,输入 ‘r’ ,进入 修改进程权限的操作,再 输入进程标识符

  接着就会有文字提示:

  再输入要修改的值即可,比如,这里我输入10:

  这个时候再使用ps查看,就会发现进程的PRI这一项变为了90,但是我们发现,不仅仅是PRI这一栏变了,还有一栏叫做 NI 的值也变了,而且还刚刚好是我们输入的数值!

  其实,Linux系统支持用户调整优先级,但并 不是让用户直接修改 pri 值,而是修改 nice 值。而 nice 值 不是 优先级,而是 优先级的 修正数据

所以真正的优先级应该是:pri = pri(old) + nice ;old指老的优先级

  所以我们刚刚 修改的并不是优先级,而是nice值


✈️优先级极限测试

  但是果真如此吗?进程的优先级真的只能在[60,99]这个范围呢移动吗?如果不相信,我们可以来做一下极值测试:

  我们将程序的进程值调到 尽可能的大

  nice值变为19,pri变为99,就是我们给出的最大范围。

  如果我们把nice值设置为-10:

  我们发现,进程的pri变为了70,但是我们刚才不是刚把进程的优先级调至为99吗?

  其实这是因为:pri(old),是指老的优先级,这个优先级永远是80! 所以再次调整时,还是从80开始变化。

  我们把nice值设置为极小:

  进程的pri果然为60,所以nice值的范围就是 [-20, 19]

  可能你会有疑问,为什么要给进程优先级加上限制范围呢?

  如果不加限制,把自己的优先级调整的非常高,别人的优先级非常低,又因为OS是根据进程的pri来执行先后顺序的,这样做可能就会打乱操作系统执行顺序。
  这样常规进程就很难分配到资源,是不是有点 “兴,百姓苦,亡,百姓苦” 的感觉了,其实这就是一种 进程饥饿 的问题

  为了尽量避免进程饥饿的问题,现在的任何分时操作系统,都是较为公平的进行调度。


🚀Linux的调度与切换

  Linux调度切换是学习Linux系统编程重要知识,我们提前了解一下:

  我们之前说过,CPU并不会把一个进程全部执行完才切换下一个进程,而是 基于时间片进行轮转执行的。而关于进程的调度与切换,有以下几个相关特性:

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

  这里前面谈过了,为了避免竞争饥饿问题,操作系统会合理的给进程分配各种资源。

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

  进程的独立性是学习Linux系统编程特别重要的一个知识,多个进程在系统里同时运行,但是他们互不干扰,一个进程挂了不会影响另外的进程,就算是父子进程也是如此。

  • 并行多个进程在多个CPU下分别同时运行,称为并行。

  如果一台电脑有多个CPU,并且每个CPU下有对应数量的进程分别同时运行,那么就称之为并行。

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

  并发与并行不同,我们大部分人的电脑其实只有一个CPU,而进程通常会有多个,为了考虑资源分配等问题,每个进程都有自己的时间片,时间片用完就切换下一个进程,自己则重新排队,等待再次调度。

  虽然每次CPU执行任务只执行很少的时间片,但是对于我们人类来说并看不出来进程是在不断切换的。多个进程在一个CPU下采用进程切换的方式,一段时间内让多个进程都能推进任务,称之为并发。


📒✏️总结

  •  在操作系统中,资源总是少数,所以进程需要使用排队的方式,来获取资源,而有些重要的进程优先级较高,可以插队。
  •  进程的优先级是可调整的,调整范围为:[60, 99],实际上我们调整的是进程的nice值,nice值的范围是[-20, 19]。
  •  进程的调度和切换是操作系统中重要的概念,其中 竞争、独立、并发、并行 这些概念比较常见。

  如果这篇文章对你有帮助的话,还望留下一个小小的赞呀~~

相关文章
|
8月前
|
存储 Linux API
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
在计算机系统的底层架构中,操作系统肩负着资源管理与任务调度的重任。当我们启动各类应用程序时,其背后复杂的运作机制便悄然展开。程序,作为静态的指令集合,如何在系统中实现动态执行?本文带你一探究竟!
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
|
10月前
|
算法 Linux 调度
深入理解Linux操作系统的进程管理
本文旨在探讨Linux操作系统中的进程管理机制,包括进程的创建、执行、调度和终止等环节。通过对Linux内核中相关模块的分析,揭示其高效的进程管理策略,为开发者提供优化程序性能和资源利用率的参考。
321 32
|
6月前
|
并行计算 Linux
Linux内核中的线程和进程实现详解
了解进程和线程如何工作,可以帮助我们更好地编写程序,充分利用多核CPU,实现并行计算,提高系统的响应速度和计算效能。记住,适当平衡进程和线程的使用,既要拥有独立空间的'兄弟',也需要在'家庭'中分享和并行的成员。对于这个世界,现在,你应该有一个全新的认识。
259 67
|
5月前
|
Web App开发 Linux 程序员
获取和理解Linux进程以及其PID的基础知识。
总的来说,理解Linux进程及其PID需要我们明白,进程就如同汽车,负责执行任务,而PID则是独特的车牌号,为我们提供了管理的便利。知道这个,我们就可以更好地理解和操作Linux系统,甚至通过对进程的有效管理,让系统运行得更加顺畅。
150 16
|
5月前
|
Unix Linux
对于Linux的进程概念以及进程状态的理解和解析
现在,我们已经了解了Linux进程的基础知识和进程状态的理解了。这就像我们理解了城市中行人的行走和行为模式!希望这个形象的例子能帮助我们更好地理解这个重要的概念,并在实际应用中发挥作用。
114 20
|
4月前
|
监控 Shell Linux
Linux进程控制(详细讲解)
进程等待是系统通过调用特定的接口(如waitwaitpid)来实现的。来进行对子进程状态检测与回收的功能。
102 0
|
4月前
|
存储 负载均衡 算法
Linux2.6内核进程调度队列
本篇文章是Linux进程系列中的最后一篇文章,本来是想放在上一篇文章的结尾的,但是想了想还是单独写一篇文章吧,虽然说这部分内容是比较难的,所有一般来说是简单的提及带过的,但是为了让大家对进程有更深的理解与认识,还是看了一些别人的文章,然后学习了学习,然后对此做了总结,尽可能详细的介绍明白。最后推荐一篇文章Linux的进程优先级 NI 和 PR - 简书。
127 0
|
4月前
|
存储 Linux Shell
Linux进程概念-详细版(二)
在Linux进程概念-详细版(一)中我们解释了什么是进程,以及进程的各种状态,已经对进程有了一定的认识,那么这篇文章将会继续补全上篇文章剩余没有说到的,进程优先级,环境变量,程序地址空间,进程地址空间,以及调度队列。
91 0
|
4月前
|
Linux 调度 C语言
Linux进程概念-详细版(一)
子进程与父进程代码共享,其子进程直接用父进程的代码,其自己本身无代码,所以子进程无法改动代码,平时所说的修改是修改的数据。为什么要创建子进程:为了让其父子进程执行不同的代码块。子进程的数据相对于父进程是会进行写时拷贝(COW)。
90 0
|
8月前
|
存储 网络协议 Linux
【Linux】进程IO|系统调用|open|write|文件描述符fd|封装|理解一切皆文件
本文详细介绍了Linux中的进程IO与系统调用,包括 `open`、`write`、`read`和 `close`函数及其用法,解释了文件描述符(fd)的概念,并深入探讨了Linux中的“一切皆文件”思想。这种设计极大地简化了系统编程,使得处理不同类型的IO设备变得更加一致和简单。通过本文的学习,您应该能够更好地理解和应用Linux中的进程IO操作,提高系统编程的效率和能力。
329 34