关于时间片的小例子
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形式,仅仅是用户态模拟了一个而已?
自己解释不了,请高手一针见血。
你那个sleep是想让打印不要太多吗?如果是这个想法,应该放在funA或者funB里吧。 Maybe you can try 'SCHED_RR' policy. 不是,只是为了让进程不退出。回复 2# 349246377
我就是想验证按照时间片轮转的。而且我get_sche_policy也确实是0,也就是SCHE_OTHER.问题是不是按照时间片调度的。回复 3# firkraag
http://www.cnblogs.com/imapla/p/4234258.html
And google 'CFS(Completely Fair Scheduler)'.Maybe can help you. A线程和B线程如果不是在一个cpu上运行的呢? 你可以用taskset命令把A线程和B线程都绑定到一个cpu,再试试看。 一语道破天机,我怎么把多cpu这事忘了。虽然还没试,但应该就是这个问题。后续我会试一下。回复 8# archer239915
我确实忽略了多cpu调度这个情况,设置进程在指定cpu运行后,测试结果与预想一直,每隔几十毫秒才会有打印。感谢你一下就说到点子上了。回复 7# archer239915
页:
[1]