记一次线程调度策略的坑

学习线程调度策略的时候看到过这么一句话:线程属性为SCHED_OTHER,代表调度策略为分时的,就像上厕所一样,前边的人进去了后边的就进不去。我理解它的意思就是如果先执行的线程没有主动退出或者sleep,就不会让下一个线程执行,于是做了实验。由于linux线程默认属性就是SCHED_OTHER,所以代码如下

struct para
{
	char *str;
	int time;
};

void *send_message(void *p)
{
	while(1)
	{
		struct para *tmp = (struct para *)p;
		printf("tmp str = %s\n" , tmp->str);
	}
	return 0;
}

int main()
{
	pthread_t thread1 , thread2;
	void *retval;

	struct para *para1 = (struct para *)malloc(12);
	para1->str = "sjn";
	para1->time = 1;
	struct para *para2 = (struct para *)malloc(12);
	para2->str = "1015";
	para2->time = 2;
	int ret = pthread_create(&thread1 , NULL , send_message , (void *)para1);
	if(ret != 0)
		printf("error\n");
	ret = pthread_create(&thread2 , NULL , send_message , (void *)para2);
	if(ret != 0)
		printf("error\n");

while(1);
	return 0;
}

结果两个线程都在轮换打印。后来去网上又搜了一下得知这种策略的真正调度规则

当所有任务都采用分时调度策略时(SCHED_OTHER): 
1.创建任务指定采用分时调度策略,并指定优先级nice值(-20~19)。 
2.将根据每个任务的nice值确定在cpu上的执行时间( counter )。 
3.如果没有等待资源,则将该任务加入到就绪队列中。 
4.调度程序遍历就绪队列中的任务,通过对每个任务动态优先级的计算(counter+20-nice)结果,选择计算结果最大的一个去运行,当这个时间片用完后(counter减至0)或者主动放弃cpu时,该任务将被放在就绪队列末尾(时间片用完)或等待队列(因等待资源而放弃cpu)中。 
5.此时调度程序重复上面计算过程,转到第4步。 
6.当调度程序发现所有就绪任务计算所得的权值都为不大于0时,重复第2步。 

 

而后把调度策略设置成FIFO模式,结果创建线程失败,发现需要使用root权限运行程序才可以。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值