在线阅读小说网站怎么建设,那个网站可以做图标,惠州 家具 网站上线,滁州网站开发公司有时候为了降低App算力占用#xff0c;会把关键的线程绑定到大核中#xff0c;下面介绍一种绑核的方式
查看绑核 查看pid :/ # ps -A | grep test
u0_a15 25178 405 15950272 176544 do_epoll_wait 0 S com.test.jnites查看线程号 top -H -p 25178
25224 u0_…有时候为了降低App算力占用会把关键的线程绑定到大核中下面介绍一种绑核的方式
查看绑核 查看pid :/ # ps -A | grep test
u0_a15 25178 405 15950272 176544 do_epoll_wait 0 S com.test.jnites查看线程号 top -H -p 25178
25224 u0_a15 20 0 15G 172M 82M R 83.3 1.6 4:17.53 JNI_Test com.test.jnitest
25229 u0_a15 10 -10 15G 172M 82M S 0.0 1.6 0:00.00 AdrenoOsLib com.test.jnitest
25221 u0_a15 10 -10 15G 172M 82M S 0.0 1.6 0:00.03 RenderThread com.test.jnitest可以获取到JNI_Test线程号25224 查看绑核情况 :/ # taskset -p 30692
pid 30692s current affinity mask: ff结果显示为 FF则表示当前进程已绑定到所有的可用核心。这是因为在 taskset 命令中每个核心使用一个位来表示1 表示该核心被绑定0 表示未被绑定。因此FF 的二进制表示为 11111111表示所有的核心都被绑定。
绑核
通过 Java 代码调用 sched_setaffinity 函数来实现线程或进程的核心绑定。需要注意的是在 Java 中并没有直接暴露 sched_setaffinity 函数需要使用 JNIJava Native Interface来调用 C/C 代码中的相应函数。 以下是一个简单的示例展示了如何使用 JNI 和 sched_setaffinity 函数来将当前线程与指定的 CPU 核心绑定。首先在 C/C 代码中实现核心绑定函数然后在 Java 代码中调用该函数 JAVA class TestLib {companion object{init {System.loadLibrary(jnitest)}}external fun setAffinity(core_id: Int): Int}C #include jni.h#include string#include thread#include sched.h#include unistd.hextern CJNIEXPORT jint JNICALLJava_com_test_jnitest_TestLib_setAffinity(JNIEnv *env, jobject thiz, jint core_id) {cpu_set_t cpuset;CPU_ZERO(cpuset);CPU_SET(core_id, cpuset);pid_t pid getpid();if (sched_setaffinity(pid, sizeof(cpu_set_t), cpuset) -1) {return -1; // 设置失败}return 0; // 设置成功}测试调用 var testThread Thread{var ret testLib.setAffinity(3)Log.i(TAG,ret ${ret})while (true){}}testThread.name JNI_TesttestThread.start()运行后查看 :/ # taskset -p 8599pid 8599s current affinity mask: 8发现主线程绑定到了第三个核上8是0000 1000如果要是绑定子线程的话需要修改sched_setaffinity第一个参数改为0再运行后 :/ # ps -A | grep testu0_a15 10010 405 15939516 143716 do_epoll_wait 0 S com.test.jnitest:/ # taskset -p 10010pid 10010s current affinity mask: ff:/ # taskset -p 10040pid 10040s current affinity mask: 8子线程成功绑定到了第三个核