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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值