Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【Linux】进程优先级与进程切换理解

【Linux】进程优先级与进程切换理解

作者头像
ephemerals__
发布于 2025-05-04 02:07:08
发布于 2025-05-04 02:07:08
9200
代码可运行
举报
运行总次数:0
代码可运行

前言

本篇文章我们在了解了进程概念和状态等基础知识之上,继续学习进程的优先级,以及进程切换相关知识。

正文开始

一、进程优先级

1. 什么是进程优先级

进程优先级是操作系统分配给进程的一种“权重”或“级别”,用来决定在多个进程同时竞争 CPU 资源时,哪一个进程先获得运行的机会。优先级高的进程会被优先调度执行,低优先级的进程则可能需要等待。

2. 为什么有进程优先级

大多数情况下,正在执行的程序数量是比较多的,而CPU资源有限为了使那些重要、急需执行的任务先执行,就有了优先级。这样一来,资源分配会得到优化,整个系统更加合理高效。

注:现代操作系统更加考虑进程获取资源的公平性,优先级的差距不会太大。

3. 进程优先级的作用

进程优先级可以保证关键任务或实时任务及时调度(如操作系统内核进程通常优先级较高),并且可以防止某个进程长期占用 CPU,改善系统性能。其次,优先级可以实现多用户或多任务下的公平资源分配

4. Linux进程优先级的本质

Linux下,进程优先级的本质就是一个整数,存储在task_struct结构体当中,直接影响了进程调度的先后顺序。进程优先级的值越小,优先级越高

可以使用以下命令查看到当前所有进程的优先级:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ps -al

运行结果:

PRI:进程优先级的值,默认是80

NI:也叫做nice值,是进程优先级的修正数据。其取值范围是[-20, 19]

PRI的默认值(80) 和 NI 之和表示进程的真实优先级大小。也就是说,Linux进程优先级的范围是[60, 99],一共40个。

注:ps -l指令还可以看到当前进程的PID,父进程ID等。其中还有一项UID,它用来标识Linux下的用户,进行用户区分。当用户创建进程时,进程会记录用户的UID,访问文件时(本质是进程在访问),进程就拿这个UID与文件的拥有者或所属组的UID进行对比。

5. 修改进程优先级

在Linux下,修改进程优先级主要是通过修改nice值来完成(注意nice值的取值范围)。可以使用top命令修改进程优先级:

输入top --> 按“ r ” --> 输入进程的PID --> 输入新的nice值

注意:普通用户只能给自己的进程设置优先级,且只能将优先级调低(nice值调高);而root用户可以在取值范围内随意调整任意进程的优先级。

接下来我们尝试调整一个进程process的优先级:

process的源码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>
#include <unistd.h>

int main()
{
    while(1)
    {
        sleep(1);
        printf("hello\n");
    }
    return 0;
}

首先运行process,查看process的优先级:

可以看到process的优先级是80。接下来将nice修改为10:

这里process的PRI变成了90,而nice值为10。此时90是process的真实优先级

如果修改为-10:

可以看到,普通用户下,将nice值调低是不被允许的。

如果改为100:

由于取值范围的限制,nice值最高为19,输入100只能将其改为19。

注意:如果优先级设置不合理,就会导致优先级低的进程长时间获取不到CPU资源,导致进程饥饿。

二、进程切换

1. 概念

CPU在执行一个进程时,由于还有其他进程的存在,它不会一次将所有代码全部跑完,而是跑一会后,转而去执行其他进程,再来执行当前进程......这样才可以在一段时间之内使得多个进程都有所推进。CPU从执行当前进程变为执行其他进程的过程叫做进程切换

当代操作系统都是分时的,每个进程都有它相应的时间片(本质就是一个计时器)。当前进程的时间片用完后,就会切换到其他进程。

2. 进程切换的过程

一个进程在CPU上运行到时间片结束之后,首先存储自己执行位置的上下文数据到自己的TSS(任务状态段,存储在task_struct当中)当中,然后将进程重新放入调度队列队尾。进程发生切换时,将新的进程的TSS中的数据拷贝(恢复)到CPU的对应寄存器中,继续执行。

进程的上下文数据指的是进程在运行时,需要保存和恢复的所有关键信息(例如发生切换时CPU寄存器中的数据),这样就可以保证进程发生一系列切换后,重新执行该进程时,能从原来的状态继续执行。

3. 进程切换的意义

进程切换让操作系统能管理多个进程,保证各进程能按照优先级获得CPU使用权,是实现多任务的基础。多个进程可以“轮流”运行,系统利用率和响应速度得以提高。

4. Linux的进程调度(O(1)调度算法)

高效的进程切换不仅保证了多任务系统的流畅运行,还直接影响着系统的响应速度与整体性能。为了实现快速、合理的进程调度,Linux内核采用了多种调度算法,其中O(1)调度器就是在2.6版本中所引入的一种重要算法。接下来,我们将深入了解O(1)调度算法,看看它是如何实现对大量进程的高效管理的。

在之前的文章中,我们提到过一个CPU维护一个进程调度队列,该队列中存放着一个个PCB,等待CPU对它们进行调度。实际上这个“进程调度队列”远远比传统的队列复杂。在Linux中,进程调度队列叫做runqueue,它的结构如图所示:

一个CPU维护一个运行队列runqueue,其中数组prio_array_t中的queue是存放进程PCB的关键。

queue本质是一个链地址法的哈希表,其中有140个哈希桶(前100个哈希桶表示实时优先级,剩余40个刚好对应40种优先级,所以哈希桶的下标 - 40就是进程优先级),相同优先级的进程task_struct存放在同一个哈希桶中,这样,当需要调度时,按照下标小到大的顺序扫描每一个哈希桶,先访问到的进程就是优先级高的(因为优先级的值越小,优先级越高),然后拿出桶中的task_struct进行调度。

考虑到每次都要遍历140个哈希桶,效率较低,所以有一个位图bitmap,位图中有5个32位的整形变量,加起来一共160位,其中的140位表示对应的哈希桶中是否有task_struct,所以可以直接判断哪一位是“1”,就表示哪一个桶需要被访问。除此之外,还有一个变量nr_active,表示整个哈希表中的元素个数,对应正在运行时的进程个数。

queuebitmapnr_active共同构成一个结构体,叫做rqueue_elem。

如此,访问位图,按顺序找到存在元素的哈希桶,进行调度,整个调度过程效率就能达到O(1)。

但是图中的prio_array_t数组有两个元素,也就是说有两张哈希表,这是为什么呢?这就要从进程切换的角度开始谈起了。

试想,如果只有一张哈希表,那么发生进程切换时会怎么样?

假设第100个哈希桶当中有3个进程,第一个进程的时间片耗尽后,会发生进程切换,此时按照优先级,只能将它重新插入在当前哈希桶的链表尾部,当然,其他两个进程也是如此。这样虽然能够完成这3个进程的轮流调度,但是更低优先级(也就是下标更大的哈希桶)的进程呢?当前哈希桶中只要有元素,CPU就会一直轮流调度当前哈希桶中的进程,而会忽略优先级更低的进程,导致进程饥饿。要调度优先级更低的进程,就必须等待当前优先级的进程全部调度完毕,显然是不合理的,极大地损失了公平性

因此,前辈们想到了一个巧妙的方法:再创建一个相同的结构体rqueue_elem,其中也包含一个queuebitmapnr_active,两个rqueue_elem构成一个数组prio_array_t[2]

然后创建两个指针nativeexpired,分别指向prio_array_t[0]和prio_array_t[1],native指向的表示“活跃队列”;expired指向的表示“过期队列”。当发生进程切换时,被调度结束的进程会插入到“过期队列”的对应优先级的哈希桶中,然后继续访问“活跃队列”中的哈希桶,一个个地调度。这样,当前“活跃队列”哈希桶中的元素就会越来越少,直到为0,就可以访问优先级更低的哈希桶......最后所有进程都会被调度,而不是高优先级进程运行完毕后才能调度低优先级进程。

当“活跃队列”整个哈希表内的进程都被调度过后(此时这些进程应全都位于“过期队列”对应的哈希桶中),交换native和expired两个指针的指向,这样“过期队列”就变成了“活跃队列”,就可以开始下一轮的调度了。

如果有新进程出现,会直接插入“过期队列”当中。此时新进程处于“就绪状态”,等待一轮的调度结束后,新进程就可以被调度。

总结

本篇文章,我们系统地了解了进程优先级的定义、意义以及在Linux下的调整方法,也梳理了进程切换的基本流程与核心作用。从进程优先级到切换机制,再到Linux的O(1)调度算法,这些知识共同揭示了操作系统在多任务管理中的高效与精妙。掌握这些原理,有助于更深入理解和优化 Linux 系统的性能,为后续程序地址空间进程控制的学习打下坚实基础。如果你觉得博主讲的还不错,就请留下一个小小的赞在走哦,感谢大家的支持❤❤❤

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-05-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
深度理解linux系统—— 进程切换和调度
所以,对于一个死循环的进程执行的时候,我们是可以进行其他操作的,它并没有一直占有CPU。
星辰与你
2025/05/03
1660
深度理解linux系统—— 进程切换和调度
【Linux篇】你敢信?你的代码运行速度竟由这个‘隐形裁判’决定——进程优先级全解码
进程优先级是操作系统调度算法中的一个重要概念,它决定了系统中多个进程执行的顺序。每个进程在操作系统中都有一个优先级,优先级越高的进程越容易获得 CPU 时间片,从而先于优先级较低的进程执行。通常,进程优先级的设定和调度策略是动态的,会根据系统负载、进程的紧急程度、等待时间等因素进行调整。
熬夜学编程的小王
2025/03/31
1000
【Linux篇】你敢信?你的代码运行速度竟由这个‘隐形裁判’决定——进程优先级全解码
【Linux】探索进程优先级的奥秘,解锁进程的调度与切换
在Linux环境下,默认优先级是80,并且Linux的优先级是可以被修改的,Linux优先级的范围:【60,99】,长度为40.
用户11316056
2024/10/16
1190
【Linux】探索进程优先级的奥秘,解锁进程的调度与切换
【Linux 内核】调度器 ① ( 调度器概念 | 调度器目的 | 调度器主要工作 | 调度器位置 | 进程优先级 | 抢占式调度器 | Linux 进程状态 | Linux 内核进程状态 )
Linux 内核的 " 进程调度 " 是按照 设计好的调度算法 安排的 , 该算法对应的功能模块 称为 " 调度器 " , 英文名称是 Scheduler ;
韩曙亮
2023/03/30
5.9K0
【Linux 内核】调度器 ① ( 调度器概念 | 调度器目的 | 调度器主要工作 | 调度器位置 | 进程优先级 | 抢占式调度器 | Linux 进程状态 | Linux 内核进程状态 )
Linux下进程的调度与切换
  在Linux操作系统中,进程的调度与切换是操作系统核心功能之一,它直接影响着系统的性能和响应速度。那么话不多说,开启我们今天的话题!
用户11029129
2024/06/04
2180
Linux下进程的调度与切换
【Linux系统编程】—— 深入理解Linux进程优先级与调度机制
在Linux系统中,进程优先级(Priority)决定了进程被执行的顺序。优先级高的进程会优先获取CPU资源,执行的优先权也较高。优先级值越低,进程的优先级越高,这意味着该进程更有可能被CPU优先执行。合理配置进程的优先级,对于提升系统的整体性能尤其重要。
用户11286421
2025/01/20
5010
【Linux系统编程】—— 深入理解Linux进程优先级与调度机制
【Linux】详谈进程优先级&&进程调度与切换
进程要访问某种资源,进程通过一定的方式排队,确认享受资源的优先顺序。计算机中资源过少,所以进程访问某种资源时需要排队。
用户10923276
2024/03/28
6540
【Linux】详谈进程优先级&&进程调度与切换
【Linux】进程概念
我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系
用户11290673
2025/05/11
970
【Linux】进程概念
进程优先级详解
Linux 中采用了两种不同的优先级范围,一种是 nice 值,一种是实时优先级。在上一篇粗略的说了一下 nice 值和实时优先级,仍有不少疑问,本文来详细说明一下进程优先级。linux 内核版本为 linux 2.6.34 。
233333
2023/12/03
3560
【Linux系统内核探索】进程调度
进程调度是操作系统内核的核心功能之一,负责在多个进程之间分配CPU时间,使得系统能够同时运行多个进程。因为计算机的CPU资源有限,操作系统需要决定在任何时刻哪个进程能够使用CPU执行任务,这个过程就是进程调度。 Linux进程调度经历了多个阶段的优化,目前主流的Linux内核使用的是完全公平调度器。CFS调度器的核心思想是通过精确计算每个进程的“虚拟运行时间”来决定调度的公平性。CFS调度器不会简单依赖于时间片,而是通过调度树来快速查找下一个应运行的进程。 现代的Linux调度主要依赖于Linux的CFS调度器,在2.6版本之前主要用的是Linux内核O(1)调度算法,这次我们的重点在于Linux内核O(1)调度算法。
用户11305458
2024/11/21
1980
【Linux系统内核探索】进程调度
Linux-进程优先级
大多数人的电脑都是一个CPU,一次只能处理一个进程任务,但是进程又有很多个。这也就导致的CPU的资源不足,为了更合理的利用CPU资源,就存在进程优先级来确定进程获取CPU资源的顺序。 就要生活中的排队,进程在CPU中也是需要排队的,除了遵循先来后到的排队原理,还存在优先级更高的进程是可以进行插队的,这也可以理解,在医院排队时,如果碰到急诊病人是可以优先挂号的。 提问:有没有可能因为大量的优先级更高的进程插队导致低优先级的进程迟迟得不到执行。 回答:这就涉及到了进程饥饿的问题了,在Linux下是有相关解决方法的,Linux会维护两个队列,一个为活跃队列,另一个为过期队列,这里就不细讲了。
Yui_
2024/10/16
2310
Linux-进程优先级
【Linux探索学习】第十四弹——进程优先级:深入理解操作系统中的进程优先级
https://blog.csdn.net/2301_80220607/category_12805278.html?spm=1001.2014.3001.5482
GG Bond1
2024/11/21
2470
【Linux探索学习】第十四弹——进程优先级:深入理解操作系统中的进程优先级
【在Linux世界中追寻伟大的One Piece】Linux进程概念
我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系。
枫叶丹
2024/08/06
1250
【在Linux世界中追寻伟大的One Piece】Linux进程概念
【Linux 内核】进程优先级与调度策略 ① ( SCHED_FIFO 调度策略 | SCHED_RR 调度策略 | 进程优先级 )
参考 【Linux 内核】调度器 ⑨ ( Linux 内核调度策略 | SCHED_NORMAL 策略 | SCHED_FIFO 策略 | SCHED_NORMAL 策略 | SCHED_BATCH策略 ) 博客 , 介绍了 Linux 内核相关的调度策略 ;
韩曙亮
2023/03/30
6.7K0
【Linux】进程优先级&&进程切换
进程优先级是操作系统中用于决定进程调度顺序的重要属性。它表示一个进程在系统资源分配和 CPU 调度中的相对重要性。优先级越高的进程通常会获得更多的 CPU 时间和资源,从而更快地完成其任务。
用户11305458
2024/10/24
2770
【Linux】进程优先级&&进程切换
Linux 进程管理
Linux是一个多用户多任务的操作系统。多用户是指多个用户可以在同一时间使用同一个linux系统;多任务是指在Linux下可以同时执行多个任务,更详细的说,linux采用了分时管理的方法,所有的任务都放在一个队列中,操作系统根据每个任务的优先级为每个任务分配合适的时间片,每个时间片很短,用户根本感觉不到是多个任务在运行,从而使所有的任务共同分享系统资源,因此linux可以在一个任务还未执行完时,暂时挂起此任务,又去执行另一个任务,过一段时间以后再回来处理这个任务,直到这个任务完成,才从任务队列中去除。这就是多任务的概念。 上面说的是单CPU多任务操作系统的情形,在这种环境下,虽然系统可以运行多个任务,但是在某一个时间点,CPU只能执行一个进程,而在多CPU多任务的操作系统下,由于有多个CPU,所以在某个时间点上,可以有多个进程同时运行。 进程的的基本定义是:在自身的虚拟地址空间运行的一个独立的程序,从操作系统的角度来看,所有在系统上运行的东西,都可以称为一个进程。
黄规速
2022/04/14
4.3K0
Linux 进程管理
Linux Kernel调度器的过去,现在和未来
Linux Kernel Development 一书中,关于 Linux 的进程调度器并没有讲解的很全面,只是提到了 CFS 调度器的基本思想和一些实现细节;并没有 Linux 早期的调度器介绍,以及最近这些年新增的在内核源码树外维护的调度器思想。所以在经过一番搜寻后,看到了这篇论文 A complete guide to Linux process scheduling,对 Linux 的调度器历史进行了回顾,并且相对细致地讲解了 CFS 调度器。整体来说,虽然比较啰嗦,但是对于想要知道更多细节的我来说非常适合,所以就有了翻译它的冲动。当然,在学习过程也参考了其它论文。下面开启学习之旅吧,如有任何问题,欢迎指正~
刘盼
2020/04/20
2.7K0
Linux Kernel调度器的过去,现在和未来
图解Linux进程调度(二)
在内核中,肯定不能对所有的进程一视同仁,有的进程需要优先运行,有的进程需要运行更长的时间
用户6280468
2022/06/09
1.8K0
图解Linux进程调度(二)
CPU进程优先级
进程优先级起作用的方式从发明以来基本没有什么变化,无论是只有一个cpu的时代,还是多核cpu时代,都是通过控制进程占用cpu时间的长短来实现的。就是说在同一个调度周期中,优先级高的进程占用的时间长些,而优先级低的进程占用的短些。
陈不成i
2021/05/24
3.3K0
Linux 进程管理之调度和进程切换
每个CPU都有一个运行队列,每个运行队列中有三个调度队列,task作为调度实体加入到各自的调度队列中。
刘盼
2021/04/29
2K0
Linux 进程管理之调度和进程切换
推荐阅读
相关推荐
深度理解linux系统—— 进程切换和调度
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验