自学内容网 自学内容网

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

前言: 在多任务操作系统中,进程优先级的配置对于资源的分配起着至关重要的作用。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指针指向的是两个不同的队列,但它们之间的转换并没有特别复杂的关联。当一个进程的执行时间片结束后,系统会将其从活动队列移到过期队列。当过期队列中的进程恢复执行时,它们会再次被移动到活动队列。


原文地址:https://blog.csdn.net/ZWW_zhangww/article/details/145213836

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!