iis服务器助手广告
返回顶部
首页 > 资讯 > 操作系统 >【Linux】进程优先级
  • 357
分享到

【Linux】进程优先级

linux服务器运维 2023-08-31 12:08:58 357人浏览 独家记忆
摘要

一、基本概念 Hello,大家好。本文我们要来介绍的是有关linux下【进程优先级】,首先我们要了解的是其基本概念 在 Linux基础篇之权限 一文中我们有谈到过什么是权限,在Linux下有

在这里插入图片描述

在这里插入图片描述

一、基本概念

Hello,大家好。本文我们要来介绍的是有关linux下【进程优先级】,首先我们要了解的是其基本概念

  • Linux基础篇之权限 一文中我们有谈到过什么是权限,在Linux下有权限和无权限的区别在哪里。那现在的话我们就要来对比一下【权限】和【优先级】这两个概念
    • 权限表示你能否做某事
    • 优先级表示你对于资源的访问,谁先访问,谁后访问
  • 所以对于优先级而言,我们是已经具备了做某事的权限,只是需要去考虑一个先后的问题

二、为什么会有进程优先级

接下去的话我们来谈谈为什么会存在进程的优先级这么一个东西

💬 首先我想要问的是:读者有时候是否会觉得自己的电脑会比较得卡呢?

  • 这是因为在计算机中,资源是有限的,而进程是多个的。所以注定了注定了 —— 进程之间是竞争关系!

💬 所以操作系统必须保证大家良性竞争,确认优先级,才可以组织所有的进程一一运行

  • 但如果进程长时间得不到CPU资源的话,该进程的代码将长时间无法得到推进,此时就涉及到《操作系统》这门学科的中的一个【饥饿问题】

💬 不仅如此呢,还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整体性能

所以呢,优先权高的进程有优先执行权利,有了优先级;才能使得一些重要的进程被率先执行

三、如何查看并修改进程优先级

知道了进程优先级的基本概念后,我们来Linux中看看它到底是个什么东西呢?

  • 我们可以对运行起来的进程使用下列指令去查看其优先级
ps -al
  • 此处我们要关注的是以下几个重要信息:
    • UID : 代表执行者的身份
    • PID : 代表这个进程的代号
    • PPID :代表这个进程是由哪个进程发展衍生而来的,亦即父进程的代号
    • PRI :代表这个进程可被执行的优先级,其值越小越早被执行
    • NI :代表这个进程的nice值

在这里插入图片描述

1、PRI and NI

那我们重点来讲解一下这两个信息值

  • 对于PRI还是比较好理解的,即 进程的优先级,或者通俗点说就是程序被CPU执行的先后顺序,此值越小进程的优先级别越高
  • NI呢? 就是我们所要说的nice值了,其表示进程可被执行的优先级的修正数值

💬 那有读者就很疑惑这个修正数值 的概念了

  • 通俗简单一点来讲呢,就是进程的nice值不是进程的优先级,他们不是一个概念,但是进程nice值会影响到进程的优先级变化。
  • 我们可以试着去更改一下这个nice 的值。首先的话我们执行[top]指令,进入到Linux下类似于【任务管理器】的界面

在这里插入图片描述

  • 接下去按下R/r之后,就会跳出来下面这句话,这里的renice指的就是要重新修改进程,此时 shell 正在等待我们输入进程的PID值,那我们就可以输入上方的635
PID to renice [default pid = 1]

在这里插入图片描述

  • 然后呢,我们看到 shell 又在等待我们输入需要更改的nice
Renice PID 635 to value

在这里插入图片描述

  • 然后我们可以试着来更改一下这个nice 的值,一开始看到其为80,现在呢我们将其减去30,不过在执行结束之后发现跳出了一个Permission denied,那对Linux权限清楚的同学就可以知道此为【权限拒绝

在这里插入图片描述

  • 以上呢是因为权限受到了拒接,我们是以普通用户的身份去执行,那么现在呢我们切换到了【root】之后就可以百无禁忌┗|`O′|┛了

在这里插入图片描述

那接下去呢,我们就来看看 root 到底有多少强大

  • 下面是Linux对于【PRI】的计算公式,我们一起来看看
PRI(new) = PRI(old) + nice
  • 此处可以观察到的是这个NI的值真的有发生变化,但是呢我们可以看到虽然修改的值为-30,但是最后去查看的时候却是-20,所以PRI的值就变成了[60]

在这里插入图片描述
💬 那有同学就会对上面的事情非常疑惑,这是为什么呢?

  • 上面我们说到,虽然存在这个【进程优先级】,但是呢我们可以通过修改NI的值去调整进程优先级,不过这个调整可不是让你乱调整的,Linux不想过多地让用户参与优先级的调整,所以存在这么一个取值范围是-20 ~ 19,一共40个级别。所以呢我们在调整【NI】的值时如果超出了这个范围的话也是会受到一定限制的。那么这个PRI的值就是在60 ~ 99之间,为闭区间
  • 我们可以再去试试看输入一个大一点的值,它就会被限制在99这个地方,而不会再上去了。读者也可以去试一其他的值,也是一样的,只会被限制在这个区间内部

在这里插入图片描述


这里的话再补充一点,其实对于普通用户而言也是可以去设置进程优先级的,我们一起来看看

  • 可以看到此处我是以普通用户的身份去进行,刚才我们输入-30遭到了Permission denied,但是呢现在但我们输入100的时候此时再出去查看这个进程的PRI值时却看到其确实也发生了变化

在这里插入图片描述
💬 这里的话给读者普及一下

  • 在Linux系统中其允许 root 用户设置负数优先级,以及减小现有进程的优先级数值大小;但是对于 普通用户 而言,我们虽然不可以设置负数优先级,但是呢却可以去设置【正数优先级】,可以去增大现有进程的优先级数值大小

以上就是如何去查看并修改当前进程的优先级,不过对于一个进程的优先级大家还是最好不要进行轻易的修改,否则的话会带来一些不必要的麻烦🧨

2、位图的基本概念

这个概念的话我会在讲解c++专栏文章的时候详细说到,这里点到为之

💬 首先我想问的是:操作系统是如何根据优先级,开展的调度呢?

  • 首先我们要知道对于位图来说其实就是一整串的01序列,就像下面这样
0000000000000000001111111111111111111
  • 我们假设现在位图的结构为以下的这个结构体,那么现在如果我们想要去找这个位图中的第N个比特位的话,就需要去做一个位运算
struct bitmap{char bits[100];}
  • 因为bits数组中有100个元素,一个char类型的元素存在8个比特位,那么我们就可以通过计算当前下标和 pos 的值,然后进行一个位运算来得出这个N具体的所在位置

在这里插入图片描述

四、透过调度算法理解进程优先级

我们在讲解 进程的基本概念 时说到每一个CPU都要去维护一个运行队列即run_queue

  • 我们看到这里有一个run_queue的运行队列,里面呢有两个指针数组,其里面存放的都是指向task_struct的结构体指针。这个指针数组的[0, 99]号下标一般都是不用的,给其他的进程使用的,所以我们使用的便是[100, 139]这个区间
  • 那读者可以计算一下这个区间的数据有多少呢?没错,就是40!如果你有认真阅读本文的话就会对这个数字非常得敏感了,那即使我们在前面介绍进程优先级的时候所讲的NI,那时候的范围是[60, 99],其中也包含40个数字

在这里插入图片描述

  • 接着看到这个指针数组所指向的内容,每一个指针都指向了一个task_struct,即一个进程PCB,此后如果有相同优先级的进程来了,那么就像队列一样排在后面,如果有这个优先级不一样的进程,那么就链在其他结构体指针的后面
  • 对于下面的这种结构来说,我们称之为【散列表 / 哈希表】,会在C++系列文章中介绍到

在这里插入图片描述

那读者应该可以感觉到这个操作系统中的进程是不断需要被执行的,那我现在想问:如果CPU现在正在调度这个运行队列,但此时又有新的进程过来了,此时该怎么处理这个进程呢?

  • 我们看到在run_quque中其实还有两个二级指针,为【run】和【wait】,它们分别又指向了runningwaiting,此时看到右侧的这个画面,它们其实是两个镜像队列,上面的队列正在被CPU调度运行,而下面的队列则为等待队列,如果是有新的进程需要被调度执行的时候就先链接到这个等待队列中

在这里插入图片描述
💬 那有同学问:那一个队列就一直运行,另一个队列就一直等待吗?

  • 这当然不会了,如果上方的运行队列中的进程都执行完毕了的话,此时就会执行下面的这句代码,将两个队列中的进程去做一个交换即可
swap(&run, &wait);

那我们要怎么知道这个当前的运行队列是否为空呢?

  • 这里的话就需要使用到我们上面所讲到过的【位图】,我们在这个run_queue的结构体中再新增一个成员叫做is_empty的位图结构变量。
  • 那我们现在定义一个char类型的数组,大小为5,那我们现在通过这个数组去遍历这个进程队列的时候,假设第一位为进程优先级为 60 的这一组是否为空、第二位为进程优先级为 61 的这一组是否为空。我们用0代表空,用1代表非空,那如果我们要去判断一下这个进程队列是否为空的话只需要看看这个 01序列是否为0即可,如果想要查找哪个进程优先级中的队列不为空的话,只需要去找这个序列中为【1】的即可

在这里插入图片描述


五、总结与提炼

最后总结一下本文所学习的内容📖

  • 首先呢我们了解到了进程优先级的基本概念,其与【权限】不同的地方在于优先级我们是对于资源的访问,谁先访问,谁后访问
  • 那存在进程优先级的原因在计算机中,资源是有限的,而进程是多个的,所以一定会存在着竞争关系。那如果有了【进程优先级】的话我们就可以 把不重要的进程安排到某个CPU,可以大大改善系统整体性能
  • 那一个进程既然存在优先级的话我们就可以试着到Linux中查看并修改它,此处我们主要是通过NI这个值去进行一个修改,但是呢我们在修改的时候要注意分寸,Linux为了防止用户去做过多的修改,就对这个NI的值做了一个限定,范围定死在了[60, 99],所以我们过多地向上或者是向下进行修改的话,是不会超出限制的
  • 最后呢,我们就通过这个操作系统底层的【调度算法】来进一步理解进程的优先级,再一步步完善这个run_queue这个运行队列的同时,我们很清楚地知道了操作系统面对如此多的进程,是怎样做好合理规划的呢,是通过维护两个镜像等待队列,交替执行里面的进程

以上就是本文要介绍的所有内容,感谢您的阅读🌹

在这里插入图片描述

来源地址:https://blog.csdn.net/Fire_Cloud_1/article/details/132368184

--结束END--

本文标题: 【Linux】进程优先级

本文链接: https://www.lsjlt.com/news/385620.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 【Linux】进程优先级
    一、基本概念 Hello,大家好。本文我们要来介绍的是有关Linux下【进程优先级】,首先我们要了解的是其基本概念 在 Linux基础篇之权限 一文中我们有谈到过什么是权限,在Linux下有...
    99+
    2023-08-31
    linux 服务器 运维
  • linux中进程有没有优先级
    今天小编给大家分享一下linux中进程有没有优先级的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一...
    99+
    2023-04-20
    linux
  • 【Linux】环境变量和进程优先级
    目录 环境变量 什么是环境变量 系统结构 系统接口 深度解析 命令行参数 进程优先级 优先级查看 优先级修改 进程间的概念 环境变量 什么是环境变量 🍮平时在使用 Linux 的时候,总会使用 ls 、pwd 这类的...
    99+
    2023-08-31
    linux 运维 服务器
  • 【Linux】进程状态|优先级|进程切换|环境变量
    文章目录 1. 运行队列和运行状态2. 进程状态3. 两种特殊的进程僵尸进程孤儿进程 4. 进程优先级5. 进程切换进程特性进程切换 6. 环境变量的基本概念7. PATH环境变量8....
    99+
    2023-09-02
    linux 运维 服务器
  • Win11如何调高进程的优先级?Win11调高进程的优先级方法
      相信很多使用过电脑的小伙伴都知道,系统资源是有限的,因此我们在打开很多的应用程序就需要设置一个优先级,那么使用Win11系统的电脑要如何去进行这个设置呢?其实操作起来还是很简单的,下面就和小编一起来看看方法吧。   ...
    99+
    2023-05-19
    Win11调高进程 进程优先级
  • 【Linux】关于进程的理解、状态、优先级和进程切换
    文章目录 📝一、操作系统进程1.运行队列2.运行状态 📝二、Linux进程状态📝三、两个特殊进程1.僵尸进程2.孤儿进程 ...
    99+
    2023-09-06
    linux 服务器 运维
  • Android进程保活之提升进程优先级
    一、1 像素 Activity 提高进程优先级 使用 Activity 可以提升进程的 oom_adj 值 ; APP 进入后台后 , 使用 BroadcastReceiver 广播...
    99+
    2024-04-02
  • Linux的进程优先级NI和PR有哪些区别呢
    这篇文章将为大家详细讲解有关Linux的进程优先级NI和PR有哪些区别呢,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。为什么要有进程优先级这似乎不用过多的解释,毕竟自从多任务操作系统诞生以来...
    99+
    2023-06-16
  • 【Linux】Linux进程的理解 --- 冯诺依曼体系、进程描述符、状态、优先级、切换…
    如果不改变自己,就别把跨年搞的和分水岭一样,记住你今年是什么吊样,明年就还会是什么吊样!!! 文章目录 一、冯诺依曼体系结构(硬件)二、操作系统(软件)1.操作系统是什么?2.如何理解管理(...
    99+
    2023-09-11
    linux 网络 运维 服务器
  • Linux基础命令---升值程序优先级nice
    nicenice指令可以设置程序运行的优先级,优先级会影响到程序的调度时间。nice的范围是-20~19,其中-20级别最高,19级别最低。此命令的适用范围:RedHat、RHEL、Ubuntu、CentOS、SUSE、openSUSE、F...
    99+
    2023-06-05
  • 【看表情包学Linux】进程优先级 | 查看系统进程 | 优先级修改 | 进程的切换 | 竞争性与独立性 | 并行并发的概念 | 环境变量
      🤣 爆笑教程 👉 《看表情包学Linux》👈 猛戳订阅  🔥 ​ 💭 写在前面:我们先讲解进程的优先级,探讨为什么会存在优先级,以及如何查看系统进程、进程优...
    99+
    2023-09-10
    服务器 运维 linux
  • 如何进行Java线程同步的优先级介绍
    这篇文章给大家介绍如何进行Java线程同步的优先级介绍,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Java线程同步在使用的时候需要我们主要很多的事情,下面我们就来看看如何才能更好的使用这个语法呢?首先我们来看看线程的...
    99+
    2023-06-17
  • C#线程优先级是什么
    本篇内容主要讲解“C#线程优先级是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#线程优先级是什么”吧!C#线程优先级的必要性:如果在应用程序中有多个线程在运行,但一些线程比另一些线程重要...
    99+
    2023-06-17
  • nginx缓存优先级
    接触nginx的兄弟或多或少都有遇到缓存问题,要么是nginx为什么不缓存,要么就是nginx缓存很快就失效等等问题,在网上找了一遍nginx缓存优先级的文章,大家可以参考下。架构图client端  <-----------...
    99+
    2023-06-04
  • 揭示Go语言运算符优先级的奥秘:揭示顶级优先级
    深入探究Go语言运算符优先级,揭示顶级优先级是什么,需要具体代码示例 在Go语言中,运算符优先级是指不同运算符之间的执行顺序。了解运算符的优先级对于正确理解和书写代码至关重要。本文将深入探究Go语言中的运算符...
    99+
    2024-01-18
    Go语言 运算符优先级 深入探究
  • Java 运算符优先级
    在 Java 中,每个运算符都有一个优先级,优先级高的运算符会先执行,而优先级低的运算符会后执行。如果有多个运算符在同一个表达式中出现,那么需要按照运算符优先级的规则确定它们的执行顺序。 Java 运...
    99+
    2023-09-21
    java
  • java线程优先级指的是什么
    这篇文章给大家分享的是有关java线程优先级指的是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Java可以用来干什么Java主要应用于:1. web开发;2. Android开发;3. 客户端开发;4. 网...
    99+
    2023-06-14
  • C#使用ThreadPriority设置线程优先级
    一、简介 如果在应用程序中有多个线程在运行,但一些线程比另一些线程重要,这种情况下可以在一个进程中为不同的线程指定不同的优先级。线程的优先级可以通过Thread类Priority属性...
    99+
    2024-04-02
  • c++中=和==的优先级
    = 运算符优先级高于 == 运算符。这意味着赋值操作优先于相等性比较执行。因此,在赋值操作之后进行相等性比较可能会导致意外结果。 C++ 中 = 和 == 的优先级 在 C++ 中,赋...
    99+
    2024-05-10
    c++ 代码可读性
  • 【Java】PriorityQueue--优先级队列
    目录  一、优先级队列  (1)概念 二、优先级队列的模拟实现 (1)堆的概念  (2)堆的存储方式   (3)堆的创建 堆向下调整 (4)堆的插入与删除 堆的插入  堆的删除 三、常用接口介绍 1、PriorityQueue的特性 2...
    99+
    2023-08-31
    数据结构 java idea 算法 面试
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作