freeswitch源碼分析之進程調度策略、進程調度優先級設置

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章