3

只是为了阻止任何关于“你为什么需要知道这个??”的评论:这只是一个我很好奇的谜题,而不是我出于任何实际原因需要做的事情。

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

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

[2]:“调度量子”定义为进程在其调度时间结束并且操作系统允许不同进程运行之前在 CPU 上运行而不会阻塞或让步的时间量。

4

2 回答 2

3

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

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

请注意,这假设您的时钟分辨率大于调度程序的量子大小;如果不是(例如,如果您尝试使用分辨率为 10mS 的时钟来测量 5mS 的量子长度),那么测量量子长度将是困难的 AFAICT。

于 2016-05-29T06:22:04.280 回答
2

我认为您可以通过对以下系统的足够运行次数进行统计分析来获得答案:

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

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

在循环中进行各种迭代次数。

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

现在,终止线程有时会首先被调度,并且可能还有其他线程在运行使行为复杂化,因此您可能需要在多处理器系统上运行很多次并统计分析结果。您还需要考虑线程启动时间和内存访问时间等因素,因为在通过循环检查标志的每次迭代中可能会有一个内存屏障。

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

于 2016-05-29T15:26:35.143 回答