Linux 中的 renice 命令详解及C/C++代码实现

article/2025/10/3 21:37:31

Linux 中的 nice 命令有助于执行具有修改的调度优先级的程序/进程。 它启动具有用户定义的调度优先级的进程。

如果我们给一个进程更高的优先级,那么内核会为这个进程分配更多的 CPU 时间。 而 renice 命令允许您更改和修改已运行进程的调度优先级。

什么是进程

简而言之,进程是 Linux 用来承担运行程序角色的命名约定。 进程是规则的集合,任何特定程序通过这些规则使用分配的处理器时间、内存和 I/O 资源。 Linux 系统上运行的每个进程都有自己的进程 ID (PID),通过它可以对其进行监视和管理。

Linux内核旨在收集有关每个进程的各种信息。 这些包括但不限于:

进程状态(可运行、睡眠、僵尸或停止)
流程执行优先级(niceness)
使用资源信息
进程的所有者
每个特定进程打开了哪些网络端口和文件

现在我们对流程有了一些了解,我们可以继续创建一些流程。 为此,只需打开终端并在后台执行 yes 命令并将其输出重定向到 /dev/null:

在这里插入图片描述
从上面我们可以阅读到以下信息:

F – FLAG:进程没有以超级用户权限启动。 否则我们会看到数字 4 或 1 和 4 的总和。查看 man ps 了解更多信息。
S – STATE:进程当前正在运行
UID – 启动进程的用户的用户 ID。 UID 实际上是 EUID 的别名(有效用户 ID)
PID - 我们的 yes 命令的进程 ID 是 2329
PPID——父进程 ID。 这是一个进程 ID,我们的 yes命令是从中派生出来的。 在这种情况下,它是 PID 2244的 bash。
C – 处理器利用率的整数值,以 % 为单位。
PRI——进程优先级。 值越高优先级越低。
NI – 不错的值,范围从 -20 到19。值越高,您对其他用户就越好,换句话说,值越高,优先级越低。

进程的生命周期

Linux 进程管理的基本原则在创建新进程时包含两个不同的操作。 该操作是进程通过 fork() 调用复制自身的地方,从而创建一个具有唯一 PID 的新进程。 fork 操作最常见的是执行新程序的 exec() 操作。 在引导期间创建的第一个进程是 init,它始终分配 PID 1。所有其他进程都被视为 init 进程的子进程。

通常情况下,在子进程允许死亡之前,此事件需要由父进程通过发送退出值来确认。 成功终止发送父进程值 0。如果由于某种原因子进程超过父进程 init 将接受此进程作为孤立进程。

renice命令的使用

我们可以利用 renice 命令在进程运行时更改 niceness。 要查看语法,我们将传递 –h 选项:

在这里插入图片描述

renice 命令可以应用于进程、进程组或用户(目标)。 特权用户可以更改其他用户进程的优先级。 对于普通用户,优先级必须介于 0 和环境变量 PRIO_MAX(通常为 20)之间,数字越大表示友好度越高。

较高的 niceness 值意味着进程将以较低的优先级运行。 特权用户可以设置一个负优先级,低至 PRIO_MIN(通常为 -20),以加快进程。 请参阅 nice 命令以在初始运行时设置进程的调度优先级。

在这里插入图片描述
renice 命令示例:

在这里插入图片描述要更改它的值,我们可以使用 renice 命令并提供 PID 和 nice 值。 让我们将 nice 值更改为 15:

在这里插入图片描述

要遵循的规则是,非超级用户只能为任何进程增加 nice 值(给予较低的优先级)。 如果现在尝试将 nice 值从 15 更改为 10,则会出现以下错误:

renice: failed to set priority for 2329 (process ID): Permission denied

renice 命令还使 root 用户能够更改任何用户进程的 nice 值。 这是通过 -u 开关完成的。 以下 linux 命令将所有用户进程的优先级更改为 -19。

在这里插入图片描述

Linux renice命令C/C++实现

int main(int argc, char *argv[])
{if (argc < 2)usage();if (strcmp(*argv, "-n") == 0) {incr = 1;argc--, argv++;if (argc < 2)usage();}if (getnum("priority", *argv, &prio))return (1);argc--, argv++;for (; argc > 0; argc--, argv++) {if (strcmp(*argv, "-g") == 0) {which = PRIO_PGRP;continue;}if (strcmp(*argv, "-u") == 0) {which = PRIO_USER;continue;}if (strcmp(*argv, "-p") == 0) {which = PRIO_PROCESS;continue;}if (which == PRIO_USER) {if ((pwd = getpwnam(*argv)) != NULL)who = pwd->pw_uid;else if (getnum("uid", *argv, &who)) {errs++;continue;} else if (who < 0) {warnx("%s: bad value", *argv);errs++;continue;}} ...
}

运行结果:

在这里插入图片描述
在这里插入图片描述

总结

本篇讲解如何使用 renice Linux 命令更改进程的优先级值。更多了解请参考man手册。

欢迎关注微信公众号【程序猿编码】,需要renice命令完整源码的添加本人微信号(c17865354792)


http://chatgpt.dhexx.cn/article/5Ii7Wajy.shtml

相关文章

Java之throw和throws的区别

throw和throws的区别 共同点区别总结 共同点 两者在抛出异常时&#xff0c;抛出异常的方法并不负责处理&#xff0c;顾名思义&#xff0c;只管抛出&#xff0c;由调用者负责处理。 区别 &#xff08;1&#xff09;throws用于方法头&#xff0c;表示的只是异常的申明&#xf…

Throw和Throws详解

Throw和Throws详解 ​ 1.throw是什么&#xff1f;有什么用&#xff1f; ​ throw是java中关于异常的一种操作&#xff0c;如果在try{}catch{}中使用了throw&#xff0c;就代表自己书写的这个方法&#xff0c;可以自己 处理异常了&#xff0c;就是抛出的一个动作&#xff0c;可…

Java异常:throw 和 throws的区别

throws&#xff1a;用来声明一个方法可能抛出和所有异常的信息&#xff0c;表现出现异常的可能性&#xff0c;但并不一定会发生异常。&#xff08;可以理解为为了预防异常的出现&#xff0c;而用throws提前声明一下&#xff09; throw&#xff1a;指抛出的一个具体的异常类型&…

Throws和Throw的区别?

在初学Java异常时&#xff0c;总是被throws和throw搞晕&#xff0c;今天来理一下它们之间的关系。 1、throws 方法名后面跟上 throws Exception 证明这个方法里的语句可能会发生异常&#xff0c;注意是可能&#xff01;在别处如果调用这个方法时&#xff0c;就必须也抛出异常…

再探java基础——throw与throws

再探java基础——throw与throws 以前虽然知道一些异常的处理&#xff0c;也用过一些&#xff0c;但是对throw和throws区别还是有不太清楚。今天用实例测试一下。 异常处理机制 异常处理是对可能出现的异常进行处理&#xff0c;以防止程序遇到异常时被卡死&#xff0c;处于一…

try catch 和throw以及throws的使用

转载&#xff1a;https://www.cnblogs.com/zhangdaicong/p/6127984.html try-catch和throw,throws的区别 java里的异常多种多样&#xff0c;这是一种非常有用的机制&#xff0c;它能帮助我们处理那些我们未知的错误&#xff0c;在java里&#xff0c;关于异常的有throw throws…

Java异常之throw,throws和Throwable

Java异常处理中有throw开头的三兄弟&#xff0c;分别是throw,throws以及Throwable&#xff0c;那么他们之间到底怎么区分呢&#xff0c;且听我慢慢道来。 Throwable Throwable是一个类&#xff0c;该类被异常类Exception以及错误类Error继承&#xff0c;其主要结构如下&#…

Java throws 使用

在开发中&#xff0c;如果去调用别人写的方法时&#xff0c;是否能知道别人写的方法是否会发生异常&#xff1f;这是很难判断的。针对这种情况&#xff0c;Java总允许在方法的后面使用throws关键字对外声明该方法有可能发生异常&#xff0c;这样调用者在调用方法时&#xff0c;…

【JavaSE】throws 异常处理

文章目录 1. 基本介绍2. 快速入门案例3. 注意事项和使用细节 1. 基本介绍 如果一个方法(中的语句执行时)可能生成某种异常&#xff0c;但是并不能确定如何处理这种异常&#xff0c;则此方法应显示地声明抛出异常&#xff0c;表明该方法将不对这些异常进行处理&#xff0c;而由…

throws异常

在程序开发过程中&#xff0c;程序员会尽量避免错误的发生&#xff0c;但是总会发生一些不可预测的事情&#xff0c;例如除法运算时除数为0 、内存不足、栈溢出等&#xff0c;这些就是异常&#xff0c;java语言提供了异常的处理机制&#xff0c;处理一些不可预期的事情。 使用t…

Elasticsearch之利用bulk提高写入性能(含源码分析)

什么是bulk操作 bulk是批量的意思&#xff0c;也就是把原来单个的操作打包好&#xff0c;通过批量的api提交到ES集群。下面是个示例&#xff1a; 单个操作&#xff1a; PUT my-index-000001/_doc/1 {"timestamp": "2099-11-15T13:12:00","message&…

.NET5必备工具——EF大数据批量处理----Bulk系列

之前做项目的时候&#xff0c;如果在大批量操作数据时,性能不好.因为在框架中使用了EntityFramework&#xff0c;于是就搜索到某著名插件,Z系列。 1.安装 然后在类里面添加引用之后,使用DbContext就可以直接点出来。 2.博客园有人做过对比试验 我们直接拿数据说话吧. EF传统…

初识ElasticSearch(5) -批量操作之bulk | 条件查询 | 其它查询

1. bulk&#xff1a;1.1. bulk语法&#xff1a;1.2. bulk行为-增删改&#xff1a; 2. bulk-index批量插入&#xff1a;3. bulk-update批量修改&#xff1a;4. bulk-delete批量删除&#xff1a;5. _update_by_query条件更新&#xff1a;6. _delete_by_query条件删除&#xff1a;…

mysql bulkupdate_Bulk Upsert for MySQL PostgreSQL

什么是 Upsert "UPSERT" is a DBMS feature that allows a DML statements author to atomically either insert a row, or on the basis of the row already existing, UPDATE that existing row instead, while safely giving little to no further thought to con…

JPA 2.1: Bulk Update and Delete

为什么80%的码农都做不了架构师&#xff1f;>>> JPA 2.1: Bulk Update and Delete In the JPA 2.0 and early version, if you want to execute a bulk updating query, you have to use update or delete clause in JPQL directly. JPA 2.1 introduce new Criteri…

ElasticSearch提供的bulk update性能对比

目的&#xff1a;为了对比update的数据中重复数据对性能的影响。

Java面试智力题逻辑题汇总2021

rand5()能够生成0-4的随机数 rand7()能够生成0-6的随机数 已知rand7()生成rand5() 已知rand5()生成rand7()

面试智力题精选:扑克牌问题

袁方同学在玩扑克牌。这幅扑克牌比较特别&#xff0c;没有花色&#xff0c;只有点数。每张牌的点数是1&#xff0c;2&#xff0c;3&#xff0c;...,20。一共20张牌。袁方把牌洗了很多遍以后&#xff0c;把所有牌正面朝下垒成一堆放在自己手上。他翻第一张牌&#xff0c;发现是1…

大厂面试常见智力题

1. 64匹马,8个赛道,找出前4名最少比赛多少场? 这是一道经常考的智力题 64匹马&#xff0c;我们要想知道哪匹&#x1f40e;跑的最快&#xff0c;前提条件是每一匹&#x1f40e;都要去比赛一场。所以刚开始的赛马规则是每匹马都要进行一次比赛。 步骤1: 把 64匹&#x1f40e;…

盘点面试中常见的智力题

由于某些不可抗力&#xff0c;几篇文章做了删除&#xff0c;重新上架&#xff0c;希望于你有益。 面试为何会出现智力题&#xff1f; 可能是为了考察应聘者的综合分析能力、逻辑思维能力、反应能力和解决问题能力吧~ 也可能是...... “我去&#xff01;这面试者能力可以啊&…