我们正在尝试分析不同调度算法对 Pthreads 的 Ubuntu 系统的影响。我们创建了几个 (1,2, 4) 线程并让它们在 1、2 或 4 个 CPU 上运行。每个线程都是一个带有 1 个数学运算的 for 循环。1 个线程需要几秒钟才能完成。
当在 1 个带有 FIFO 的 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 上的 4、2、1 个线程进行了这些测量。先进先出和RR。优先级已设置为 0 和 99(实时)。没有繁重的应用程序正在使用 CPU。在使用的核心上,超过 97% 的 CPU 时间用于我们程序生成的线程。
使用 SCHED_OTHER 时我们没有这种现象。
有人对这种行为有解释吗?
很难看出发生了多少上下文切换。对于 FIFO,上下文切换的数量应该接近于 0,对于 RR,这应该大得多,但仍然几乎不会影响总执行时间。对于 SCHED_OTHER,我猜测最多的上下文切换,但我不完全确定。
另一个有趣的事实是 OTHER 的总执行时间或多或少与具有相同线程和 CPU 数量的 FIFO 的短时间相同。所以 FIFO 有时和 OTHER 一样快,但有时需要两倍的时间。
问候,
罗尔风暴