【Linux系统编程】—— 深入理解Linux进程优先级与调度机制

news/2025/1/19 12:09:11/

文章目录

  • 进程优先级的基本概念
  • 如何查看系统进程
  • PRI和NI:优先级与Nice值
  • 查看和调整进程优先级
  • 补充概念-竞争、独⽴、并⾏、并发
  • 进程切换
  • Linux2.6内核进程O(1)调度队列
    • ⼀个CPU拥有⼀个runqueue
    • 优先级
    • 活动队列及其优化
    • 过期队列
    • 过期队列与活动队列的结构
    • active指针与expired指针

前言: 在多任务操作系统中,进程优先级的配置对于资源的分配起着至关重要的作用。Linux系统,作为一个广泛使用的多任务操作系统,它的进程调度机制依赖于优先级来合理分配CPU资源。本文将详细探讨进程优先级的概念、如何查看和调整进程的优先级,以及相关的系统概念。

进程优先级的基本概念

在Linux系统中,进程优先级(Priority)决定了进程被执行的顺序。优先级高的进程会优先获取CPU资源,执行的优先权也较高。优先级值越低,进程的优先级越高,这意味着该进程更有可能被CPU优先执行。合理配置进程的优先级,对于提升系统的整体性能尤其重要。

此外,Linux还提供了将进程运行到指定CPU的功能。通过将不重要的进程分配到特定的CPU上,可以更有效地利用CPU资源,避免系统性能下降。

如何查看系统进程

在Linux或Unix系统中,我们可以使用ps -l命令来查看当前运行的进程。输出信息中包含了多个有用的字段,帮助我们理解每个进程的状态。以下是一些重要字段:

  • UID:表示进程的执行者身份。
  • PID:代表进程的标识符。
  • PPID:表示该进程的父进程ID。
  • PRI:进程的优先级。值越小,优先级越高。
  • NI:进程的nice值,影响进程的优先级。
    在这里插入图片描述

PRI和NI:优先级与Nice值

PRI(Priority)是进程的优先级,其值越小,优先级越高,进程越有可能先执行。NI(Nice)是进程的优先级修正值,可以调整进程的优先级。通过修改nice值,用户可以间接地影响进程的PRI值。

具体地,进程的新PRI值计算公式为:

PRI(new) = PRI(old) + nice

当nice值为负时,进程的优先级会变小(优先级提升);当nice值为正时,进程的优先级会变大(优先级降低)。nice值的范围是-20到19(PRI的值为0~99),越小表示优先级越高,越大表示优先级越低。

查看和调整进程优先级

在Linux中,查看进程优先级的常用命令是top。通过top命令,我们不仅能够查看各个进程的优先级,还能实时调整进程的nice值:

输入top命令启动进程监视。
按r键,选择需要调整的进程PID。
输入新的nice值来调整该进程的优先级。
除了top命令外,Linux还提供了nice和renice命令来分别调整进程的初始优先级和修改已经运行中的进程的优先级。

补充概念-竞争、独⽴、并⾏、并发

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

  • 独⽴性: 多进程运⾏,需要独享各种资源,多进程运⾏期间互不⼲扰

  • 并⾏: 多个进程在多个CPU下分别,同时进⾏运⾏,这称之为并⾏

  • 并发: 多个进程在⼀个CPU下采⽤进程切换的⽅式,在⼀段时间之内,让多个进程都得以推进,称之为并发

  • 在这里插入图片描述

进程切换

CPU上下⽂切换:其实际含义是任务切换,或者CPU寄存器切换。当多任务内核决定运⾏另外的任务时,它保存正在运⾏任务的当前状态,也就是CPU寄存器中的全部内容。这些内容被保存在任务⾃⼰的堆栈中,⼊栈⼯作完成后就把下⼀个将要运⾏的任务的当前状况从该任务的栈中重新装⼊CPU寄存器,并开始下⼀个任务的运⾏,这⼀过程就是context switch。
在这里插入图片描述
时间⽚:当代计算机都是分时操作系统,没有进程都有它合适的时间⽚(其实就是⼀个计数
器)。时间⽚到达,进程就被操作系统从CPU中剥离下来。

Linux2.6内核进程O(1)调度队列

在这里插入图片描述
上图是Linux2.6内核中进程队列的数据结构,之间关系也已经给⼤家画出来,⽅便⼤家理解

⼀个CPU拥有⼀个runqueue

  • 如果有多个CPU就要考虑进程个数的负载均衡问题

优先级

  • 普通优先级:100〜139(我们都是普通的优先级,想想nice值的取值范围,可与之对应!)
  • 实时优先级:0〜99(不关⼼)

活动队列及其优化

在操作系统的进程调度中,活动队列(Active Queue)用于管理处于运行状态的进程。活动队列不仅管理进程的排队顺序,还涉及进程的优先级和调度策略。以下是活动队列的关键概念及其优化过程的整理:

  1. 活动队列的基本概念
    nr_active:表示当前活动队列中处于运行状态的进程总数。它用于记录系统中所有正在运行的进程数量。
    queue[140]:这是一个数组,其中每个元素对应一个优先级队列。进程按照优先级排队,相同优先级的进程使用先进先出(FIFO)规则进行调度。数组下标代表进程的优先级,因此queue[0]表示优先级最高的进程队列,queue[139]表示优先级最低的进程队列。
  2. 进程调度的基本过程
    操作系统根据活动队列进行进程调度的过程如下:
    遍历队列:从queue[0]开始遍历,查找非空的进程队列。
    选择最高优先级的进程队列:找到第一个非空队列,该队列中的进程具有最高的优先级。
    选中并执行进程:从该非空队列中选择第一个进程进行调度执行。
    调度完成:该进程开始执行,调度过程结束。
    该过程的时间复杂度通常为常数时间,因为队列的遍历通常是有限的,但存在低效的情况。
  3. 低效问题及优化方案
    直接遍历queue[140]来查找非空队列存在效率问题,尤其在系统中进程数量较多时,这种遍历方式会变得低效。为了提高查找非空队列的效率,可以通过使用位图(bitmap)进行优化:
    bitmap[5]:为了提高查找非空队列的效率,可以使用位图来标识每个进程队列是否为空。此位图有140个位置,表示140个进程队列,每个位置使用5个字节(5 * 32位),每一位表示相应队列的空闲状态。
    优化效果:通过位图的使用,可以在常数时间内快速定位到第一个非空队列,从而大大提高查找和调度的效率。

在这里插入图片描述

过期队列

  1. 过期队列和活动队列结构⼀模⼀样过期队列和活动队列结构模样
  2. 过期队列上放置的进程,都是时间⽚耗尽的进程
  3. 当活动队列上的进程都被处理完毕之后,对过期队列的进程进⾏时间⽚重新计算

过期队列与活动队列的结构

过期队列和活动队列在结构上非常相似,都是由一个队列组成,用于管理不同优先级的进程。其基本结构如下:

  • 过期队列:这是放置已经超时或者不再需要立即执行的进程队列。系统会根据进程的优先级来调度这些进程,通常只有在特定的条件下,才会将这些进程重新激活。
  • 活动队列:这个队列用于管理当前需要执行的进程。处于活动队列中的进程会按照优先级顺序执行,直至完成。

过期队列和活动队列的关键点:

  • 当活动队列中的进程被处理完毕后,系统会重新计算过期队列中进程的时间片,并重新将其加入活动队列,等待重新执行。

active指针与expired指针

在操作系统中,active和expired指针用于指向活动队列和过期队列的内容。具体作用如下:

  • active指针:该指针始终指向活动队列,管理当前需要执行的进程。当队列中有进程时,active指针指向活动队列的第一个进程,系统从该进程开始调度。
  • expired指针:与active指针类似,expired指针指向过期队列。过期队列存储的是已超时的进程,等待重新激活并加入活动队列进行调度。

尽管active和expired指针指向的是两个不同的队列,但它们之间的转换并没有特别复杂的关联。当一个进程的执行时间片结束后,系统会将其从活动队列移到过期队列。当过期队列中的进程恢复执行时,它们会再次被移动到活动队列。


http://www.ppmy.cn/news/1564405.html

相关文章

【汇编语言】直接定址表(一)—— 「从单元标号到跨段数据:解锁汇编语言的隐藏技巧」

文章目录 前言1. 描述了单元长度的标号1.1 旧的示例代码1.2 新的示例代码1.3 将标号当作一个段中的内存单元1.4 注意事项 2. 在其他段中使用数据标号2.1 前提说明2.2 示例代码2.3 段与段寄存器的关联2.4 将标号当作数据来定义2.4.1 示例1—— 字型数据2.4.2 示例2——双字型数据…

FIDO2密码钥匙与无密码认证:打造安全便捷的数字世界

在数字化时代,密码曾被视为网络安全的基石,但随着网络攻击手段日益复杂,传统的密码认证方法越来越无法抵御这些挑战。对于用户来说,登录密码不仅繁琐易忘,而且一旦泄露,往往会导致数据泄露,造成…

PDF工具箱 PDF24 ,免费下载,非常好用

这是一套免费无限制的PDF 处理工具合集。 包含了 27 个 PDF 工具。涵盖了PDF 合并、分割、编辑、压缩、格式转换(Word、Excel、图片等)、OCR 文本识别、添加水印等诸多功能! 而且所有功能都可以免费使用,没有文件大小等任何限制…

C# 获取PDF文档中的字体信息(字体名、大小、颜色、样式等

在设计和出版行业中,字体的选择和使用对最终作品的质量有着重要影响。然而,有时我们可能会遇到包含未知字体的PDF文件,这使得我们无法准确地复制或修改文档。获取PDF中的字体信息可以解决这个问题,让我们能够更好地处理这些文件。…

Java线程全解析:从创建到同步的终极指南

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互…

在 Go语言中一个字段可以包含多种类型的值的设计与接种解决方案

在 Go 中,如果你希望一个字段可以包含多种类型的值,你可以使用以下几种方式来实现: ### 1. **使用空接口 (interface{})** Go 的空接口 interface{} 可以接受任何类型的值,因此,你可以将字段定义为一个空接口&#x…

【代码随想录】刷题记录(104)-不同的二叉搜索树

题目描述: 给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。 示例 1: 输入:n 3 输出:5示例 2: 输入:n …

Ubuntu VPS 上 Docker 部署 Nginx 服务器详细教程

引言 本文将详细介绍如何在 Azure 100 学生订阅中创建一台 Ubuntu VPS,并在其上利用 Docker 部署 Nginx 服务器。我们将涵盖 Docker 和 Nginx 的基础概念,以及部署过程中所需的每个步骤。 Docker 简介 Docker 是一个开源的容器化平台,它可…