pid_t tid; cpu_set_t set; tid = gettid(); CPU_ZERO( &set ); CPU_SET( 1, &set ); sched_setaffinity( tid, sizeof(cpu_set_t), &set );
查看线程运行在那个CPU上: a . 执行top -H, 显示所有线程信息 b. 按f键进入菜单向,使用方向键移动到“ P = Last Used Cpu”,用空格键选中 c. 按q键回到上级菜单显示如下,多了一列P, PID USER PR NI VIRT RES %CPU %MEM TIME+ P S COMMAND 1 root 20 0 2.3m 0.7m 0.0 0.3 0:04.65 0 S init 92 root 20 0 1.8m 0.6m 0.0 0.2 0:00.01 1 S `- pvalue_valid+
2. 设置线程调度策略和优先级 pthread_attr_t attr; int policy, inher; struct sched_param param; pthread_attr_init(&attr); // policy = SCHED_FIFO; policy = SCHED_RR; ret = pthread_attr_setschedpolicy(&attr, policy); if (ret != 0) printf(" pthread_attr_setschedpolicy/n%s/n", strerror(ret)); param.sched_priority = 99; ret = pthread_attr_setschedparam(&attr, ¶m); if (ret != 0) printf(" pthread_attr_setschedparam/n%s/n", strerror(ret));
pthread_attr_setinheritsched(&attr,PTHREAD_EXPLICIT_SCHED); //设置线程调度策略时,必须设置此参数,否则会继承父进程的属性。 ret = pthread_create(&thread_la, &attr, threadTEST, NULL);
查看线程调度策略和优先级,可以用命令chrt chrt -p pid 设置为实时调度,优先级99,执行命令 chrt -r -p 99 pid
3. 补充,另外 PC(Ubuntu)机上有个taskset命令 (默认已安装),可以设置程序运行在那个cpu上,但要隔离CPU,设置比较麻烦。大家可以设置程序运行在那个CPU上。 例: 程序启动时 taskset -c 0,5,7,9-11 ./app app启动后可以在0,5,7,9,10,11号cpu上运行; cpuid是从0 开始计数,cpuid可以10进制,也可以16进制0x00EA1, 1位代表一个cpu,最低位为cpu0
例:程序运行后 taskset -cp 0 11111 设置进程号为 11111的进程在 cpu 0上运行。
查看使用上面的提到的TOP命令。
4 可以使用Cgroup,配置比较复杂,可以查一下资料,这里指示做简单的介绍。
Cgroup(control group)是将任意进程进行分组化管理的Linux内核功能。Cgroup本身是提供将进程进行分组化管理的功能和接口的基础结构,I/O或内存的分配控制等具体的资源管理功能是通过这个功能来实现的。这些具体的资源管理功能称为Cgroup子系统或控制器。
Cgroup子系统有控制内存的Memory控制器、控制进程调度的CPU控制器等。运行中的内核可以使用的Cgroup子系统由/proc/cgroup来确认。
Cgroup提供了一个cgroup虚拟文件系统,作为进行分组管理和各子系统设置的用户接口。要使用Cgroup,必须挂载cgroup文件系统。这时通过挂载选项指定使用哪个子系统。