进程优先级和调度
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);