学习线程调度策略的时候看到过这么一句话:线程属性为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权限运行程序才可以。