我们正在尝试分析不同调度算法对Pthreads的Ubuntu系统的影响。我们创建了几个(1,2,4)线程,让它们运行在1,2或4个CPU上。每个线程都是一个带有1个数学运算的for循环。 1个线程需要几秒钟才能完成。
当使用FIFO在1个CPU上启动2个线程时,它们相隔很长时间(逻辑,FIFO首先完成第一个创建的线程)。对于RR,他们完成得更近(在某些情况下为半秒差异)。这与预期的一样。现在我们每次测试10次,大约1/3的测量时间是其他测量的一半。我们测量所有线程完成的时间。所以在1个CPU上我们等待2个线程完成。 RR或FIFO没什么区别。但是多次运行测试可以给你大约6s,2或3次,大约12s,5或6次。不可思议的是,程序不会在9或10秒左右完成。它在5到6之间或在11到13之间。我们对4,2,1个CPU(s)上的4,2,1个线程进行了这些测量。 FIFO和RR。优先级已设置为0和99(实时)。没有繁重的应用程序使用CPU。在使用过的核心上,超过97%的CPU时间用于我们程序产生的线程。
使用SCHED_OTHER时,我们没有这种现象。
有没有人对此行为有解释?
很难看到有多少上下文切换发生。对于FIFO,上下文切换的数量应接近0,对于RR,这应该大得多,但仍然几乎不影响总执行时间。对于SCHED_OTHER我猜测最多的上下文切换但我不完全确定。
另一个有趣的事实是,OTHER的总执行时间或多或少与FIFO的短时间相同,具有相同数量的线程和CPU。因此FIFO有时和其他一样快,但有时需要两倍的时间。
问候,
Roel Storms