并行make使用的平均负载代表什么?

时间:2009-09-30 22:29:02

标签: build-process build makefile gnu-make

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

例如:

make -j --load-average=2.5

2.5是什么意思?

2 个答案:

答案 0 :(得分:1)

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

编辑,关注葡萄藤的评论
用Unix术语说,可运行进程是一个等待CPU时间或随时运行的进程。从技术上讲,它是一个处于TASK_RUNNING状态的进程。

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

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

答案 1 :(得分:0)

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

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

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

这里是getloadavg的实现,直接来自GNU 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,但我怀疑它已经改变了。