allkillers 发表于 2016-04-13 22:27

关于时间片的小例子

staticint printA=1,printB=0;

funA()
{
    while(1)
    {
      if(printA)
      {
             printf("a\n");
            printA=0;
            printB=1:
      }
    }
}

funB()
{
    while(1)
    {
      if(printB)
      {
            printB=0;
            printA=1:
      }
    }
}

int main()
{
    pthreat_create(&tid1,funA.null):
    pthreat_create(&tid2,funB,null):
    sleep(0xffffff);
}

如上例子是在手机上敲的,请大家不要调语法的毛病。
我是想通过这个例子验证进程时间片的,thread在内核也对应一个task struct,所以也是按进程来调度的并且调度策略为sched_other.
所以我预期结果为:每隔一个时间片(也就是大概几十毫秒)打印出a.
但实际输出结果是:每毫秒会输出相当多的a.这意味着每毫秒两个线程切换了相当多次。

或者说pthread在内核不是task形式,仅仅是用户态模拟了一个而已?
自己解释不了,请高手一针见血。

349246377 发表于 2016-04-14 21:38

你那个sleep是想让打印不要太多吗?如果是这个想法,应该放在funA或者funB里吧。

firkraag 发表于 2016-04-15 08:54

Maybe you can try 'SCHED_RR' policy.

allkillers 发表于 2016-04-15 09:41

不是,只是为了让进程不退出。回复 2# 349246377


   

allkillers 发表于 2016-04-15 09:44

我就是想验证按照时间片轮转的。而且我get_sche_policy也确实是0,也就是SCHE_OTHER.问题是不是按照时间片调度的。回复 3# firkraag


   

firkraag 发表于 2016-04-15 13:09

http://www.cnblogs.com/imapla/p/4234258.html

And google 'CFS(Completely Fair Scheduler)'.Maybe can help you.

archer239915 发表于 2016-04-18 00:40

A线程和B线程如果不是在一个cpu上运行的呢?

archer239915 发表于 2016-04-18 00:41

你可以用taskset命令把A线程和B线程都绑定到一个cpu,再试试看。

allkillers 发表于 2016-04-18 11:34

一语道破天机,我怎么把多cpu这事忘了。虽然还没试,但应该就是这个问题。后续我会试一下。回复 8# archer239915


   

allkillers 发表于 2016-04-18 12:13

我确实忽略了多cpu调度这个情况,设置进程在指定cpu运行后,测试结果与预想一直,每隔几十毫秒才会有打印。感谢你一下就说到点子上了。回复 7# archer239915


   
页: [1]
查看完整版本: 关于时间片的小例子