news 2026/9/16 8:24:54

【进程】-5-进程优先级

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【进程】-5-进程优先级

**🎬 博主名称**:迷途之人不知返

🔥 个人专栏: 《C语言》、《数据结构》、《C++》、《Linux》

🗂️ Gitee仓库: 《C语言》、《数据结构》、《C++》、《Linux》

</> 算法专栏: 《算法精选集》


进程优先级

  • 1、进程优先级,及优先级与权限的关系
  • 2、为什么会有优先级
  • 3、Linux的优先级(长什么样)
    • 3.1、UID
    • 3.2、PRI & NI
      • 3.2.1、nice值如何修改
      • 3.2.2、pri(old)和pri(new)如何理解
      • 3.2.3、nice的范围

1、进程优先级,及优先级与权限的关系

进程得到某种资源的先后顺序,叫做优先级。

之前学习的权限,规定的是能与不能的问题;而优先级关注的不再是能不能的问题(因为大家都能了),而是哪个先哪个后的问题

2、为什么会有优先级

因为资源稀缺,我们需要通过优先级确定使用资源的先后顺序。

例如,单核计算机只有一个CPU,而需要在CPU上运行的进程会有很多个。这时操作系统就按照进程的优先级,把这些进程排列在调度队列中,并按照进程的优先级依次放入CPU执行。(这就是操作系统基于优先级,展开选择调度)

3、Linux的优先级(长什么样)

Linux优先级的特点,与调度算法有关。

我们依旧创建一个C程序,内容是死循环:

// test1.c#include<stdio.h>#include<unistd.h>intmain(){printf("我是一个进程。pid: %d, ppid: %d\n",getpid(),getppid());sleep(1);return0;}

编译并运行程序。然后我们打开另一个终端窗口,执行指令ps -al查看优先级:

其中有不少项目我们是很熟悉的了:

项目解释
Sstate,进程状态
PID进程标识符
PPID当前进程的父进程的标识符
TTY显示当前进程所处的终端
CMD当前进程对应的程序

现在我们把目光集中在这三项:UID, PRI, NI。

3.1、UID

UID,user id,表明这个进程是谁启动的。由于Linux是一个多用户协作的操作系统,所以对进程标明UID是很有必要的。

那么UID与用户名有什么关系呢?

我们执行ps -al查看进程优先级的时候,看到的是数字组成的UID:


而我们执行ls -al查看文件具体信息的时候,看到的是具体的用户名:

实际上,操作系统建立了用户名与UID的映射关系

操作系统一开始拿到的都是UID。查看文件具体信息的时候,UID就通过映射关系转化成了用户名;而查看进程优先级的时候,UID就没有转化。

那么我们如何查看UID与用户名的映射关系呢?查看/etc/passwd文件:

小贴士1


当然,我们也可以查看文件/etc/shadow,里面有每个用户对应的密码,只不过密码是被加密过的。

我们也可以认为,用户登录Linux系统,输入密码后,操作系统就会拿着用户当前输入的密码,与文件中保存的密码相比较,相同就允许用户登录,不同就让用户再次输入(不让登录)。

3.2、PRI & NI

实际上,

  • PRI: 当前进程的优先级。PRI值越小,优先级越高
  • NI: nice值,进程优先级的修正数据。

小贴士2


严格来说,nice值不属于优先级范畴,但是nice值是一个非常巧妙的设置,我们将在“进程调度”一文中学习到。

既然有nice值这个概念,那么进程优先级就是可以被修改的。这里有一个进程优先级的修改公式:

pri(new) = pri(old) + nice

3.2.1、nice值如何修改

nice值修改的步骤是:

top=>r(renice)=>输入进程pid=>输入新的nice值

对于文件test1.c编译而来的test.exe,初始的优先级为:

我们修改nice值为10,再看看优先级为:

设置nice为10,那么新的优先级肯定就是90了。

3.2.2、pri(old)和pri(new)如何理解

上面我们将nice改成了-10,进程优先级PRI变为了70。所以ps -al打印在屏幕上的PRI是pri(new)。

我们再次修改,把nice修改成10,看看进程优先级又变成了什么样子:

nice修改成-10,进程优先级变成70了!难道进程优先级不是由90变为80吗?

实际上,pri(old)是一个常数,Linux中一般是80。我们修改nice,操作系统就根据等式pri(new) = pri(old) + nice由pri(old)求出pri(new),再将pri(new)作为我们看到的进程优先级。

那么开发者为什么要这样设置呢?原因是有了nice值我们就不需要关注进程上一次修改后的优先级是什么样的。修改进程优先级的本质是按照用户的期望修改一个整型值。如果设计成80变90,90变80的方案,用户修改优先级的时候还要先获取上一次的优先级,这就比较麻烦;而使用nice值,用户修改进程优先级的时候只需修改nice值,然后操作系统就会帮我们计算得出新的优先级,更直接更方便。

小贴士3


普通用户直接修改进程优先级时会失败,因为操作系统是不建议普通用户随便修改进程的优先级的,这会破坏调度器调度的公平性。想要强制修改优先级,我们可以使用root账号。

3.2.3、nice的范围

上面“小贴士3”中提到了“随便修改进程的优先级会破坏调度器调度的公平性”。

实际上,Linux操作系统是一种分时操作系统(对应有实时操作系统)。分时操作系统调度进程的时候,要尽可能保持公平性(这个公平性是相对的)。

比如,假设一个用户把所有自己创建的进程都改得很小,那么这个用户的所有进程都会被优先调度优先享受资源,那么其它用户的进程就不会那么及时地享受到资源,就会造成进程饥饿。

所以Linux不建议普通用户随意修改进程的优先级,同时Linux对nice值也有一个限定的范围。我们可以通过代码与指令找出nice值的范围。

对于程序test.exe,初始的PRI还是80,NI还是0。

给一个很大的nice值,比如10000:

nice值最大为19。

给一个很小的nice值,比如-10000:


nice值最小为-20。

所以nice值的范围是:[-20, 19]

我们还可以得出两个结论:

  • nice值有40个;
  • 对应Linux进程的优先级有40种——[60, 99]

当然,修改进程优先级还有指令方法和代码方法,这些方法就留给我们自行探索。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/16 8:24:42

蓝牙协议栈架构-第1章第2题-蓝牙主机层的核心组成有哪些

蓝牙面试题解析:蓝牙主机层的核心组成有哪些?—— HCI、协议层与高层管理模块详解 难度:⭐⭐⭐ 中等 | 场景:社招一面/二面、蓝牙协议栈岗、嵌入式开发岗 | 高频:🔥🔥🔥🔥🔥 适合级别:初中级(1-5 年)| 建议阅读时间:7 分钟 技术基线:Bluetooth Core Spec(…

作者头像 李华
网站建设 2026/9/16 8:24:12

Android去除旋转按钮小图标:三种场景与完整解决方案

做Android开发的&#xff0c;大概率都被这个不起眼的小图标折磨过——测试机上开着自动旋转&#xff0c;把手机横过来看视频&#xff0c;屏幕边上突然弹出一个旋转按钮&#xff1b;或者自己做的播放器页面&#xff0c;控制栏上莫名其妙多了个旋转图标&#xff0c;产品经理截图过…

作者头像 李华
网站建设 2026/9/16 8:23:16

Java开发者转型AI工程师:8周实战经验分享

1. 从传统开发到AI赛道的转型契机去年冬天&#xff0c;我作为一位有着8年Java后端开发经验的"老码农"&#xff0c;正面临着职业发展的瓶颈期。某次技术沙龙上&#xff0c;听到同行讨论大模型应用开发时&#xff0c;突然意识到&#xff1a;这可能是技术人最后的"…

作者头像 李华
网站建设 2026/9/16 8:23:08

Qt项目代码解释

如果想简单了解Qt,可以看下我在学习起始时的博客 Qt背景(简单了解Qt)-CSDN博客 在装好Qt后进入并创建一个项目,我们在什么都不写的情况下Qt中也有一些代码,让我们来了解一下这些代码吧. main.cpp argc时命令行参数的个数,argv是命令行参数的内容 但当前Qt下exec和linux系统中…

作者头像 李华
网站建设 2026/9/16 8:22:37

UWB室内定位技术全解:从TOF/TDOA原理到系统部署实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华