想研究一下 BOINC 客户端获取任务的方式,望文生义,找到了 client/cs_scheduler.cpp 里的 request_work_fetch(const char *)。这个函数做的很少,只是修改了 CLIENT_STATE 的一个 private 变量: must_check_work_fetch

接下来要看的是一个关键函数:client/cs_scheduler.cpp 里的 scheduler_rpc_poll() 。它首先会尝试上报任务,然后再申请任务。如果两次申请的时间差别不大,那它是不会申请任务的。但如果 must_check_work_fetch 为真,那就不用担心时间间隔的问题了。

scheduler_rpc_poll() 的目的是从全局考虑,保证电脑“有饭吃”。因此,它每次只会通过 work_fetch.choose_project() 找一个项目来申请。

这里的 work_fetchclient/work_fetch.cpp 文件中,是定义在全局的 WORK_FETCH 变量。他会对显卡和处理器分别讨论,调用 cpu_work_fetchcuda_work_fetch。我们以 cpu 为例。

首先,是遍历一遍所有的项目,找到最合适的,存储到 PROJECT* pbst 里。然后,根据不同的需求,调用 RSC_WORK_FETCH::set_request(PROJECT*, double) 来执行这项工作(说实话,这里的机制我理解的还不好)。

如果想要强行获取任务的话,不停把 must_check_work_fetch 设置成真应该是一个办法。但这种对于全局的操作,可能不适合对某个项目进行屯包。所以,接下来,我应该对 PROJECT 类研究一下。