Linux内核调度优先级详解:如何优化你的系统性能

个人主页:chian-ocean

文章专栏-Linux

前言:

进程优先级调度是操作系统中的一种调度机制,其核心是为每个进程分配一个 优先级(Priority),然后根据优先级的高低决定进程执行的顺序和时间。这种机制确保了关键任务(优先级高)能够及时执行,而不那么重要的任务(优先级低)可能需要等待。

在这里插入图片描述

优先级调度

进程优先级调度是操作系统用来决定 哪个进程优先占用 CPU 的机制。它通过给每个进程分配一个 优先级值,优先级高的进程比优先级低的进程更早被调度运行。这种机制在 资源有限 的情况下,能够确保关键任务及时完成,同时提高系统的运行效率。

  • **优先级:**就是对资源访问优先的问题。
  • **存在的理由:**是由于CPU的资源不足。

Linux 中的PRI和NI

在 Linux 系统中,PRI(Priority)NI(Nice 值) 是两个与进程优先级相关的重要参数。它们共同影响进程在调度器中的调度顺序。以下是它们的关系和区别的详细说明:

ps -al | head - 1 ; ps ajx | grep <进程名>

在这里插入图片描述

PRI(Priority,优先级)

PRI 是进程的最终优先级值,由内核计算决定,直接影响调度器为进程分配 CPU 的顺序。

PRI 的范围
  • 实时任务:范围为 1 到 99,数值越小,优先级越高。
  • 普通任务:范围为 100 到 139,数值越小,优先级越高。
PRI 的计算公式

对于普通任务:

PRI=100+NI+动态调整值

  • NI 是进程的 Nice 值。
  • 动态调整值 是内核根据进程的运行情况动态计算的。
实时任务

实时任务的 PRI 只与其静态优先级有关,不会动态调整。

NI(Nice 值)

NI(Nice 值) 是用户空间设置的静态优先级,用于影响普通任务的 PRI。Nice 值的作用是调整进程的优先级,帮助用户控制某些任务的资源分配。

NI 的范围

Nice 值的范围为 -20 到 19

nice > -20   nice < 19
  • -20:最高优先级。
  • 19:最低优先级。
  • 默认值为 0
NI 的作用
  • Nice 值越低,进程优先级越高,进程更容易获得 CPU 时间。
  • Nice 值越高,进程优先级越低,进程更少占用 CPU。

**调整NI值(nice) **

在 Linux 系统中,可以通过 top 命令的交互模式来修改正在运行进程的 nice 值。这是一个方便的方式,无需退出 top 界面即可调整优先级。

启动 top 命令

top

你将看到系统中所有运行的进程列表。

在这里插入图片描述

找到目标进程

  • top 的输出中找到需要调整 nice 值的进程 PID
  • 使用快捷键 / 可以进行搜索。例如输入进程名称后按回车即可定位。

选择修改进程优先级的选项

  • 按下 r 键,top 会提示你输入目标进程的 PID。

输入目标进程的 PID

  • 根据提示,输入你需要修改的进程号(PID),然后按回车。

设置新的 nice

  • top 会提示你输入新的 nice 值。
  • 输入一个值(范围:-20 到 19),然后按回车。
  • 例如:
    • 输入 -10 提高优先级(需要 root 权限)。
    • 输入 10 降低优先级。
# 1. top
# 2. 按r
# 3. 输入基进程的PID
# 4. 输入修改的nice值

验证修改

  • top 界面中,找到对应的进程,检查其 NI 列(即 nice 值列)是否更新。
ps -al | head -1 && ps -al | grep <PID>or<进程名>

在这里插入图片描述

注意事项

  • 提高优先级(降低 nice 值)可能导致其他进程的响应变慢,因此要谨慎操作。

  • 普通用户尝试设置负值 nice(优先级提升)时,会提示权限不足。

执行

#普通用户的情况之下
1. top 2. r #设置nice值 
# 提示 permission denied

在这里插入图片描述

linux优先级调度策略

linux调度器的演变

Linux 调度器经历了多次改进,每次改进都更好地适应不同的应用场景:

  1. O(n) 调度器(早期 Linux 内核):简单但效率低。
  2. O(1) 调度器(Linux 2.6 引入):效率更高,但对实时性支持有限。
  3. 完全公平调度器(CFS)(Linux 2.6.23 引入):当前默认调度器,强调公平性和灵活性。

linux调度策略

Linux 内核为不同类型的任务设计了多种调度策略,分为实时调度策略普通调度策略

实时调度策略
  • SCHED_FIFO(先入先出)
    • 适用于高优先级、对时延敏感的任务。
    • 任务按照优先级依次调度,高优先级任务运行时不会被抢占,除非更高优先级任务出现。
  • SCHED_RR(轮转调度)
    • SCHED_FIFO基础上添加时间片机制,同一优先级的任务按时间片轮转。
    • 避免高优先级任务长期独占 CPU。
普通调度策略
  • SCHED_NORMAL(完全公平调度,CFS)
    • 默认调度策略,适用于大多数用户进程。
    • 核心是模拟“理想处理器”,为每个任务公平分配 CPU 时间。
  • SCHED_BATCH
    • 针对批处理任务设计,减少交互性以提高 CPU 利用率。
  • SCHED_IDLE
    • 用于优先级最低的任务,仅在系统空闲时运行。

CFS 的核心机制(现行调度器)

CFS 的公平性由以下几个核心机制保证:

虚拟运行时间(vruntime)
  • vruntime 是 CFS 的关键指标,用于表示一个任务已经消耗的“虚拟 CPU 时间”。

  • 任务的 Nice 值

    决定 vruntime 的增长速度:

    • Nice 值低(优先级高):vruntime 增长慢,任务获得更多调度机会。
    • Nice 值高(优先级低):vruntime 增长快,任务获得较少调度机会。

计算公式:

 \text{vruntime\_delta} = \text{实际运行时间} \times \text{权重因子} \

CFS 使用 红黑树 作为数据结构管理所有可运行的任务:

  • 红黑树的节点以任务的 vruntime 作为键值。
  • 树顶节点(vruntime 最小的任务)优先获得调度。
  • 任务完成一次时间片后,CFS 将更新该任务的 vruntime 并重新排序。
调度周期

CFS 按固定的时间间隔进行任务调度,每次调度会:

  1. 选择 vruntime 最小的任务运行。
  2. 更新任务的 vruntime。
  3. 将任务重新插入红黑树。

time 作为键值。

  • 树顶节点(vruntime 最小的任务)优先获得调度。
  • 任务完成一次时间片后,CFS 将更新该任务的 vruntime 并重新排序。
调度周期

CFS 按固定的时间间隔进行任务调度,每次调度会:

  1. 选择 vruntime 最小的任务运行。
  2. 更新任务的 vruntime。
  3. 将任务重新插入红黑树。

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

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

相关文章

Axure RP9 的详细安装及Axure入门应用

文章目录 一、Axure 是什么?二、Axure 的应用场景三、Axure 安装1. 下载安装2. 汉化授权 附&#xff1a;下载链接 一、Axure 是什么? 1、Axure 是一种强大的原型设计工具&#xff0c;它可以帮助设计师和产品经理快速创建交互式的、高保真度的原型&#xff0c;并进行用户体验…

pro文件转换为CMakeLists.txt文件,QT官方工具使用教程

某些情况需要使用cmake&#xff0c;如果手动将QT的pro文件转换成CMakeLists.txt&#xff0c;简短一点的pro还好&#xff0c;如果是比较复杂的pro&#xff0c;手动转换的时候需要长时间的debug&#xff0c;本人深有感受。 工具介绍&#xff1a; qmake2cmake工具创建一个CMakeL…

CDN信息收集(小迪网络安全笔记~

免责声明&#xff1a;本文章仅用于交流学习&#xff0c;因文章内容而产生的任何违法&未授权行为&#xff0c;与文章作者无关&#xff01;&#xff01;&#xff01; 附&#xff1a;完整笔记目录~ ps&#xff1a;本人小白&#xff0c;笔记均在个人理解基础上整理&#xff0c;…

深度学习实战车辆目标跟踪【bytetrack/deepsort】

本文采用YOLOv8作为核心算法框架&#xff0c;结合PyQt5构建用户界面&#xff0c;使用Python3进行开发。YOLOv8以其高效的实时检测能力&#xff0c;在多个目标检测任务中展现出卓越性能。本研究针对车辆目标数据集进行训练和优化&#xff0c;该数据集包含丰富的车辆目标图像样本…

windows使用zip包安装MySQL

windows通过zip包安装MySQL windows通过zip包安装MySQL下载MySQL的zip安装包创建安装目录和数据目录解压zip安装包创建配置目录 etc 和 配置文件 my.ini安装MySQL进入解压后的bin目录执行命令初始化执行命令安装 验证安装查看服务已安装 启动MySQL查看服务运行情况修改密码创建…

Dots 常用操作

游戏中有多个蚂蚁群落&#xff0c;每个蚂蚁属于一个群落&#xff0c;如何设计数据结构&#xff1f; 方法1&#xff1a;为蚂蚁组件添加一个属性 ID&#xff0c;会造成逻辑中大量分支语句&#xff0c;如果分支语句逻辑不平衡可能带来 Job 调度问题&#xff0c;每个蚂蚁会有一份蚂…

Django 后端数据传给前端

Step 1 创建一个数据库 Step 2 在Django中点击数据库连接 Step 3 连接成功 Step 4 settings中找DATABASES Step 5 将数据库挂上面 将数据库引擎和数据库名改成自己的 Step 6 在_init_.py中加上数据库的支持语句 import pymysql pymysql.install_as_MySQLdb()Step7 简单创建两列…

BaseCTF_web_week3

复读机 输入的东西会在下方显示出来&#xff0c;wp说是简单的SSTI&#xff0c;这里来学习一下SSTI SSTI模板注入 根据My4n师傅的《超详细SSTI模板注入漏洞原理讲解_ssti注入-CSDN博客》写的 用户的输入返回时会经过一个模板渲染&#xff0c;SSTI漏洞就是用户插入了可以破坏模板…

SQL server学习09-数据库编程(上)

目录 一&#xff0c;了解T-SQL语言 1&#xff0c;常量&#xff08;标量值&#xff09; 2&#xff0c;变量 1&#xff09;局部变量 2&#xff09;全局变量 二&#xff0c;内置函数 1&#xff0c;字符串函数 2&#xff0c;数学函数 3&#xff0c;日期时间函数 4&#x…

CentOS7系统下部署tomcat,浏览器访问localhost:8080/

我这里以本地的VMware虚拟机创建的CentOS为例,来讲解部署tomcat的步骤,阿里云的服务器ECS部署只需设置下安全组规则即可,Centos内一样。 首先启动VM,输入密码进入centos,用xshell连接 2. 在家目录输入 cd /usr/local 进入local目录, 输入 mkdir java &#xff0c;创建java目录…

解析 Ingress-Nginx 故障:排查思路与方法

文章目录 一、什么是Ingress-Nginx二、故障排除1.1Ingress-Controller日志和事件检查 Ingress 资源事件检查 Nginx 配置检查使用的服务是否存在调试日志 1.2对 Kubernetes API 服务器的认证服务认证服务账户Kube-Config 1.3使用GDB和Nginx1.4在 Nginx 4.2.5 或其他版本&#xf…

蓝桥杯物联网开发板硬件组成

第一节 开发板简介 物联网设计与开发竞赛实训平台由蓝桥杯大赛技术支持单位北京四梯科技有限公司设计和生产&#xff0c;该产品可用于参加蓝桥杯物联网设计与开发赛道的竞赛实训或院校相关课程的 实践教学环节。 开发板基于STM32WLE5无线微控制器设计&#xff0c;芯片提供了25…

【实操之 图像处理与百度api-python版本】

1 cgg带你建个工程 如图 不然你的pip baidu-aip 用不了 先对图片进行一点处理 $ 灰度处理 $ 滤波处理 参考 import cv2 import os def preprocess_images(input_folder, output_folder):# 确保输出文件夹存在if not os.path.exists(output_folder):os.makedirs(output_fol…

【LuaFramework】LuaFramework_UGUI_V2框架学习

GitHub - jarjin/LuaFramework_UGUI_V2: 基于tolua的热更新框架V2 旧版本是Unity 5.0&#xff0c;这个是新版本支持更高版本的 导入工程后先清除wrap 然后重新生成wrap&#xff0c;你会发现有个报空null&#xff0c;框架的问题总结下所有的框架wrap相关报错问题和修复方法&…

重温设计模式--状态模式

文章目录 状态模式&#xff08;State Pattern&#xff09;概述状态模式UML图作用&#xff1a;状态模式的结构环境&#xff08;Context&#xff09;类&#xff1a;抽象状态&#xff08;State&#xff09;类&#xff1a;具体状态&#xff08;Concrete State&#xff09;类&#x…

16×16LED点阵字符滚动显示-基于译码器与移位寄存器(设计报告+仿真+单片机源程序)

资料下载地址&#xff1a;​1616LED点阵字符滚动显示-基于译码器与移位寄存器(设计报告仿真单片机源程序)​ 1、功能介绍 设计1616点阵LED显示器的驱动电路&#xff0c;并编写程序实现在1616点阵LED显示器上的字符滚动显示。1616点阵LED显示器可由4块88点阵LED显示器构成。可采…

Scala图书管理系统

项目创建并实现基础UI package org.appimport scala.io.StdInobject Main {def main(args: Array[String]): Unit {var running truewhile (running) {println("欢迎来到我的图书管理系统&#xff0c;请选择")println("1.查看所有图书")println("2…

WPF+MVVM案例实战与特效(四十五)- 打造优雅交互:ListBox 的高级定制与行为触发(侧边菜单交互面板)

文章目录 1、引言2、案例效果3、案例实现1、依赖安装2、文件创建3、代码实现1、依赖引用与上下文2、个性化视觉效果:自定义 ItemContainerStyle3、页面样式与布局完整代码4、ViewModel 逻辑实现5、子界面代码:3、实现效果4、源代码获取5、总结1、引言 在WPF应用程序开发中,…

WPF+MVVM案例实战与特效(四十八)-实现一个自定义饼状图控件

文章目录 1、案例效果2、案例实现1、PieControl.xaml 代码2、样式代码如下:1、案例效果 2、案例实现 1、PieControl.xaml 代码 代码如下(示例): namespace PieControl {public class PieControl: Control

玩转OCR | 探索腾讯云智能结构化识别新境界

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀ 玩转OCR 腾讯云智能结构化识别产品介绍服务应用产品特征行业案例总结 腾讯云智能结构化识别 腾讯云智能结构化OCR产品分为基础版与高级版&am…