进程优先级和调度

nice的值范围-20~19(数字越小,优先级越高)

//获取和修改优先级
#include<sys/resource.h>
//which参数确定who参数如何被解释,该值取值如下
PRIO_PROCESS    操作进程id为who的进程,如果who为0,使用调用者的进程id
PRIO_PGRP   操作进程组id为who的进程组的所有成员,如果who为0,那么使用调用者的进程组
PRIO_USER   操作所有真实有胡id为who的进程,如果who为0,使用调用者的真实用户id
int getpriority(int which,id_t who);    //可能在成功返回时返回-1,所以调用之前将errno设置为0,接着检查调用后返回值为-1并且errno不为0才能确认调用成功
int setpriority(int which,id_t who ,int pro);   //pro如果超出nice返回,直接设置nice为边界值

//SCHED_RR策略
//优先级相同的进程以循环时间分享的方式执行,进程每次使用cpu的时间是一个固定长度的时间片
//高优先级进程总是优先于低优先级进程

//SCHED_FIFO策略
//先进先出,不存在时间片,一旦一个SCHED_FIFO进程获取cpu控制权之后,她就会一直执行,直到自动放弃cpu或者终止或者被一个优先级更高的进程抢占了

//实现优先级范围,返回一个调度策略的优先级取值范围
#include<sched.h>
int sched_get_priority_min(int policy);
int sched_get_priority_max(int policy);
//policy指定需获取哪种调度策略的信息,这个参数一般是SCHED_RR或者SCHED_FIFO

//修改调度策略和优先级
int sched_setscheduler(pid_t pid,int policy,const struct sched_param *param);//如果pid为0,那么将修改调用进程的特性
struct sched_param{
//指定调度策略,对于SCHED_RR和SCHED_FIFO来说,这两个字段取值必须位于sched_get_priority_min()和sched_get_priority_max()规定的范围内
//对于其它策略来讲,优先级必须为0
int sched_priority; 
};

//修改一个进程的调度策略优先级
int sched_setparam(pid_t pid,const struct sched_param *param);

//获取进程的调度策略和优先级
int sched_getscheduler(pid_t pid);
int sched_getparam(pid_t pid,struct sched_param *param);

//释放cpu
//如果存在与调用进程的优先级相同的其他排队的可运行进程,那么调用进程会被放在队列的队尾,队列中队头的进程将会被调度使用cpu
int sched_yield(void);

//找出SCHED_RR进程在每次被授权使用cpu时分配到的时间片的长度
int sched_rr_get_interval(pid_t pid,struct timespec *tp);

//设置pid制定的进程的cpu亲和力,如果pid为0,那么调用进程的cpu亲和力就会被改变
int sched_setaffinity(pid_t pid,size_t len,cpu_set_t *set);

这里写图片描述

cpu_set_t set;
CPU_ZERO(&set);
CPU_SET(1,&set);
CPU_SET(2,&set);
CPU_SET(3,&set);
sched_setaffinity(pid,CPU_SETSIZE,&set);

//获取pid指定的进程的cpu亲和力掩码,如果pid为0,那么就返回调用进程的cpu亲和力掩码
int sched_getaffinity(pid_t pid,size_t len,cpu_set_t *set);
原文地址:https://www.cnblogs.com/biaopei/p/7730605.html