想研究一下 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_fetch
在 client/work_fetch.cpp
文件中,是定义在全局的 WORK_FETCH
变量。他会对显卡和处理器分别讨论,调用 cpu_work_fetch
和 cuda_work_fetch
。我们以 cpu 为例。
首先,是遍历一遍所有的项目,找到最合适的,存储到 PROJECT* pbst
里。然后,根据不同的需求,调用 RSC_WORK_FETCH::set_request(PROJECT*, double)
来执行这项工作(说实话,这里的机制我理解的还不好)。
如果想要强行获取任务的话,不停把 must_check_work_fetch
设置成真应该是一个办法。但这种对于全局的操作,可能不适合对某个项目进行屯包。所以,接下来,我应该对 PROJECT
类研究一下。