0

0

【Linux】进程优先级

雪夜

雪夜

发布时间:2025-07-19 08:54:17

|

523人浏览过

|

来源于php中文网

原创

前言:

进程优先级是操作系统中的一个关键概念,它直接影响到进程的调度顺序和执行权。了解进程优先级对于优化和提升系统性能至关重要。让我们直接进入今天的主题!

?优先级相关✈️什么是优先级 在日常生活中,我们常常遇到需要排队的情况,比如在公路上等红灯,在医院挂号,或者在食堂吃饭。然而,救护车可以无视红灯,急诊病人可以优先挂号,食堂里的老师可以插队...

这些需要排队的事物可以被视为进程,而像救护车、急诊病人以及食堂的老师等,则是具有优先权的象征。优先权的存在是为了处理更重要的事情。

【Linux】进程优先级 因此,优先级的概念清晰可见:进程通过某种方式(排队)来确定访问资源的先后顺序。

细心的你可能已经注意到,优先级似乎与我们之前学习的权限概念相似。实际上,优先级和权限是有区别的:权限决定的是能不能的问题,而优先级决定的是先后顺序的问题。

✈️为什么要有优先级 如果食堂的窗口数量远超人数,如果自习室的座位非常多而人却很少,我们就不需要排队。也就是说,当资源充足时,排队是不必要的。

因此,优先级产生的本质是因为资源相对稀缺。

✈️进程的优先级 为了更直观地展示优先级,我们可以运行以下代码:

代码语言:javascript代码运行次数:0运行复制```javascript

include#include#includeint main(){while(1){printf("this is a process, pid=%d\n", getpid());sleep(1);}return 0;}

<code>
将此程序运行起来变成进程,然后使用以下命令查看进程属性:
<p>代码语言:javascript代码运行次数:0<svg fill="none" height="16" viewbox="0 0 16 16" width="16" xmlns="<a href="https://www.php.cn/link/c9041cfd2a40932691855abd98fd219a">http://www.w3.org/2000/svg"><path</a> d="M6.66666 10.9999L10.6667 7.99992L6.66666 4.99992V10.9999ZM7.99999 1.33325C4.31999 1.33325 1.33333 4.31992 1.33333 7.99992C1.33333 11.6799 4.31999 14.6666 7.99999 14.6666C11.68 14.6666 14.6667 11.6799 14.6667 7.99992C14.6667 4.31992 11.68 1.33325 7.99999 1.33325ZM7.99999 13.3333C5.05999 13.3333 2.66666 10.9399 2.66666 7.99992C2.66666 5.05992 5.05999 2.66659 7.99999 2.66659C10.94 2.66659 13.3333 5.05992 13.3333 7.99992C13.3333 10.9399 10.94 13.3333 7.99999 13.3333Z" fill="currentcolor"></path></svg>运行<svg fill="none" height="16" viewbox="0 0 16 16" width="16" xmlns="<a href="https://www.php.cn/link/c9041cfd2a40932691855abd98fd219a">http://www.w3.org/2000/svg"><path</a> clip-rule="evenodd" d="M4.5 15.5V3.5H14.5V15.5H4.5ZM12.5 5.5H6.5V13.5H12.5V5.5ZM9.5 2.5H3.5V12.5H1.5V0.5H11.5V2.5H9.5Z" fill="currentcolor" fill-rule="evenodd"></path></svg>复制<code>javascript ps -la#显示当前用户的所有进程</code>

【Linux】进程优先级 我们可以看到,横着的蓝色框是我们启动的进程,竖着的蓝色框有一栏叫做 PRI 的数值,PRI 就是 priority,优先权的意思。

竖着的蓝色框显示的是优先级,而优先级是数值,所以它一定是 task_struct 结构体中的一个属性:

代码语言:javascript代码运行次数:0运行复制javascript struct task_struct{int PRI;//优先级//...}

<code>
运行我们编写的程序,查询该进程的权限为80,这表明 Linux 下的进程优先级本质上是数字。</p><p>实际上,Linux 下的优先级是可以修改的,修改范围为 [60, 99],且进程的默认优先级值是80。而优先级数字越小,表示该进程的优先级越高!</p><hr /><p>?调整进程优先级✈️调整优先级 我们已经了解了进程优先级的概念和原因,接下来看看如何操作?</p><p>运行上面的程序,打印出进程的pid,然后使用 top 命令进入 Linux 任务管理器:</p><p>代码语言:javascript代码运行次数:0<svg fill="none" height="16" viewbox="0 0 16 16" width="16" xmlns="<a href="https://www.php.cn/link/c9041cfd2a40932691855abd98fd219a">http://www.w3.org/2000/svg"><path</a> d="M6.66666 10.9999L10.6667 7.99992L6.66666 4.99992V10.9999ZM7.99999 1.33325C4.31999 1.33325 1.33333 4.31992 1.33333 7.99992C1.33333 11.6799 4.31999 14.6666 7.99999 14.6666C11.68 14.6666 14.6667 11.6799 14.6667 7.99992C14.6667 4.31992 11.68 1.33325 7.99999 1.33325ZM7.99999 13.3333C5.05999 13.3333 2.66666 10.9399 2.66666 7.99992C2.66666 5.05992 5.05999 2.66659 7.99999 2.66659C10.94 2.66659 13.3333 5.05992 13.3333 7.99992C13.3333 10.9399 10.94 13.3333 7.99999 13.3333Z" fill="currentcolor"></path></svg>运行<svg fill="none" height="16" viewbox="0 0 16 16" width="16" xmlns="<a href="https://www.php.cn/link/c9041cfd2a40932691855abd98fd219a">http://www.w3.org/2000/svg"><path</a> clip-rule="evenodd" d="M4.5 15.5V3.5H14.5V15.5H4.5ZM12.5 5.5H6.5V13.5H12.5V5.5ZM9.5 2.5H3.5V12.5H1.5V0.5H11.5V2.5H9.5Z" fill="currentcolor" fill-rule="evenodd"></path></svg>复制```javascript
top#进入任务管理器</code>

【Linux】进程优先级 进入任务管理器后,输入 'r',进入修改进程权限的操作,然后输入进程标识符:

【Linux】进程优先级 接着会出现文字提示:

【Linux】进程优先级 然后输入要修改的值,例如,这里我输入10:

【Linux】进程优先级 此时再使用 ps 查看,会发现进程的 PRI 这一项变为了90,但不仅仅是 PRI 这一栏变了,还有一栏叫做 NI 的值也变了,而且正好是我们输入的数值!

实际上,Linux 系统支持用户调整优先级,但并不是让用户直接修改 pri 值,而是修改 nice 值。nice 值不是优先级,而是优先级的修正数据。

动软商城系统
动软商城系统

动软商城系统是一款优秀的网上商城系统,经营者只需要轻松的后台操作,就可以马上拥有功能强的网上销售系统,同时动软商城系统提供多样的营销手段帮助您成功打开网上销售市场。动软的模版界面机制,可以轻松的搭建出风格各异的界面,最大限度的满足经营者的要求,还拥有专业SEO优化系统,大大提高网页被搜索引擎抓取收录的几率。动软商城系统先进的流程控制技术全面促进进、销、存等系统的协同,支持企业数据整合和网络资源信息

下载

所以真正的优先级应该是:pri = pri(old) + nice;(old 指老的优先级)

因此,我们刚刚修改的并不是优先级,而是 nice 值。


✈️优先级极限测试 但事实果真如此吗?进程的优先级真的只能在 [60,99] 这个范围内移动吗?如果不相信,我们可以进行极值测试:

我们将程序的进程值调到尽可能大:

【Linux】进程优先级【Linux】进程优先级 nice 值变为19,pri 变为99,就是我们给出的最大范围。

如果我们把 nice 值设置为-10:

【Linux】进程优先级【Linux】进程优先级 我们发现,进程的 pri 变为了70,但我们刚才不是刚把进程的优先级调至99吗?

实际上这是因为:pri(old),是指老的优先级,这个优先级永远是80!所以再次调整时,还是从80开始变化。

我们把 nice 值设置为极小值:

【Linux】进程优先级【Linux】进程优先级 进程的 pri 果然为60,所以 nice 值的范围就是 [-20, 19]。

你可能会有疑问,为什么要给进程优先级加上限制范围呢?

为了尽量避免进程饥饿的问题,现在的任何分时操作系统,都是较为公平地进行调度。


?Linux的调度与切换 Linux 调度切换是学习 Linux 系统编程的重要知识,我们提前了解一下:

我们之前提到过,CPU 不会把一个进程全部执行完才切换到下一个进程,而是基于时间片进行轮转执行的。关于进程的调度与切换,有以下几个相关特性:

竞争性:系统进程数量众多,而 CPU 资源只有少量,甚至只有1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理地竞争相关资源,便有了优先级。如前所述,为了避免竞争饥饿问题,操作系统会合理地给进程分配各种资源。

独立性:多进程运行,需要独享各种资源,多进程运行期间互不干扰。进程的独立性是学习 Linux 系统编程特别重要的一个知识,多个进程在系统里同时运行,但它们互不干扰,一个进程挂了不会影响其他进程,就算是父子进程也是如此。

并行:多个进程在多个 CPU 下分别同时运行,称为并行。如果一台电脑有多个 CPU,并且每个 CPU 下有对应数量的进程分别同时运行,那么就称之为并行。

并发:多个进程在一个 CPU 下采用进程切换的方式,在一段时间之内让多个进程都得以推进,称为并发。并发与并行不同,我们大部分人的电脑其实只有一个 CPU,而进程通常会有多个。为了考虑资源分配等问题,每个进程都有自己的时间片,时间片用完就切换到下一个进程,自己则重新排队,等待再次调度。虽然每次 CPU 执行任务只执行很少的时间片,但对于我们人类来说并看不出来进程是在不断切换的。多个进程在一个 CPU 下采用进程切换的方式,一段时间内让多个进程都能推进任务,称之为并发。

【Linux】进程优先级?✏️总结 在操作系统中,资源总是少数,所以进程需要使用排队的方式来获取资源,而有些重要的进程优先级较高,可以插队。进程的优先级是可调整的,调整范围为:[60, 99],实际上我们调整的是进程的 nice 值,nice 值的范围是 [-20, 19]。进程的调度和切换是操作系统中重要的概念,其中竞争、独立、并发、并行这些概念比较常见。如果这篇文章对你有帮助的话,还望留下一个小小的赞呀~~

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

106

2023.09.25

printf用法大全
printf用法大全

php中文网为大家提供printf用法大全,以及其他printf函数的相关文章、相关下载资源以及各种相关课程,供大家免费下载体验。

76

2023.06.20

fprintf和printf的区别
fprintf和printf的区别

fprintf和printf的区别在于输出的目标不同,printf输出到标准输出流,而fprintf输出到指定的文件流。根据需要选择合适的函数来进行输出操作。更多关于fprintf和printf的相关文章详情请看本专题下面的文章。php中文网欢迎大家前来学习。

304

2023.11.28

mysql标识符无效错误怎么解决
mysql标识符无效错误怎么解决

mysql标识符无效错误的解决办法:1、检查标识符是否被其他表或数据库使用;2、检查标识符是否包含特殊字符;3、使用引号包裹标识符;4、使用反引号包裹标识符;5、检查MySQL的配置文件等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

210

2023.12.04

Python标识符有哪些
Python标识符有哪些

Python标识符有变量标识符、函数标识符、类标识符、模块标识符、下划线开头的标识符、双下划线开头、双下划线结尾的标识符、整型标识符、浮点型标识符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

322

2024.02.23

java标识符合集
java标识符合集

本专题整合了java标识符相关内容,想了解更多详细内容,请阅读下面的文章。

292

2025.06.11

c++标识符介绍
c++标识符介绍

本专题整合了c++标识符相关内容,阅读专题下面的文章了解更多详细内容。

177

2025.08.07

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1010

2023.08.02

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

3

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Rust 教程
Rust 教程

共28课时 | 6.8万人学习

PostgreSQL 教程
PostgreSQL 教程

共48课时 | 10.5万人学习

Git 教程
Git 教程

共21课时 | 4.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号