news 2026/6/12 17:33:46

Linux Nice 值详解:普通线程 CPU 分配的 “谦让法则”

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux Nice 值详解:普通线程 CPU 分配的 “谦让法则”

在 Linux 线程 / 进程调度中,Nice 值是一个容易被误解、却又至关重要的概念 —— 它不是优先级,却直接决定了普通线程能分到多少 CPU 资源;它只作用于普通调度策略(SCHED_OTHER),与实时线程(SCHED_FIFO/SCHED_RR)毫无关联。

结合之前我们讨论的线程调度策略,本文将从 “是什么、为什么、怎么用、避坑点” 四个维度,彻底讲透 Nice 值,帮你搞懂普通线程的 CPU 分配逻辑,适配 Ubuntu 等 Linux 系统,兼顾理论与实战,新手也能轻松看懂。

一、先澄清一个核心误区:Nice 值 ≠ 优先级

这是最容易混淆的点,也是面试高频考点,必须先明确:

💡 Linux 中,SCHED_OTHER(系统默认调度策略)的线程 / 进程,优先级固定为 0,永远无法修改;而 Nice 值是 “谦让值”,用来调整普通线程之间的 CPU 分配权重,不改变优先级本身。

举个通俗的例子:两个普通线程(均为 SCHED_OTHER),优先级都是 0,就像两个排队领 “CPU 时间” 的人 —— 优先级相同意味着 “排队资格一样”,而 Nice 值决定了 “谁能多领一点时间”:

  • Nice 值小的线程:“不谦让”,能分到更多 CPU 时间;
  • Nice 值大的线程:“很谦让”,主动少分 CPU 时间。

而实时线程(SCHED_FIFO/SCHED_RR,优先级 1~99),完全不受 Nice 值影响 —— 哪怕实时线程的优先级是 1(最低实时优先级),也能完全抢占 Nice 值为 - 20(最不谦让)的普通线程。

二、Nice 值核心特性(必记)

1. 取值范围

Nice 值的合法范围是 -20 ~ 19,共 40 个等级,核心规律:

  • 最小值 -20:最不谦让,CPU 分配占比最高(霸道模式);
  • 默认值 0:系统默认状态,不偏不倚;
  • 最大值 19:最谦让,CPU 分配占比最低(佛系模式)。

注意:Nice 值越小,线程 “优先级权重” 越高,分到的 CPU 时间越多(这里的 “权重”≠优先级,仅影响分配比例)。

2. 作用范围

Nice 值只对 SCHED_OTHER 调度策略有效,对实时调度策略(SCHED_FIFO、SCHED_RR)完全无效。原因:实时线程的调度逻辑是 “高优先级绝对抢占”,而 Nice 值是普通线程的 “公平分配调节工具”,两者属于不同的调度体系。

3. 权限限制

设置 Nice 值为负数(即比默认值 0 更霸道),必须拥有 root 权限(sudo);设置为正数(更谦让),普通用户即可操作。举例:普通用户可以执行nice -n 10 ./a.out(设置 Nice 值 10),但无法执行nice -n -5 ./a.out(设置 Nice 值 - 5),必须加 sudo。

4. 继承特性

子进程 / 子线程会继承父进程 / 父线程的 Nice 值。比如,父进程 Nice 值为 5,创建的子进程默认 Nice 值也是 5,可后续单独修改。

三、Nice 值的底层原理:CPU 时间分配比例

Linux 对普通线程(SCHED_OTHER)采用 CFS(完全公平调度器),核心逻辑是 “让每个线程都能公平获得 CPU 时间”,而 Nice 值通过调整 “线程权重”,改变分配比例。

简单来说,CFS 会给每个线程分配一个 “时间片”,时间片的大小与 Nice 值负相关:

  • Nice 值越小(如 - 20):权重越高,时间片越大,单位时间内运行次数越多;
  • Nice 值越大(如 19):权重越低,时间片越小,单位时间内运行次数越少。

举个具体例子(便于理解):系统中只有两个普通线程 A 和 B,均为 SCHED_OTHER,优先级 0:

  • 线程 A:Nice 值 =-20,权重最高;
  • 线程 B:Nice 值 = 19,权重最低。

运行结果:线程 A 会分到约 99% 的 CPU 时间,线程 B 仅分到 1% 的 CPU 时间 —— 两者优先级相同,但 CPU 分配差距极大,这就是 Nice 值的作用。

四、Nice 值设置方法(3 种,实战必备)

结合 Ubuntu 环境,介绍最常用的 3 种设置方法,从命令行到代码,覆盖日常开发和调试场景。

方法 1:命令行运行程序时设置(最常用)

使用nice命令,格式:

bash

运行

nice -n [Nice值] 程序名

示例(Ubuntu 终端执行):

  • 设置 Nice 值为 10(谦让模式),运行程序:nice -n 10 ./a.out
  • 设置 Nice 值为 - 5(霸道模式,需 root):sudo nice -n -5 ./a.out
  • 默认 Nice 值 0(不指定 - n):nice ./a.out

方法 2:修改正在运行的进程 / 线程的 Nice 值

使用renice命令,可修改已启动的进程的 Nice 值,格式:

bash

运行

renice [新Nice值] -p [进程ID]

步骤(示例):

  1. 查看进程 ID(PID):ps -ef | grep 程序名(比如ps -ef | grep a.out);
  2. 修改 Nice 值(如将 PID 为 1234 的进程 Nice 值改为 - 10,需 root):sudo renice -10 -p 1234
  3. 验证修改结果:ps -l -p 1234(查看 NI 列,即为当前 Nice 值)。

方法 3:代码中设置(线程 / 进程级,开发必备)

在 C 语言中,使用nice()函数设置当前进程 / 线程的 Nice<unistd.h>`,函数原型:

c

运行

int nice(int inc); // inc为Nice值的增量,不是最终值

关键说明:

  • inc是 “增量”,不是最终的 Nice 值 —— 比如当前 Nice 值为 0,执行nice(-5),最终 Nice 值为 0 + (-5) = -5;
  • 返回值:成功返回修改后的 Nice 值,失败返回 - 1;
  • 若要设置指定线程的 Nice 值(而非当前线程),需使用pthread_setname_np()结合nice(),或使用sched_setparam()(更灵活)。

完整代码示例(Ubuntu 可直接编译运行):

c

运行

#define _G<stdio<unistd.h> #include <pthread.h> #include<errno.h> // 线程1:Nice值-5(霸道,多分CPU) void *thread_high(void *arg) { // 设置当前线程的Nice值:增量-5,最终值0 + (-5) = -5 int ret = nice(-5); if (ret == -1 && errno != 0) { perror("nice set failed"); pthread_exit(NULL); } printf("高权重线程(Nice=-5):正在运行,分到CPU更多\n"); while (1) { // 空循环,占用CPU } } // 线程2:Nice值10(谦让,少分CPU) void *thread_low(void *arg) { // 设置当前线程的Nice值:增量10,最终值0 + 10 = 10 int ret = nice(10); if (ret == -1 && errno != 0) { perror("nice set failed"); pthread_exit(NULL); } printf("低权重线程(Nice=10):正在运行,分到CPU更少\n"); while (1) { // 空循环,占用CPU } } int main() { pthread_t tid_high, tid_low; // 创建两个普通线程(默认SCHED_OTHER,优先级0) pthread_create(&tid_high, NULL, thread_high, NULL); pthread_create(&tid_low, NULL, thread_low, NULL); // 等待线程结束(实际不会结束,需手动终止) pthread_join(tid_high, NULL); pthread_join(tid_low, NULL); return 0; }

编译运行(需 root 权限,因为设置了负 Nice 值):

bash

运行

gcc nice_demo.c -o nice_demo -lpthread sudo ./nice_demo

运行效果:高权重线程(Nice=-5)会占据绝大部分 CPU,低权重线程(Nice=10)几乎很少运行(可通过top命令查看 CPU 占用率)。

五、Nice 值实战场景(什么时候用?)

Nice 值的核心作用是 “调节普通线程的 CPU 占用”,常见场景如下:

1. 后台服务优化

比如 Linux 系统中的日志服务、备份服务,属于低优先级任务,不需要占用太多 CPU,可设置较高的 Nice 值(如 10~15),避免影响前端业务线程。示例:sudo nice -n 15 /usr/sbin/rsyslogd(日志服务谦让运行)。

2. 高负载任务调优

比如批量数据处理、视频编码等 CPU 密集型任务,需要更多 CPU 资源,可设置较低的 Nice 值(如 - 5~-10),提升任务运行速度。

3. 避免普通线程抢占实时线程

在实时系统中(如工控、音视频),实时线程(SCHED_FIFO/RR)需要优先运行,可将普通线程的 Nice 值设置为较高(如 15~19),让普通线程更谦让,避免占用实时线程的 CPU。

4. 多普通线程公平分配 CPU

若多个普通线程需要公平分配 CPU,可将它们的 Nice 值设置为相同(如默认 0),CFS 调度器会自动实现公平分配。

六、常见误区(避坑必看)

  1. 误区 1:Nice 值是优先级 → 错!SCHED_OTHER 优先级固定 0,Nice 值是权重,不改变优先级;
  2. 误区 2:Nice 值越大,CPU 越多 → 错!Nice 值越大,越谦让,CPU 越少;
  3. 误区 3:实时线程可以用 Nice 值调节 → 错!实时线程不受 Nice 值影响,只看自身优先级(1~99);
  4. 误区 4:普通用户可以设置负 Nice 值 → 错!设置负 Nice 值必须用 root 权限(sudo);
  5. 误区 5:Nice 值可以无限调整 → 错!范围固定 - 20~19,超出范围会报错。

七、Nice 值相关命令(Ubuntu 常用)

表格

命令作用示例
nice运行程序时设置 Nice 值sudo nice -n -5 ./a.out
renice修改正在运行的进程 Nice 值sudo renice -10 -p 1234
ps -l查看进程的 Nice 值(NI 列)ps -l -p 1234
top实时查看进程 CPU 占用和 Nice 值top(按 “r” 可修改 Nice 值)

八、总结(面试 / 开发必背)

  1. Nice 值是普通线程(SCHED_OTHER)的 “谦让值”,不是优先级,优先级固定为 0;
  2. 取值范围 - 20~19,越小越霸道,CPU 分配越多,负 Nice 值需 root 权限;
  3. 实时线程(FIFO/RR)不受 Nice 值影响,实时优先级(1~99)永远高于普通线程;
  4. 3 种设置方式:命令行 nice、renice 修改运行中进程、代码中 nice () 函数;
  5. 核心用途:调节普通线程 CPU 分配比例,优化系统性能和任务响应速度。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/4 7:24:31

网盘直链下载助手:5分钟掌握浏览器下载网盘文件的终极方法

网盘直链下载助手&#xff1a;5分钟掌握浏览器下载网盘文件的终极方法 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 &#xff0c;支持 百度网盘 / 阿里云盘 / 中国移动云盘 / …

作者头像 李华
网站建设 2026/6/5 14:23:27

nli-distilroberta-base开发者案例:知识图谱三元组逻辑有效性验证

nli-distilroberta-base开发者案例&#xff1a;知识图谱三元组逻辑有效性验证 1. 项目概述 nli-distilroberta-base是一个基于DistilRoBERTa模型的自然语言推理(NLI)Web服务&#xff0c;专门用于判断两个句子之间的逻辑关系。这个轻量级但强大的模型能够帮助开发者快速验证知…

作者头像 李华
网站建设 2026/4/14 10:57:07

记录复现多模态大模型论文OPERA的一周工作()忻

pagehelper整合 引入依赖com.github.pagehelperpagehelper-spring-boot-starter2.1.0compile编写代码 GetMapping("/list/{pageNo}") public PageInfo findAll(PathVariable int pageNo) {// 设置当前页码和每页显示的条数PageHelper.startPage(pageNo, 10);// 查询数…

作者头像 李华
网站建设 2026/4/14 10:57:04

歌词滚动姬:免费开源LRC歌词制作工具完整指南

歌词滚动姬&#xff1a;免费开源LRC歌词制作工具完整指南 【免费下载链接】lrc-maker 歌词滚动姬&#xff5c;可能是你所能见到的最好用的歌词制作工具 项目地址: https://gitcode.com/gh_mirrors/lr/lrc-maker 歌词滚动姬&#xff08;LRC Maker&#xff09;是一款完全免…

作者头像 李华
网站建设 2026/4/14 10:56:44

CircuitJS1 Desktop Mod:跨平台开源电路仿真工具完整指南

CircuitJS1 Desktop Mod&#xff1a;跨平台开源电路仿真工具完整指南 【免费下载链接】circuitjs1 Standalone (offline) version of the Circuit Simulator with small modifications based on modified NW.js. 项目地址: https://gitcode.com/gh_mirrors/circ/circuitjs1 …

作者头像 李华