具体修改
#include <sched.h>
#include <sys/time.h>
#include <sys/resource.h>
struct sched_param sched_p;
::sched_getparam(0, &sched_p);
// set policy/priority
int policy = SCHED_OTHER; //默认的调度策略
int priority = -15; //-20最高优先级,0就是默认
sched_p.sched_priority = priority; // Note: "priority" is nice value.
::sched_setscheduler(0, policy, &sched_p);
::setpriority(PRIO_PROCESS, 0, priority);
知识扫盲:
sched_setscheduler
是一个Linux系统调用(System Call),用于设置进程或线程的调度策略和优先级。
该系统调用允许修改指定进程或线程的调度策略、优先级和CPU亲和力(即指定任务只在特定CPU运行)。
在Linux中支持多种调度策略,如先进先出 (FIFO)、时间片轮转 (RR) 和实时 (SCHED_RR)等,可以通过调用该系统调用来设置所需的调度策略。
函数的原型如下:
#include <sched.h>
int sched_setscheduler(pid_t pid, int policy, const struct sched_param *param);
如果sched_setscheduler的第一个参数pid被设置为0,则该函数将应用于调用线程本身。
在这种情况下,调用线程的调度策略和优先级将被修改为指定的参数。
因此,如果您想要更改当前线程的调度策略,可以这样调用sched_setscheduler:
#include <pthread.h>
#include <sched.h>
int result;
struct sched_param param;
param.sched_priority = 99;
result = pthread_setschedparam(pthread_self(), SCHED_FIFO, ¶m);
if (result != 0) {
// 错误处理代码
}
在这里,pthread_self()函数返回当前线程的线程ID,该线程ID可以作为可用于调用sched_setscheduler的参数。
如果sched_setscheduler的第一个参数被设置为0,它将检索当前线程并将该线程的调度策略设置为指定的值。请注意,此方法需要你的线程运行sudo以获得root权限。
prctl
是一个 Linux 系统调用,可用于操作进程的运行状态或行为。该函数接受两个参数:option 和 arg2,其原型定义如下:
#include <sys/prctl.h>
int prctl(int option, unsigned long arg2, unsigned long arg3,
unsigned long arg4, unsigned long arg5);
其中,option参数表示要执行的操作类型,arg2是一个操作特定的参数。函数返回0表示执行成功,否则返回一个负值并且设置 errno 来指明错误的原因。
prctl 函数可以用于多种用途,例如:
1.修改进程的名称(通过 PR_SET_NAME 选项)
2.指定子进程死后是否变成 zombie 进程(通过 PR_SET_CHILD_SUBREAPER 选项)
3.设置进程的 seccomp 模式(通过 PR_SET_SECCOMP 选项)
4.设置进程的 UID、GID、启动时间戳等信息(通过 PR_SET_KEEPCAPS 选项)
需要注意的是,prctl 函数操作系统的某些行为,使用不当会导致系统异常或数据损坏等问题,可能会影响系统的稳定性和安全性。在使用prctl函数时,请确保您已经了解该函数的正确用法和限制,并按照文档提供的说明操作。