设为首页 加入收藏

TOP

Linux进程或线程绑定到CPU(一)
2015-07-16 12:57:03 来源: 作者: 【 】 浏览:24
Tags:Linux 进程 线程 绑定 CPU

为了让程序拥有更好的性能,有时候需要将进程或线程绑定到特定的CPU,这样可以减少调度的开销和保护关键进程或线程。


进程绑定到CPU


Linux提供一个接口,可以将进程绑定到特定的CPU:


#include


int sched_setaffinity(pid_t pid, size_t cpusetsize, const cpu_set_t *mask);


int sched_getaffinity(pid_t pid, size_t cpusetsize, cpu_set_t *mask);


参数


pid:进程的id号,如果pid为0,则表示本进程


cpusetsize:mask的大小


mask:运行进程的CPU,可以通过以下函数操作mask


#define CPU_SET(cpu, cpusetp) //设置cpu


#define CPU_CLR(cpu, cpusetp) //删除cpu


#define CPU_ISSET(cpu, cpusetp) //判断cpu


#define CPU_ZERO(cpusetp) //初始化为0


示例代码?


#include
#include
#include
#include
?
void WasteTime()
{
? ? int abc = 10000000;
? ? while(abc--)
? ? {
? ? ? ? int tmp = 10000*10000;
? ? }
? ? sleep(1);


}


int main(int argc, char **argv)
{
? ? cpu_set_t mask;
? ? while(1)
? ? {
?
? ? ? ? CPU_ZERO(&mask);
? ? ? ? CPU_SET(0, &mask);
? ? ? ? if (sched_setaffinity(0, sizeof(mask), &mask) < 0) {
? ? ? ? ? ? perror("sched_setaffinity");
? ? ? ? }
? ? ? ? WasteTime();
?
? ? ? ? CPU_ZERO(&mask);
? ? ? ? CPU_SET(1, &mask);
? ? ? ? if (sched_setaffinity(0, sizeof(mask), &mask) < 0) {
? ? ? ? ? ? perror("sched_setaffinity");
? ? ? ? }
? ? ? ? WasteTime();
? ?
? ? ? ? CPU_ZERO(&mask);
? ? ? ? CPU_SET(2, &mask);
? ? ? ? if (sched_setaffinity(0, sizeof(mask), &mask) < 0) {
? ? ? ? ? ? perror("sched_setaffinity");
? ? ? ? }
? ? ? ? WasteTime();
? ?
? ? ? ? CPU_ZERO(&mask);
? ? ? ? CPU_SET(3, &mask);
? ? ? ? if (sched_setaffinity(0, sizeof(mask), &mask) < 0) {
? ? ? ? ? ? perror("sched_setaffinity");
? ? ? ? }
? ? ? ? WasteTime();
? ? }
}


?


?


测试


编译之后运行程序,输入命令top -p 进程id,输入f,输入j,输入回车,可以看到进程在cpu0123之间不停切换。



线程绑定到CPU


不仅仅进程可以绑定到CPU,线程也可以。Linux提供一个接口,可以将线程绑定到特定的CPU:


#include


int pthread_setaffinity_np(pthread_t thread, size_t cpusetsize, const cpu_set_t *cpuset);


int pthread_getaffinity_np(pthread_t thread, size_t cpusetsize, cpu_set_t *cpuset);


该接口与进程绑定到CPU的接口的使用方法基本一致。


当进程绑定到特定的CPU之后,线程还是可以绑定到其他的CPU的,没有冲突。


示例代码


?


#include
#include
#include
#include
#include


void WasteTime()
{
? ? int abc = 10000000;
? ? while(abc--)
? ? {
? ? ? ? int tmp = 10000*10000;
? ? }
? ? sleep(1);


}


void *thread_func(void *param)
{
? ? cpu_set_t mask;
? ? while(1)
? ? {
? ? ? ? CPU_ZERO(&mask);
? ? ? ? CPU_SET(1, &mask);


? ? ? ? if (pthread_setaffinity_np(pthread_self(), sizeof(mask),
? ? ? ? ? ? &mask) < 0) {
? ? ? ? ? ? perror("pthread_setaffinity_np");
? ? ? ? }
?
? ? ? ? WasteTime();


? ? ? ? CPU_ZERO(&mask);
? ? ? ? CPU_SET(2, &mask);
? ? ? ? if (pthread_setaffinity_np(pthread_self(), sizeof(mask),
? ? ? ? ? ? &mask) < 0) {
? ? ? ? ? ? perror("pthread_setaffinity_np");
? ? ? ? }


? ? ? ? WasteTime();
? ? }
}
?
void *thread_func1(void *param)
{
? ? cpu_set_t mask;
? ? while(1)
? ? {
? ? ? ? CPU_ZERO(&mask);
? ? ? ? CPU_SET(3, &mask);


? ? ? ? if (pthread_setaffinity_np(pthread_self(), sizeof(mask),
? ? ? ? ? ? &mask) < 0) {
? ? ? ? ? ? perror("pthread_setaffinity_np");
? ? ? ? }
?
? ? ? ? WasteTime();


? ? ? ? CPU_ZERO(&mask);
? ? ? ? CPU_SET(4, &mask);
? ? ? ? if (pthread_setaffinity_np(pthread_self(), sizeof(mask),
? ? ? ? ? ? &mask) < 0) {
? ? ? ? ? ? perror("pthread_setaffinity_np");
? ? ? ? }


? ? ? ? WasteTime();
? ? }
}
?
int main(int argc, char *argv[])
{
? ? cpu_set_t mask;
? ? CPU_ZERO(&mask);
? ? CPU_SET(0, &mask);
? ? if (sched_setaffinity(0, sizeof(mask), &mask) < 0) {
? ? ? ? perror("sched_setaffinity");
? ? }


? ? pthread_t my_thread;
?
? ? if (pthread_create(&my_thread, NULL, thread_func,
? ? ? ? NULL) != 0) {
? ? ? ? perror("pthread_create");
? ? }
? ? if (pthread_create(&my_thread, NULL, thread_func1,
? ? ? ? NULL) != 0) {
? ? ? ? perror("pthread_create");
? ? }
? ? while(1) { WasteTime(); }
? ? pthread_exit(NULL);


}
?


测试


编译运行之后,输入命令top -p 进程id,输入f,输入j,输入回车,输入H,可以看到主线程一直保持在cpu0,一个线程在cpu12之前切换,另一个线程在cpu34之间切换。



首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C#的未来:追踪空引用 下一篇C++ string到底是什么?

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: