distcc 的各个阶段到底是什么意思?
好的,这很尴尬,但我只是在网上浪费了四个小时试图回答这个问题。下次我只拉源码看看。但是,你提出了一个很好的观点:令人惊讶的是,这不是现成的信息。
这些是我的猜测 (因为我不想承认我浪费了四个小时没有回答这个问题!):
- 启动- 否则可以称为“初始化/加载”,尚未准备好执行第一个任务
- 已阻止- 正在等待访问本地文件或本地处理器,我偶然发现
了最近的错误修复,在等待处理器可用时将“超时”设置为一秒,并且我知道它使用零长度“ flock
”文件有时阻止
- 已连接- 进程启动与客户端的联系,现在为作业保留 (??),或者正在编译作业 (??)
- Preprocess - 正在执行预处理操作
- Conect - 与客户端握手以进行原子操作,可能会被保留(??)
- 发送- 将编译后的目标文件发送回客户端
- 接收- 正在接收要编译的源,或接收压缩的标头(如果使用泵模式)
- 完成- 否则可以称为“空闲/可用”
distcc
注意:由于 Google 的“泵模式”算法,在客户端(运行)和志愿者(运行)之间实际上有相当多的“握手” distccd
。首先,在泵模式下,所有预期“需要”的标头都被捆绑、压缩并推送给志愿者(在那里它被解压缩到客户端机器上的本地镜像中)。然而,志愿者和客户之间的一些进一步通信似乎可以根据需要增量传输其他标头,因此可以解释上面列出的“更丰富”的通信阶段/状态。
Am I already using pump mode?
我非常怀疑它,因为您没有通过make
或包装编译选项来配置它scons
(需要运行 Google 算法来预测捆绑和传输给志愿者的标头使用情况),也找不到“泵”脚本. 但是,我无法解释您看到Preprocess
志愿者身上的“ ”状态。(您不是指客户端上的“预处理”状态,对吗?这完全可以理解,因为默认情况下预处理在客户端上。)
相反,我认为该实现使得硬状态机可以在进入下一个状态之前通过所有状态,包括“预处理”,即使没有预处理要做。例如,即使它没有在志愿者端进行预处理,distccd 也会接收源文件,将其写入磁盘,然后启动编译器。如果您在 Cywin 上,这些都不是即时的,尤其是如果它是一个大型源文件(尤其是在其中包含所有标题之后)。因此,您可能会看到“预处理”阶段,直到它手动启动编译操作本身的下一阶段。
嘿......我没有看到明显的“编译”阶段,所以“预处理”阶段体现“编译”或“预处理和编译”是可能的(因为这些阶段通常在许多编译器中组合在一起) .
抱歉——我只是猜测。
以及如何在 Cygwin 中使用泵模式?
我没试过,但应该是可以的。显然,最常见的问题是某些 Windows 编译器在 Cygwin 下运行时Cygwin
无法处理默认TMPDIR
设置。distcc
解决方法是将类似的东西export TMPDIR=c:/temp
放入/etc/profile
常见问题解答可能会提供更多帮助: http: //distcc.googlecode.com/svn/trunk/doc/web/faq.html