2

在 Windows 上使用 GNU make,负载平均值究竟代表什么?

例如:

make -j --load-average=2.5

2.5是什么意思?

4

2 回答 2

1

这意味着在一段时间内平均可运行进程数低于 2.5 之前,make 不会启动任何新线程。

编辑,按照 vines 的说法
, 一个可运行的进程,用 Unix 的话来说,是一个正在等待 CPU 时间或准备运行的进程。从技术上讲,它是一个处于 TASK_RUNNING 状态的进程。

但是......这促使我重新阅读原始问题,并注意它的“在 Windows 上”部分......
我原来的答案是,松散地,对于类 Unix 主机上的 GNU Make 是正确的,它完全没有Windows 上的事实。行为的差异是由于这两个操作系统提供了非常不同的指标来描述它们的“当前”CPU 负载。因此,Make 的逻辑必须以不同的方式解释这些 CPU 负载读数,以服务于其 --load-average 功能。

--load-average参数的目的是为 Make 提供何时可以启动新线程的指导;使 Make 更优雅地与其他应用程序(以及自身内部)共享 CPU 资源。
在 Linux 中,此参数的语义与其名称非常接近:当load-average时允许新的 Make 线程,正如内核报告的那样(我假设这是“一分钟”的平均负载,尽管它可能是五分钟一),小于参数值。
在 Windows 中,Make 根据 CPU 负载(由 GetSystemTimes 函数报告)和内存负载(例如,来自 GlobalMemoryStatusEx 函数)的加权平均值计算负载平均值。

于 2009-09-30T22:37:08.997 回答
0

在 Windows 上 - 显然没有。这是一个 UNIX 术语:http ://en.wikipedia.org/wiki/Load_%28computing%29

当我运行uptime命令时,我的 Cygwin 副本报告零负载平均值。我认为在 Windows 上没有一种快速计算的方法。过去曾在 Cygwin 邮件列表中询问过它。

换句话说:它没有被实现,所以它总是为零。

下面是getloadavgGNU Make 3.81 源代码的直接实现:

# if !defined (LDAV_DONE) && (defined (__MSDOS__) || defined (WINDOWS32))
#  define LDAV_DONE

  /* A faithful emulation is going to have to be saved for a rainy day.  */
  for ( ; elem < nelem; elem++)
    {
      loadavg[elem] = 0.0;
    }
# endif  /* __MSDOS__ || WINDOWS32 */

我还没有检查过较新版本的 GNU make,但我怀疑它已经改变了。

于 2015-01-08T18:45:40.440 回答