如何通过实验确定进程/线程的调度量?

时间:2016-05-29 03:31:18

标签: multithreading scheduling experimental-design

只是为了阻止任何关于&#34效果的评论;为什么你需要知道这个?":这只是一个我很好奇的谜题,不是我需要做的任何实际的事情原因。

鉴于典型的POSIX系统[1],您如何设计一个实验来确定CPU绑定过程的调度量子[2]?

[1]:但不允许您通过系统调用或/ proc接口查询此信息

[2]:"调度量子"定义为进程在其计划时间结束之前在CPU上运行而没有阻塞或屈服的时间量,并且操作系统允许不同的进程运行。

2 个答案:

答案 0 :(得分:3)

我不确定它会有多准确,但这可能有效:

  1. 确保您的计算机处于空闲状态(或尽可能空闲)
  2. 产生2N个线程(其中N是计算机中的核心数)。应将所有这些线程设置为以相同的优先级运行。
  3. 每个线程都应该运行一个无限循环,除了使用高分辨率计时器(例如调用std :: chrono :: steady_clock :: now()或重复检索当前单调递增的wallclock时间之外什么都不做相似)。
  4. 在循环的每次迭代中,每个线程应检查“突然间隙”的结果时间值,即时钟时间从(t)跳到(t + n毫秒,n大于通常的delta)值)。这些差距很可能表明线程从CPU中被踢出的时间段,以便另一个线程可以运行。
  5. 在某些时候,计算所有这些间隙的大小的平均值,这是您对调度程序的量子大小的估计。
  6. 请注意,这假设您的时钟分辨率大于调度程序的量程大小;如果不是(例如,如果你试图使用10mS分辨率的时钟测量5mS量子长度),那么测量量子长度将是困难的AFAICT。

答案 1 :(得分:2)

我认为你可以通过对以下系统的足够运行的统计分析得到答案:

  • 每个处理器运行一个清除终止标志的线程,然后运行一个循环进行固定次数的迭代,或者直到设置终止标志,以先到者为准。这些线程记录它们是否因为运行所有迭代而终止,或者由于设置了终止标志而终止。

  • 同时,运行另一个设置终止标志的线程。

在循环中以各种迭代次数执行此操作。

如果循环在线程时间片内完成,它将完成所有迭代。如果它未在线程时间片内完成,则终止线程将有机会中断其中一个循环线程。

现在,有时会先安排终止线程,并且可能还有其他线程正在运行,这会使行为变得复杂,因此您可能需要在多处理器系统上运行很多次并统计分析结果。你还需要考虑线程启动时间和内存访问时间之类的事情,因为在每次迭代循环中都可能存在内存障碍来检查标志。

如果在足够不同的循环迭代限制下有足够的重复次数,这应该可以为您提供在一个时间片中迭代循环的次数。然后,您可以在卸载的系统上运行大量迭代,以获得每次迭代所需的时间长度,然后计算每个时间片的挂钟时间。