sched_setscheduler()函数
sched_setscheduler()函数将pid所指定进程的调度策略和调度参数分别设置为param指向的sched_param结构中指定的policy和参数。sched_param结构中的sched_priority成员的值可以为任何整数,该整数位于policy所指定调度策略的优先级范围内(含边界值)
FreeSWITCH对进程调度相关处理
目前,Linux支持通过参数policy中指定值的方法设定以下“正常”(即非实时)调度策略:
SCHED_OTHER 标准的循环分时策略
SCHED_BATCH 用于“批量”样式执行过程
SCHED_IDLE 用于运行非常低优先级的后台作业
对于上述每个策略,param->sched_priority必须为0。
另外还支持各种”实时“策略,用于线程执行方式的需要精确控制以时间为核心的特殊应用程序,即调度实时线程。
实时策略中可以指定的值是:
SCHED_FIFO 先进先出策略
SCHED_RR 轮询策略。
对于上述的策略,param->sched_priority需要指定调度线程的优先级。
sched_getscheduler()返回由pid标识的线程的当前调度策略。如果pid等于0,则将检索调用线程的策略。
参数设置:
#ifdef USE_SCHED_SETSCHEDULER
/*
* Try to use a round-robin scheduler
* with a fallback if that does not work
*/
struct sched_param sched = { 0 };
sched.sched_priority = SWITCH_PRI_LOW;
#endif
进行调度策略的设定:
#ifdef USE_SCHED_SETSCHEDULER
if (sched_setscheduler(0, SCHED_FIFO, &sched) < 0) {
fprintf(stderr, "ERROR: Failed to set SCHED_FIFO scheduler (%s)\n", strerror(errno));
sched.sched_priority = 0;
if (sched_setscheduler(0, SCHED_OTHER, &sched) < 0 ) {
fprintf(stderr, "ERROR: Failed to set SCHED_OTHER scheduler (%s)\n", strerror(errno));
return -1;
}
}
#endif
进行调度优先级的设定:
#ifdef HAVE_SETPRIORITY
/*
* setpriority() works on FreeBSD (6.2), nice() doesn't
*/
if (setpriority(PRIO_PROCESS, getpid(), -10) < 0) {
fprintf(stderr, "ERROR: Could not set nice level\n");
return -1;
}
#else
if (nice(-10) != -10) {
fprintf(stderr, "ERROR: Could not set nice level\n");
return -1;
}
#endif