如何将Android上线程绑定到指定cpu核心

Linux kernel的hot plugoff机制使得这事情并没有办法保证。一切正如你所看到的,当因为thermal导致cpu scheduler/governor降频关核时,之前设置的thread affinity就失效了,以及你无法再设置对应线程的affinity,这些核这时候对你来说是不存在的,并且你无法阻止这件事情(os为了保护硬件的强制调度行为)。不同厂商选择governor的策略不同,一般来说,国内几家大的hw vendor都有对应的game sdk留有特定的接口让你hint os的governor来绑核,应该可以做到核心一旦上线就重新绑回去。再不济也会有事件回调(也可能是通过是噢Unix Local Socket)告知降频关核之类的行为让你做对应的处理。尝试与厂商取得联系看看吧。

我们尝试用__NR_sched_setaffinity系统调用在android手机上绑定线程到指定cpu核心,但是遇到无法绑定成功的现象。经过测试发现,有时候能绑定成功,有时候不行。最后发现,当有cpu核心因为发热等原因被关掉后,就无法绑定成功了。同时,如果一开始绑定成功,之后有cpu核心被系统关掉,之前绑定成功的线程也会全部失效。因此,我们想问一下有没有办法能够稳定的将某些线程绑定到android系统的CPU核心,例如大核,或者小核上?