【Linux】进程优先级以及Linux内核进程调度队列的简要介绍

news2024/11/18 9:35:44

进程优先级

  • 基本概念
  • 查看系统进程
  • 修改进程的优先级
  • Linux2.6内核进程调度队列的简要介绍
  • 和进程优先级有关的概念
    • 进程切换

基本概念

为什么会存在进程优先级?
  进程优先级用于确定在资源竞争的情况下,哪个进程将被操作系统调度为下一个运行的进程。进程优先级允许操作系统根据进程的相对重要性和需求来分配有限的系统资源。
  在操作系统中,进程优先级是指操作系统调度器为每个进程分配的优先级级别

查看系统进程

在Linux中可以使用ps -l指令查看有关进程优先级的信息
在这里插入图片描述
同时,我们需要知道几个比较关键的i信息

  • UID 表示执行者的身份
  • PID 当前进程的id
  • PPID 当前进程父进程的id
  • PRI 当前进程的优先级
  • NI 当前进程的nice值

修改进程的优先级

  当我们需要修改进程的优先级时

  1. 输入top指令
  2. 输入r,然后再输入进程PID,最后输入nice值

在 Linux 中,执行 top 命令后按下 r 键,表示向 top 命令发送一个重新调度进程的信号。这个操作通常会让 Linux 内核尝试重新分配 CPU 时间片给进程,以优化系统的性能。
在这里插入图片描述

  • PRI还是比较好理解的,就是进程的优先级(这个值越小,就表示优先级越高)

  • NI就是nice值,表示的就是进程可被执行的优先级的修正数值

  • PRI计算规则如下:
    P R I ( n e w ) = P R I ( o l d ) + n i c e PRI(new)=PRI(old)+nice PRI(new)=PRI(old)+nice
      所以当nice值为负数的时候,就会使得PRI变小,从而使优先级变高。所以,调整进程优先级,实质上就是调整进程的nice值

  • nice的取值范围是[-20,19],一共40个级别

为什么调整进程优先级要受限制?
  如果不加以限制,将某个进程调整的很高,而其他的进程调整得很低,优先级高得进程,会优先获得资源,但是后续产生的常规进程就很难享受到CPU等资源,就会产生进程饥饿问题

注意

  • 进程的nice值不是进程的优先级,它们不是一个概念,但是进程NI会影响到进程优先级的变化

Linux2.6内核进程调度队列的简要介绍

在这里插入图片描述
  以上就是Linux2.6内核中进程调度队列的数据结构
  一个CPU只有一个runqueue
  首先看到活跃进程,进程中queue[140]是一个指针数组,这个数组中,下标从0到99是不使用的,只会使用下标100到139,这也正好对应了进程优先级一共有40个优先级。
  queue中每个元素都是指针,指针指向的是一个链表的头节点,而链表的每个结点都是一个task_struct的结构体,也就是pcb对象,相同优先级的进程的pcb对象就会被放到同个队列中。因此,我们可以将这个queue看作是这样的结构
在这里插入图片描述
  这样,判断活跃进程中是否还有进程,就只需要判断数组下标从100到139位置上是否还存在有效的队列地址就可以了
  但是,如果每次都是遍历整个数组的话,效率上又不太高,于是又添加了一个数组bitmap,这个数组有5个元素,且每个元素的类型都是int。由于int类型有32个bit位,所以整个数组就相当于是拥有了160个bit位,这个数组的意义就是通过bit位的位置来记录数组中所对应下标所指向的队列是否为空。(若队列不为空,则对应的bit位为1否则为0)
  举个例子,将整个数组所对应的bit为看作是一个整体,若第120个bit位为1,则说明queue数组中下标为120的元素所指向的队列中还存在进程(因为数组中一共有140个元素,所以需要至少140个bit位才能表示),变量nr_active表示当前是否有进程需要运行
  所以,CPU维护进程队列中的进程大致过程如下:首先看nr_active,看是否有进程,如果有的话,就会去数组bitmap中查看数组queue中哪个下标存在需要运行的进程,最后直接去对应的下标所指向的队列中拿到对应进程的pcb,并开始运行工作。
  当CPU正在执行活跃进程内的进程时,若后面又有了新的进程或者是当前进程的时间片已经被耗尽,为了不妨碍CPU的执行,就会将该进程放到过期队列中。通过上图的进程调度队列我们可以看到,所谓的活跃进程和过期进程实际上是被放到一个数组array上面的,且该数组的元素都是结构体类型。调度队列runqueue中还有两个变量分别是activeexpirea,这两个变量都是结构体指针类型,它们分别指向活跃队列和过期队列。
  随着时间的推进,活跃进程中的进程会不断减少,过期进程的进程会不断增多。操作系统并不会通过数组下标判断哪个是活跃队列哪个是过期队列,而是直接通过activeexpirea两个指针来判断,所以当活跃进程中的进程全部被执行完之后,要轮到过期队列了是,只用交换activeexpirea两个指针的内容即可
总结一下:
优先级:

  • 普通优先级:100~139
  • 实时优先级:0~99(不关心)

活动队列

  • 时间片还没有结束的所有进程都按照优先级放在该队列
  • nr_active: 总共有多少个运行状态的进程
  • queue[140]:一个元素就是一个进程队列,相同优先级的进程按照FIFO规则进行排队调度,所以,数组下标就是优先级!

从该结构中,选择一个最合适的进程,过程是怎么的呢?

  1. 从0下表开始遍历queue[140]
  2. 找到第一个非空队列,该队列必定为优先级最高的队列
  3. 拿到选中队列的第一个进程,开始运行,调度完成!
  4. 遍历queue[140]时间复杂度是常数!但还是太低效了!
    bitmap[5]:一共140个优先级,共140个进程队列,为了提高查找非空队列的效率,就可以用5*32个bit位表示队列是否为空,这样,便可以大大提高查找效率

过期队列

  • 过期队列中的放置的进程都是新增的进程或者是时间片被耗尽的进程
  • 当活动队列中的进程被处理完之后,会对过期队列中的进程重新计算

active指针和expired指针

  • active永远指向活动队列而expired永远指向过期队列
  • 随着时间的推进,活动队列中的进程逐渐变少而过期进程中的进程逐渐变多,当活动队列上的进程被执行完,就会发生两个指针内容的交换,这样过期队列就变成了新的活动队列

O(1)调度
  在系统中查找一个最合适调度的进程的算法的时间复杂度是常数级别的,所以被称之为是进程调度的O(1)算法

和进程优先级有关的概念

竞争性:竞争性: 系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级
独立性:多进程运行,需要独享各种资源,多进程运行期间互不干扰
并行:多个进程在多个CPU下分别同时运行
并发:多个进程在一个CPU下采用进程切换的方式,在一段时间内,让多个进程得以推进,称之为并发

进程切换

  当一个进程在CPU上运行时,CPU上所有的寄存器就要为该进程服务,由此,在运行期间,CPU中的寄存器会存储大量的临时数据(比如执行到哪一行、返回值是多少…)。在pcb对象中,存在一个字段称之为时间片,这个字段中存的是当前进程还剩多长运行时间,当时间片上的时间被耗尽时,也就是说CPU不会为该进程继续运算,这个时候就需要进行进程切换。
  进程切换之前首先要做的就是保存CPU寄存器中的临时变量(因为下一个进程运算时产生的临时数据会覆盖上一个进程的临时数据),这些临时变量最终都会被暂时保存到pcb中,将CPU内部寄存器与该进程相关的所有数据都称之为该进程的硬件上下文数据,这些数据保存在pcb中,就叫做保护上下文
  一般进程的调度有两种情况

  1. 如果时首次调度:将代码放到寄存器eip中,逐步去执行,并将中间产生的临时变量填充到寄存器中
  2. 如果时二次被调度:先将pcb中保存的硬件上下文数据恢复,然后代码从上次最后一次执行的位置后面开始执行

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1476132.html

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

相关文章

MFC 皮肤库配置

1.创建MFC 对话框 2.添加皮肤资源 添加资源 添加头文件 关闭SDL检测 添加静态库文件 修改字符集 添加头文件 将皮肤中的ssk文件加载到初始化实例中 > 运行即可

十三、Qt多线程与线程安全

一、多线程程序 QThread类提供了管理线程的方法:一个对象管理一个线程一般从QThread继承一个自定义类,重载run函数 1、实现程序 (1)创建项目,基于QDialog (2)添加类,修改基于QThr…

计算机网络-网络互连和互联网(四)

1.TCP协议: 传输控制协议,面向字节流按顺序连接,可靠,全双工,可变滑动窗口,缓冲累积传送。协议号为6。下面是TCP段(段头),TCP头(传输头)&#xf…

数学建模【神经网络】

一、神经网络简介 机器学习与神经网络 机器学习是一类实现人工智能的方法总称,让计算机模拟或实现人类的学习行为神经网络是实现机器学习的一种模型实现机器学习的模型还有支持向量机,决策树,朴素贝叶斯分类器等 神经网络能用来做什么 已…

Lyra游戏框架宏观框架梳理

想象一下一个完整游戏流程。 Loading界面。 进入场景。 弹出Menu菜单 加载角色。 角色动画系统-切换动画系统(默认-剑客-拳手) 角色皮肤切换 相机 角色可以接收到用户输入,然后进行前后左右移动。 角色可以接收到用户输入,…

C语言----联合体

不知道大家是否听说过联合体这个名词。但其实大家不用觉得联合体有多特殊,大家可以想象结构体是一栋楼,里面有很多房间,住了形形色色的住户(不用或者相同的数据)。但联合体只有一个房间,所有的住户都挤在这…

半小时到秒级,京东零售定时任务优化怎么做的?

导言: 京东零售技术团队通过真实线上案例总结了针对海量数据批处理任务的一些通用优化方法,除了供大家借鉴参考之外,也更希望通过这篇文章呼吁大家在平时开发程序时能够更加注意程序的性能和所消耗的资源,避免在流量突增时给系统…

认证模式~

认证方式 基于Cookie和Session的认证方式 基于Cookie和Session的认证是传统的Web应用认证机制。它依赖于HTTP协议无状态的特性,在客户端(浏览器)和服务器之间保持用户的状态。 工作原理 用户登录:用户通过输入用户名和密码来登…

【AIGC】OpenAI推出王炸级模型sora,颠覆AI视频行业

文章目录 强烈推荐前言什么是OpenAI Sora?工作原理:算法原理:应用场景展望与其他视频生成模型相比有哪些优势和不足?优点缺点 总结强烈推荐专栏集锦写在最后 强烈推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易…

Unity中字符串拼接0GC方案

本文主要分析C#字符串拼接产生GC的原因,以及介绍名为ZString的库,它可以将字符串生成的内存分配为零。 在C#中,字符串拼接通常有三种方式: 直接使用号连接;string.format;使用StringBuilder; 下面分别细…

table展示子级踩坑

##elemenui中table通过row中是否有children进行判断是否展示子集,通过设置tree-prop的属性进行设置,子级的children的名字可以根据自己的子级名字进行替换,当然同样可以对数据处理成含有chilren的子级list。 问题: 1.如果是根据后…

java大数据开发面试题,完美世界java面试题

02 JVM 线程JVM内存区域JVM运行时内存垃圾回收与算法JAVA四种引用类型GC分代收集算法 VS 分区收集算法GC垃圾收集器JAVA IO/NIOJVM类加载器 03 JAVA集合 接口继承关系和实现LISTSETMAP 04 JAVA多线程并发 JAVA并发知识库JAVA线程实现/创建方式4种线程池线程生命周期&#xf…

★【递归】【链表】Leetcode 21. 合并两个有序链表

★【递归】【链表】Leetcode 21. 合并两个有序链表 解法1 :递归链表 简直是好题啊好题多做做 ---------------🎈🎈题目链接🎈🎈------------------- 解法1 :递归链表 简直是好题啊好题多做做 >>>…

Time Travel

题目链接 解题思路 由于所有边集中的边加起来的总和至多为,无向图即,可以存下所以直接对所有边集中的边进行建边,同时对于每条边,记录其所在边集号对于每个边集,由大到小维护其能通过的时间点然后从1号跑最短路到当前…

javaWeb个人学习03

事务管理: 概述: 一个事务里面的操作 要么同时成功, 要么同时失败例子: 比如在根据id 删除部门的时候 当部门删除成功了 但是遇到了异常 导致下面的代码没有继续执行下去 就没法根据id删除员工的信息了 这个时候 事务就很重要了 开启回滚 或者提交事务 要么同时成功 要么同时…

【考研数学】《汤家凤 1800 》《张宇 1000 》《李永乐 660 》《李林 880 》应该如何选择?

本人数学逆袭的路上,深知选对一本题集对我的重要性!!! 我本科期间,数学并不是我的强项,但是我却能够在考研的时候靠数学甩开别人几十分成功上岸,一本优秀的题集起到了关键的作用。 1800题&…

MySQL的事务与隔离级别

1. 什么是事务? 数据库中的事务是指对数据库执行一批操作,而这些操作最终要么全部执行成功,要么全部失败,不会存在部分成功的情况。这个时候就需要用到事务。 最经典的例子就是转账,你要给朋友小白转 1000 块钱&…

选择排序,冒泡排序,插入排序,快速排序及其优化

目录 1 选择排序 1.1 原理 1.2 具体步骤 1.3 代码实现 1.4 优化 2 冒泡排序 2.1 原理 2.2 具体步骤 2.3 代码实现 2.4 优化 3 插入排序 3.1 原理 3.2 具体步骤 3.3 代码实现 3.4 优化 4. 快速排序 4.1 原理 4.2 具体步骤 4.3 代码实现 4.4 优化 为了讲…

如何优化一个看似正常的数据库

通常DBA是不会太了解业务逻辑的,遇到系统中劣质的sql 一般也是以通过添加索引的方式来优化,但是并不是所有的sql都能通过添加索引来优化 这就需要重sql的本身来做分析,另外还要了解什么样的语句会不走索引!本文通过几个简单的例子…

RK3568 android11 调试陀螺仪模块 MPU-6500

一,MPU6500功能介绍 1.简介 MPU6500是一款由TDK生产的运动/惯性传感器,属于惯性测量设备(IMU)的一种。MPU6500集成了3轴加速度计、3轴陀螺仪和一个板载数字运动处理器(DMP),能够提供6轴的运动…