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

进程优先级

  • 基本概念
  • 查看系统进程
  • 修改进程的优先级
  • 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.mfbz.cn/a/417672.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux设备模型(七) - Netlink

一,什么是netlink通信机制 Netlink套接字是用以实现用户进程与内核进程通信的一种特殊的进程间通信(IPC) ,也是网络应用程序与内核通信的最常用的接口。Netlink 是一种特殊的 socket,它是 Linux 所特有的。 Netlink 是一种在内核与用户应用间进行双向数…

PCB:多CAN口的信号转接板

背景 在测试多路CAN口时,需要频繁更换接口引脚,从而接入CAN收发器。为了提升测试效率,可以设计一个简易多路CAN收发器转接板。PCB板子一端是40脚母口,另一端是10路CAN螺钉式接线端子,自带电池减少接线。 分配空闲时间…

网络编程:基于TCP和UDP的服务器、客户端

1.基于TCP通信服务器 程序代码&#xff1a; 1 #include<myhead.h>2 #define SER_IP "192.168.126.121"//服务器IP3 #define SER_PORT 8888//服务器端口号4 int main(int argc, const char *argv[])5 {6 //1.创建用于监听的套接字7 int sfd-1;8 sf…

Sora:开启视频生成新时代的强大人工智能模型

目录 一、Sora模型的诞生与意义 二、Sora模型的技术特点与创新 三、Sora模型的应用前景与影响 四、面临的挑战与未来发展 1、技术挑战 2、道德和伦理问题 3、计算资源需求 4、未来发展方向 随着信息技术的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;已成为…

Unity(第九部)物体类

拿到物体的某些数据 using System.Collections; using System.Collections.Generic; using UnityEngine;public class game : MonoBehaviour {// Start is called before the first frame updatevoid Start(){//拿到当前脚本所挂载的游戏物体//GameObject go this.gameObject;…

Python算法100例-2.10 马克思手稿中的数学题

完整源代码项目地址&#xff0c;关注博主私信源代码后可获取 1.问题描述2.问题分析3.算法设计4.确定程序框架5.完整的程序6.运行结果 1&#xff0e;问题描述 马克思手稿中有一道趣味数学问题&#xff1a;有30个人&#xff0c;其中有男人、女人和小孩&#xff0c;他们在同一家…

C语言基础18 循环

们可能需要多次执行同一块代码。一般情况下&#xff0c;语句是按顺序执行的&#xff1a;函数中的第一个语句先执行&#xff0c;接着是第二个语句&#xff0c;依此类推。 编程语言提供了更为复杂执行路径的多种控制结构。 循环语句允许我们多次执行一个语句或语句组&#xff0…

小红书的几种赚钱方式解读

小红书的七种变现方式&#xff1a; 1.通过小红书蒲公英平台接广告&#xff0c;粉丝数量大于1000的用户可以开通。单条笔记的广告费用从几百元到几十万不等。 2.开设小红书专栏&#xff0c;粉丝数量大于1万的用户可以开通。 3.进行私域变现&#xff0c;将小红书的咨询引导到微信…

Java 小项目开发日记 03(文章分类接口的开发)

Java 小项目开发日记 03&#xff08;文章分类接口的开发&#xff09; 项目目录 配置文件&#xff08;pom.xml&#xff09; <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocat…

内核打印应用程序出错信息,DEBUG_USER

前言 在 Linux 系统中&#xff0c;运行一个应用程序&#xff0c;突然提示段错误&#xff0c;并停止运行 # ./crash.out Segmentation fault如果这个时候操作系统能多提示点错误信息&#xff0c;那将会缩短我们 debug 的时间。 core dump 就是一个办法&#xff0c;可以查看我…

javaWeb学习04

AOP核心概念: 连接点: JoinPoint, 可以被AOP控制的方法 通知: Advice 指哪些重复的逻辑&#xff0c;也就是共性功能(最终体现为一个方法) 切入点: PointCut, 匹配连接点的条件&#xff0c;通知仅会在切入点方法执行时被应用 目标对象: Target, 通知所应用的对象 通知类…

nginx(三)实现反向代理客户端 IP透传

正常情况下&#xff0c;客户端去访问代理服务器&#xff0c;然后代理服务器再取访问真实服务器&#xff0c;在真实服务器上&#xff0c;只能显示代理服务器的ip地址&#xff0c;而不显示客户端的ip地址&#xff0c;如果想让客户端的ip地址也能在真实服务端看见&#xff0c;这一…

数仓开发环境链接

这里写目录标题 1开发工具链接大数据组件1.1 启动hiveserver21.2配置DataGrip连接1.3测试使用 2 环境问题排查思路 1开发工具链接大数据组件 1.1 启动hiveserver2 数仓开发工具datagrip 需要用到JDBC协议链接到Hive&#xff0c;需要启动hiveserver2。 cd /opt/module/hive h…

string 类 经典习题之数字字符相加

题目&#xff1a; 给定两个字符串形式的非负整数 num1 和num2 &#xff0c;计算它们的和并同样以字符串形式返回。 你不能使用任何內建的用于处理大整数的库&#xff08;比如 BigInteger&#xff09;&#xff0c; 也不能直接将输入的字符串转换为整数形式。 题目来源&#xff1…

进程2月29日

题目&#xff1a;要求将当前路径下&#xff0c;所有文件的权限及最后一次的访问时间提取出来&#xff0c;写入到file.txt中。&#xff08;提示:opendir readir stat -->提取出来的数据写入到file.txt中&#xff09; 代码&#xff1a; #include <stdio.h> #include &…

C语言:数据在内存中的存储

C语言&#xff1a;数据在内存中的存储 整数存储原码、反码、补码转换规则数据与内存的关系 大小端字节序浮点数存储IEEE 754标准存储过程取用过程 数据的存储范围 整数存储 原码、反码、补码 整数的2进制表示方法有三种&#xff0c;即原码、反码和补码 三种表示方法均有符号位…

使用Python操作SQLite数据库

大家好&#xff0c;在数据涌现的今天&#xff0c;数据库已成为生活中不可或缺的工具。Python作为一种流行的编程语言&#xff0c;内置了多种用于操作数据库的库&#xff0c;其中之一就是SQLite。SQLite是一种轻量级的关系型数据库管理系统&#xff0c;它在Python中的应用非常广…

http模块学习

http模块 客户端&#xff1a;负责消费资源的电脑 服务器&#xff1a;负责对外提供网络资源的电脑&#xff0c;与普通电脑的区别就在于服务器上 安装了web服务器软件。 http模块是Node.js官方提供用来 创建web服务器的模块&#xff0c;通过http模块提供的http.createServer()方…

java之Bean对象

1. 什么是Bean&#xff1f; Bean被实例化的&#xff0c;是被Spring框架所管理的Java对象。 Spring容器会自动完成Bean的实例化。将所创建的的Bean自动注入到Ioc容器中以供调用。 spring框架中 IOC容器中管理的对象就是Bean对象 2. 第三方bean Bean 因为第三方bean&#xff0…

找不到mfc140.dll怎么办?教你五种mfc140.dll丢失的解决方法

当计算机系统中mfc140.dll文件丢失时&#xff0c;可能会引发一系列运行问题&#xff0c;影响到系统的正常功能及应用程序的稳定执行。具体来说&#xff0c;由于mfc140.dll是Microsoft Visual C Redistributable Package的重要组成部分&#xff0c;它的缺失会导致依赖于该动态链…
最新文章