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