C++ 修改程序进程的优先级(Linux,Windows)
文章目录
- 1、Linux
- 1.1 常用命令
- 1.1.1 不占用终端运行和后台运行方式
- 1.1.2 查询进程
- 1.1.3 结束进程
- 1.1.4 优先级命令
- 1.2 C++ 代码示例
- 1.2.1 代码一
- 1.2.2 代码二
- 2、Windows
- 2.1 简介
- 2.2 函数声明
- 2.3 C++ 代码示例
- 2.3.1 代码一
- 2.3.2 代码二
- 结语

1、Linux
1.1 常用命令
1.1.1 不占用终端运行和后台运行方式
当在前台运行某个作业时,终端被该作业占据;可以在命令后面加上& 实现后台运行。
例如:
sh test.sh &
需要用户交互的命令不要放在后台执行,不过,作业在后台运行一样会将结果输出到屏幕上,如果放在后台运行的作业会产生大量的输出,最好使用下面的方法把它的输出重定向到某个文件中:
sh test.sh > out.file 2>&1 &
使用&命令后,作业被提交到后台运行,当前控制台没有被占用,但是一但把当前控制台关掉(退出帐户时),作业就会停止运行。nohup命令可以在你退出帐户之后继续运行相应的进程。nohup就是不挂起的意思。
nohup command &
nohup command > myout.file 2>&1 &
2>&1 是将标准出错重定向到标准输出,这里的标准输出已经重定向到了out.file文件,即将标准出错也输出到out.file文件中。最后一个&, 是让该命令在后台执行。
0 ,1,2分别代表stdin标准输入,stdout标准输出,stderr标准错误
,2与>结合代表错误重定向,而1则代表错误重定向到一个文件1,而不代表标准输出;换成2>&1,&与1结合就代表标准输出了,就变成错误重定向到标准输出。
command >out.file 2>&1 &
command>out.file是将command的输出重定向到out.file文件,即输出内容不打印到屏幕上,而是输出到out.file文件中。
1.1.2 查询进程
ps
ps -l
ps -A
# -e:等价于 ‘-A’ ,表示列出全部的进程
# -f:显示全部的列(显示全字段)
# 两者的输出结果差别不大,但展示风格不同。aux是BSD风格,-ef是System V风格。
# ps -aux
# ps -ef
ps -ef | grep 进程号
ps ax -o nice,pid,comm
1.1.3 结束进程
kill -9 进程号
1.1.4 优先级命令
Linux nice命令以更改过的优先序来执行程序,如果未指定程序,则会印出目前的排程优先序,内定的 adjustment 为 10,范围为 -20(最高优先序)到 19(最低优先序)。使用权限:所有使用者。
- 进程优先级范围
-20~19:数字越小,优先级越高
对非root用户,只能将其底下的进程的nice值变大而不能变小。若想变小,得要有相应的权限。
用top或者ps命令会输出PRI/PR、NI、%ni/%nice这三种指标值,解释如下:
PRI :进程优先权,代表这个进程可被执行的优先级,其值越小,优先级就越高,越早被执行
NI :进程Nice值,代表这个进程的优先值
%nice :改变过优先级的进程的占用CPU的百分比
- 开启某个进程并指定优先级
# nice [-n adjustment] [-adjustment] [--adjustment=adjustment] [--help] [--version] [command [arg...]]
# nice [OPTION] [COMMAND [ARG]...]nice -n 优先级数字 进程名字
nice -n 5 vim & #开启时指定vim的优先级为5,nice不是开启进程的命令,vim是开启进程nice -n 3 ls # 将 ls 的优先序加3并执行
nice -n -3 ls # 将 ls 的优先序减3并执行nice vi & #设置默认优先级,后台运行vi
nice -n 19 vi & #设置优先级为19,后台运行vi
nice -n -20 vi & #设置优先级为-20,后台运行vi
- 改变进程优先级
# renice [-n] priority [[-p] pid ...] [[-g] pgrp ...] [[-u] user ...]renice -n 优先级数字 进程pid
renice -n 5 15589 # 开启后改变进程的优先级;只能加pid
1.2 C++ 代码示例
在Linux中,进程运行的优先级分为-20~19等40个级别,其中,数值越小运行优先级越高,数值越大运行优先级越低。显而易见,优先级-20的运行优先级最高,优先级19的运行优先级最低。
函数nice是将当前进程运行的优先级增加指定值,既用当前进程运行的优先级加上指定值得到新的优先级,然后用新的优先级运行该进程。当计算出来的值小于-20,则进程将以优先级-20运行;当计算出来的值大于19,则进程将以优先级19运行。若增加正值,则表示降低进程运行优先级;若增加负值,则表示升高进程运行优先级。但只有具有超级用户权限的用户才可以以负数作为函数的参数,否则该函数将返回错误。
// 取得和设置程序进程执行优先权
#include <sys/time.h>
#include <sys/resource.h>// getpriority()系统调用返回由which和who指定的进程的nice值。
int getpriority(int which, int who);// setpriority()系统调用会将由 which 和 who 指定的进程的 nice 值设置为 prio。试图将 nice 值设置为一个超出允许范围的值(-20~+19)时会直接将 nice 值设置为边界值。
int setpriority(int which, int who, int prio);//fork - create a child process
#include <unistd.h>
pid_t fork(void);
进程特性nice值运行进程间接地影响内核的调度算法:
每个进程都拥有一个 nice 值,其取值范围为−20(高优先级)~19(低优先级),默认值为 0
在传统的 UNIX 实现中,只有特权进程才能够赋给自己(或其他进程)一个负(高)优先级
非特权进程只能降低自己的优先级,即赋一个大于默认值 0 的nice 值。
调用nice来设置进程的优先级。nice系统调用等同于:
int nice( int increment)
{ int oldprio = getpriority( PRIO_PROCESS, getpid());return setpriority(PRIO_PROCESS, getpid(), oldprio + increment);
}
1.2.1 代码一
#include <stdio.h>
#include <unistd.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <stdlib.h>int main()
{pid_t pid;int stat_val;int prio;int inc = 3;int exit_code;pid = fork();if (0 == pid){exit_code = 11;prio = getpriority(PRIO_PROCESS, getpid());printf("the child's priority is:%d\n", prio);nice( inc );prio = getpriority(PRIO_PROCESS, getpid());printf("after nice(%d), the child's priority is:%d\n", inc, prio);printf("child will exit with the exit code:%d\n", exit_code);exit(exit_code);}else if (pid < 0){exit(0);}wait(&stat_val);if ( WIFEXITED(stat_val) ){printf("the child has exited, the exit code is:%d\n", WEXITSTATUS(stat_val));}return 0;
}
1.2.2 代码二
#include <stdio.h> /* printf */
#include <stdlib.h> /* atoi, system, exit */
#include <errno.h> /* errno */
#include <string.h> /* strerror */
#include <unistd.h> /* nice */int main(int argc, char *argv[])
{int adjustment = 0;int ret;if ( argc > 1 ) {adjustment = atoi( argv[1] );}ret = nice( adjustment );printf( "nice(%d):%d/n", adjustment, ret );if ( -1 == ret ) {if ( errno == EACCES ) {printf( "Cannot set priority:%s./n", strerror( errno ) );exit(-1);}}system("nice");exit(0);
}
2、Windows
2.1 简介
-
简单的说就是进程(线程)的优先级越高,那么就可以分占相对多的CPU时间片。 每个进程都有相应的优先级,优先级决定它何时运行和占用 CPU 时间。最终的优先级共分32级,是从 0 到 31 的数值,称为基本优先级别。
-
优先级等级,这里我叫它进程优先级。因为一般来说它是在调用CreateProcess时指定的,CreateProcess中dwCreationFlags就可以指定进程的优先级。而线程创建时会继承进程的优先等级。
-
因为线程才是CPU时间分配的最小单位,所以部分书上也叫线程优先等级。
-
进程优先级可在任务管理器中的进程表中查看。右键相应的映像名称->设置优先级,即可查看当前的优先级。
进程优先级priority class | 标志 | 优先级值 |
---|---|---|
idle (低) | IDLE_PRIORITY_CLASS | 4 |
Below 低于标准 | BELOW_NORMAL_PRIORITY_CLASS | 此值在2000以下系统不支持 |
normal (标准) | NORMAL_PRIORITY_CLASS | 9(前台)或 7(后台) |
Above 高于标准 | ABOVE_NORMAL_PRIORITY_CLASS | 此值在2000以下系统不支持 |
high (高) | HIGH_PRIORITY_CLASS | 13 |
realtime (实时) | REALTIME_PRIORITY_CLASS | 24 |
2.2 函数声明
- 相关函数如下:
CreateProcess: 创建进程时 也可以设置 进程优先级
SetPriorityClass: 设置进程优先级
GetPriorityClass: 获取进程优先级
SetProcessPriorityBoost: 设置激活或停用进程优先级提高功能
GetProcessPriorityBoost: 获取是否激活进程优先级提高功能
设置指定进程的优先级类。 此值与进程的每个线程的优先级值一起确定每个线程的基本优先级级别。
BOOL SetPriorityClass([in] HANDLE hProcess,[in] DWORD dwPriorityClass
);
检索指定进程的优先级类。 此值与进程的每个线程的优先级值一起来确定每个线程的基本优先级别。
DWORD GetPriorityClass([in] HANDLE hProcess
);
- 相关优先级代码如下:
#include <windows.h>
//SetPriorityClass(获取当前进程句柄,进程优先级);
SetPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS);
2.3 C++ 代码示例
2.3.1 代码一
#include <windows.h>
#include <tchar.h>int main( void )
{DWORD dwError, dwPriClass;if(!SetPriorityClass(GetCurrentProcess(), PROCESS_MODE_BACKGROUND_BEGIN)){dwError = GetLastError();if( ERROR_PROCESS_MODE_ALREADY_BACKGROUND == dwError)_tprintf(TEXT("Already in background mode\n"));else _tprintf(TEXT("Failed to enter background mode (%d)\n"), dwError);goto Cleanup;} // Display priority classdwPriClass = GetPriorityClass(GetCurrentProcess());_tprintf(TEXT("Current priority class is 0x%x\n"), dwPriClass);//// Perform background work//;if(!SetPriorityClass(GetCurrentProcess(), PROCESS_MODE_BACKGROUND_END)){_tprintf(TEXT("Failed to end background mode (%d)\n"), GetLastError());}Cleanup:// Clean up;
return 0;
}
2.3.2 代码二
#include <Windows.h>
#include <stdlib.h>int main(int argc, char **argv)
{STARTUPINFO silA;STARTUPINFO silB;PROCESS_INFORMATION pilA;PROCESS_INFORMATION pilB;ZeroMemory(&silA, sizeof(STARTUPINFO));ZeroMemory(&silB, sizeof(STARTUPINFO));ZeroMemory(&pilA, sizeof(PROCESS_INFORMATION));ZeroMemory(&pilB, sizeof(PROCESS_INFORMATION));silA.cb = sizeof(STARTUPINFO);silB.cb = sizeof(STARTUPINFO);// 创建进程CreateProcess(NULL, "test1.exe", NULL, NULL, FALSE, 0, NULL, NULL, &silA, &pilA);// 设置进程优先级SetPriorityClass(pilA.hProcess, IDLE_PRIORITY_CLASS);// 设置进程优先调整SetProcessPriorityBoost(pilA.hProcess, true);CreateProcess(NULL, "test2.exe", NULL, NULL, FALSE, 0, NULL, NULL, &silB, &pilB);SetPriorityClass(pilB.hProcess, HIGH_PRIORITY_CLASS);WaitForSingleObject(pilA.hProcess, INFINITE);WaitForSingleObject(pilB.hProcess, INFINITE);CloseHandle(pilA.hProcess);CloseHandle(pilB.hProcess);system("pause");return 0;
}
结语
如果您觉得该方法或代码有一点点用处,可以给作者点个赞,或打赏杯咖啡;
╮( ̄▽ ̄)╭
如果您感觉方法或代码不咋地
//(ㄒoㄒ)//,就在评论处留言,作者继续改进;
o_O???
如果您需要相关功能的代码定制化开发,可以留言私信作者;
(✿◡‿◡)
感谢各位大佬童鞋们的支持!
( ´ ▽´ )ノ ( ´ ▽´)っ!!!
相关文章:

C++ 修改程序进程的优先级(Linux,Windows)
文章目录1、Linux1.1 常用命令1.1.1 不占用终端运行和后台运行方式1.1.2 查询进程1.1.3 结束进程1.1.4 优先级命令1.2 C 代码示例1.2.1 代码一1.2.2 代码二2、Windows2.1 简介2.2 函数声明2.3 C 代码示例2.3.1 代码一2.3.2 代码二结语1、Linux 1.1 常用命令 1.1.1 不占用终端…...

同步和异步promise
进程和线程进程(厂房):程序的运行环境线程(工人):进行运算的东西同步和异步同步:一件事干完才去干下一件事,前面的代码不执行,后面的代码也不执行。同步的代码可能会出现…...

CHATGPT是新的“搜索引擎终结者”吗?百度是否慌了
ChatGPT 以其非凡的自然语言处理 (NLP) 能力和清晰的响应风靡全球,有望带来一场重大的技术革命。在不知不觉中,叙事转向了ChatGPT与百度的对决,因为来自OpenAI的智能和健谈的聊天机器人已经慢慢获得了“潜在的百度终结…...

力扣-订单最多的客户
大家好,我是空空star,本篇带大家了解一道简单的力扣sql练习题。 文章目录前言一、题目:586. 订单最多的客户二、解题1.正确示范①提交SQL运行结果2.正确示范②提交SQL运行结果3.正确示范③提交SQL运行结果4.正确示范④提交SQL运行结果5.其他总…...

MyBatis学习笔记(六) —— MyBatis的各种查询功能
6、MyBatis的各种查询功能 6.1、查询一个实体类对象 SelectMapper.java接口 /*** 根据用户id查询用户信息* param id* return*/ User getUserById(Param("id") int id);SelectMapper.xml <!--User getUserById(Param("id") int id)--> <selec…...

2023年最新详细教程!手把手教你搭建Hexo + GitLab个人博客
文章目录前言一、安装和配置环境1.安装 Git2.安装 Node.js二、新建博客项目1.GitLab配置CI/CD自动化部署1.1 GitLab新建项目1.2 GitLab自建Runners1.2.1 下载gitlab-runner1.2.2 注册Runners1.2.3 安装Runners并启动1.3 添加.gitlab-ci.yml文件2.拉取和推送hexo blog2.1 拉取he…...

centos7安装
centos7安装制作U盘启动盘下载镜像下载 UltralISO制作启动盘使用U盘安装系统修改模式为 UEFI调整BOOT option保存重启进入安装界面安装图形界面安装搜狗输入法制作U盘启动盘 下载镜像 去官网下载镜像,找到 mirrors链接(速度快) 选择一个中…...

java String类(超详细,含常用方法、面试题,内存图,案例)
String类一、String类的特点二、String 类的常见构造方法三、String常见的面试题1.字符串常量池2.String s "abc"与String s new String("abc")区别3.字符拼接4.常量优化机制四、String常用方法1. 比较字符串内容2. 遍历字符串3.截取字符串4.替换字符串5…...

哈希表以及哈希冲突
目录 哈希表 哈希冲突 1. 冲突发生 2. 比较常见的哈希函数 3. 负载因子调节(重点) 散列表的载荷因子概念 负载因子和冲突率的关系 冲突-解决-闭散列 线性探测 二次探测 冲突-解决-开散列 结尾 我们在前面讲解了TerrMap(Set)的底层是一个搜索…...

测试——基本概念
概念 测试和调试有以下几点区别: 测试是测试人员进行的工作,调试是开发人员调试是发现并解决问题,测试只是发现问题测试贯穿于整个项目的生命周期,而调试主要在编码阶段 测试人员一般有如下的工作: 需求分析&#x…...

SnowFlake 雪花算法和原理(分布式 id 生成算法)
一、概述 SnowFlake 算法:是 Twitter 开源的分布式 id 生成算法。核心思想:使用一个 64 bit 的 long 型的数字作为全局唯一 id。算法原理最高位是符号位,始终为0,不可用。41位的时间序列,精确到毫秒级,41位…...

【死磕数据库专栏】MySQL对数据库增删改查的基本操作
前言 本文是专栏【死磕数据库专栏】的第二篇文章,主要讲解MySQL语句最常用的增删改查操作。我一直觉得这个世界就是个程序,每天都在执行增删改查。 MySQL 中我们最常用的增删改查,对应SQL语句就是 insert 、delete、update、select…...

阿里软件测试二面:adb 连接 Android 手机的两种方式,看完你就懂了
前言 随着现在移动端技术的突飞猛进,导致现在市场上,APP 应用数不胜数,那对于测试工程师而言,对于 APP 的测试,那基本就是一个必修课了。 今天,我就来给大家介绍一下,adb 连接 Android 手机的两…...

Docker安装YApi
目录0、Docker 环境准备1、数据库准备 MongoDB2、启动 YAPI3、官网教程0、Docker 环境准备 Docker 容器之间网络互通需要使用 docker network create yapi 创建一个自定义网络 docker network create yapi1、数据库准备 MongoDB YAPI 的数据库是 MongoDB,准备镜像…...
springboot自定义参数解析器
为什么要自定义参数解析器呢? 因为很多项目每次获取用户信息,需要重复从请求头中获取token,用token再去redis或是sql中去拿到存储的计本对象,再将获取到的Json数据,转化为我们需要的对象等代码,作为一名程…...
Python Unittest ddt数据驱动
1、数据驱动介绍: ddt.ddt(类装饰器,申明当前类使用ddt框架)ddt.data(函数装饰器,用于给测试用例传递数据),支持传python所有数据类型:数字(int,…...
Vue自定义组件遇到分页传输数据不正确解决办法
测试环境 Vue3 Element Plus 遇到问题 <el-table:data"tableData">...其他el-table-column<template #default"scope">// 自定义组件<my-button name"编辑" :id"scope.row.id"/ ></template></el-table&…...

ABAP 辨析CO|CN|CA|NA|CS|NS|CP|NP
1、文档说明 本篇文档将通过举例,解析字符的比较运算符之间的用法和区别,涉及到的操作符:CO|CN|CA|NA|CS|NS|CP|NP 2、用法和区别 用法总览 以下举例,几乎都使用一个字符变量和一个硬编码字符进行对比的方式,忽略尾…...

RK3568平台开发系列讲解(设备驱动篇)Pinctrl子系统详解
🚀返回专栏总目录 文章目录 一、pinctrl子系统结构描述二、重要的概念三、主要的数据结构和接口沉淀、分享、成长,让自己和他人都能有所收获!😄 📢我们知道在许多soc内部包含有多个pin控制器,通过pin控制器的寄存器,我们可以配置一个或者一组引脚的功能和特性。Linux…...

ROS小车研究笔记:二维SLAM建图简介与源码分析
ROS提供了现成的各类建图算法实现。如果只是应用的话不需要了解详细算法原理,只需要了解其需要的输入输出即可。 1 Gmapping Gmapping使用粒子滤波算法进行建图,在小场景下准确度高,但是在大场地中会导致较大计算量和内存需求 Gmapping需要…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...

shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...