C++ 修改程序进程的优先级(Linux,Windows)

news2024/9/29 21:20:47

文章目录

  • 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()系统调用会将由 whichwho 指定的进程的 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_CLASS4
Below 低于标准BELOW_NORMAL_PRIORITY_CLASS此值在2000以下系统不支持
normal (标准)NORMAL_PRIORITY_CLASS9(前台)或 7(后台)
Above 高于标准ABOVE_NORMAL_PRIORITY_CLASS此值在2000以下系统不支持
high (高)HIGH_PRIORITY_CLASS13
realtime (实时)REALTIME_PRIORITY_CLASS24

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 class

   dwPriClass = 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???
如果您需要相关功能的代码定制化开发,可以留言私信作者;(✿◡‿◡)
感谢各位大佬童鞋们的支持!( ´ ▽´ )ノ ( ´ ▽´)っ!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/370765.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关于死锁的一些基本知识

目录 死锁是什么&#xff1f; 死锁的三种经典情况 1.一个线程&#xff0c;一把锁&#xff0c;连续加锁两次&#xff0c;如果锁是不可重入锁就会死锁。 不可重入锁与可重入锁&#xff1a; 2.两个线程两把锁&#xff0c;t1和t2各自针对于锁A和锁B加锁&#xff0c;再尝试获取…

Redis 集群

文章目录一、集群简介二、Redis集群结构设计&#x1f349;2.1 数据存储设计&#x1f349;2.2 内部通信设计三、cluster 集群结构搭建&#x1f353;3-1 cluster配置 .conf&#x1f353;3-2 cluster 节点操作命令&#x1f353;3-3 redis-trib 命令&#x1f353;3-4 搭建 3主3从结…

用ChatGPT生成Excel公式,太方便了

ChatGPT 自去年 11 月 30 日 OpenAI 重磅推出以来&#xff0c;这款 AI 聊天机器人迅速成为 AI 界的「当红炸子鸡」。一经发布&#xff0c;不少网友更是痴迷到通宵熬夜和它对话聊天&#xff0c;就为了探究 ChatGPT 的应用天花板在哪里&#xff0c;经过试探不少人发现&#xff0c…

同步和非同步整流DC/DC转换区别

在DC/DC转换器中&#xff0c;非隔离式降压开关稳压器包括两种拓扑结构&#xff1a;非同步整流&#xff08;二极管&#xff09;型和同步整流型。非同步整流型已经使用多年&#xff0c;具有简单的开关稳压器电路&#xff0c;效率勉强超过80%。随后&#xff0c;电池供电应用&#…

VMware 的网络适配器 桥接-NAT-仅主机

大家使用VMware安装镜像之后&#xff0c;是不是都会考虑虚拟机的镜像系统怎么连上网的&#xff0c;它的连接方式是什么&#xff0c;它ip是什么&#xff1f; 路由器、交换机和网卡 1.路由器 一般有几个功能&#xff0c;第一个是网关、第二个是扩展有线网络端口、第三个是WiFi功…

Redis 被问麻了...

Redis是面试中绕不过的槛&#xff0c;只要在简历中写了用过Redis&#xff0c;肯定逃不过。今天我们就来模拟一下面试官在Redis这个话题上是如何一步一步深入&#xff0c;全面考察候选人对于Redis的掌握情况。 小张&#xff1a; 面试官&#xff0c;你好。我是来参加面试的。 …

Hadoop-MapReduce

Hadoop-MapReduce 文章目录Hadoop-MapReduce1 MapRedcue的介绍1.1 MapReduce定义1.2 MapReduce的思想1.3MapReduce优点1.4MapReduce的缺点1.5 MapReduce进程1.6 MapReduce-WordCount1.6.1 job的讲解2 Hadoop序列化2.1 序列化的定义2.2 hadoop序列化和java序列化的区别3 MapRedu…

RabbitMQ发布确认模式

目录 一、发布确认原理 二、发布确认的策略 &#xff08;一&#xff09;开启发布确认的方法 &#xff08;二&#xff09;单个确认模式 &#xff08;三&#xff09;批量确认模式 &#xff08;四&#xff09;异步确认模式 &#xff08;五&#xff09;如何处理异步未确认消…

华为CT6100双千M路由记录

该文章仅仅记录使用CT6100的流程&#xff0c;不提供任何参考和建议。 一、简介 设备&#xff1a;华为CT6100瘦客服端&#xff0c;J1800cpu&#xff0c;不包含外壳&#xff0c;有双千M网口&#xff0c;2G内存8G硬盘。系统&#xff1a;esir的高大全openwrt版本用途&#xff1a;对…

QT 完美实现圆形按钮

QT 版本&#xff1a;5.6.0 官方的按钮有些普通&#xff0c;如果我们想要换成自己喜欢的按钮而却无从下手&#xff0c;那么请继续往下阅读&#xff08;皮一下&#xff09;。 首先&#xff0c;可以在网络上搜索一下自己喜欢的按钮图形&#xff08;或者可以自行绘制&#xff09;…

十大算法基础——上(共有20道例题,大多数为简单题)

一、枚举&#xff08;Enumerate&#xff09;算法 定义&#xff1a;就是一个个举例出来&#xff0c;然后看看符不符合条件。 举例&#xff1a;一个数组中的数互不相同&#xff0c;求其中和为0的数对的个数。 for (int i 0; i < n; i)for (int j 0; j < i; j)if (a[i] …

偏向锁、轻量级锁、自旋锁、重量级锁,它们都是什么?有什么关联

互斥锁的本质是共享资源。 当有多个线程同时对一个资源进行操作时&#xff0c;为了线程安全&#xff0c;要对资源加锁。 更多基础内容参看上文《深入了解Java线程锁(一)》 接下来&#xff0c;我们来看看两个线程抢占重量级锁的情形&#xff1a; 上图讲述了两个线程ThreadA和…

SMART PLC斜坡函数功能块(梯形图代码)

斜坡函数Ramp的具体应用可以参看下面的文章链接: PID优化系列之给定值斜坡函数(PLC代码+Simulink仿真测试)_RXXW_Dor的博客-CSDN博客很多变频器里的工艺PID,都有"PID给定值变化时间"这个参数,这里的给定值变化时间我们可以利用斜坡函数实现,当然也可以利用PT1…

vb.net 视频音频转换

视频&音频转换工具 V23.0主流视频音频转换工具&#xff0c;Kbps数值越大&#xff0c;音频品质越高&#xff08;前提原视频或音频文件品质高&#xff09;。.NETFramework V4.0点击按钮 选中文件 保存文件 即可转换&#xff0c;转换速度较快&#xff0c;转换后的音频文件未发…

Detr源码解读(mmdetection)

Detr源码解读(mmdetection) 1、原理简要介绍 整体流程&#xff1a; 在给定一张输入图像后&#xff0c;1&#xff09;特征向量提取&#xff1a; 首先经过ResNet提取图像的最后一层特征图F。注意此处仅仅用了一层特征图&#xff0c;是因为后续计算复杂度原因&#xff0c;另外&am…

使用kubeadm 部署kubernetes 1.26.1集群 Calico ToR配置

目录 机器信息 升级内核 系统配置 部署容器运行时Containerd 安装crictl客户端命令 配置服务器支持开启ipvs的前提条件 安装 kubeadm、kubelet 和 kubectl 初始化集群 &#xff08;master&#xff09; 安装CNI Calico 集群加入node节点 机器信息 主机名集群角色IP内…

DS期末复习卷(十)

一、选择题(24分) 1&#xff0e;下列程序段的时间复杂度为&#xff08; A &#xff09;。 i0&#xff0c;s0&#xff1b; while (s<n) {ssi&#xff1b;i&#xff1b;} (A) O(n^1/2) (B) O(n ^1/3) © O(n) (D) O(n ^2) 12…xn xn^1/2 2&#xff0e;设某链表中最常用的…

SnowFlake 雪花算法和原理(分布式 id 生成算法)

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

Android 原生 TabLayout 使用全解析

前言为什么会有这篇文章呢&#xff0c;是因为之前关于TabLayout的使用陆陆续续也写了好几篇了&#xff0c;感觉比较分散&#xff0c;且不成体系&#xff0c;写这篇文章的目的就是希望能把各种效果的实现一次性讲齐&#xff0c;所以也有了标题的「看这篇就够了」。TabLayout作为…

【自然语言处理】Topic Coherence You Need to Know(主题连贯度详解)

Topic Coherence You Need to Know皮皮&#xff0c;京哥皮皮&#xff0c;京哥皮皮&#xff0c;京哥CommunicationUniversityofChinaCommunication\ University\ of\ ChinaCommunication University of China 在大多数关于主题建模的文章中&#xff0c;常用主题连贯度&#xff…