引用
Published on 十二月 17, 2009 2,310 在服务器上,我们经常会有多个CPU的情况,而此时如果把进程都绑定在一个CPU上,那么对资源太多浪费了,下面的代码就实现了如何将程序绑定在不同的cpu上。传入参数代表绑定第几个cpu(从0开始计算)
//cpu_test.cpp
#include<stdlib.h>
#include<stdio.h>
#include<sys/types.h>
#include<sys/sysinfo.h>
#include<unistd.h>
//#define __USE_GNU
#include<sched.h>
#include<ctype.h>
#include<string.h>
int main(int argc, char* argv[])
{
int num = sysconf(_SC_NPROCESSORS_CONF);
int created_thread = 0;
int myid;
int i;
int j = 0;
cpu_set_t mask;
cpu_set_t get;
if (argc != 2)
{
printf("usage : ./cpu num\n");
exit(1);
}
myid = atoi(argv[1]);
printf("system has %i processor(s). \n", num);
CPU_ZERO(&mask);
CPU_SET(myid, &mask);
if (sched_setaffinity(0, sizeof(mask), &mask) == -1)
{
printf("warning: could not set CPU affinity, continuing...\n");
}
while (1)
{
usleep(10000);
CPU_ZERO(&get);
if (sched_getaffinity(0, sizeof(get), &get) == -1)
{
printf("warning: cound not get cpu affinity, continuing...\n");
}
for (i = 0; i < num; i++)
{
if (CPU_ISSET(i, &get))
{
printf("this process %d is running processor : %d\n",getpid(), i);
}
}
}
return 0;
}
//g++ cpu_test.cpp -o cpu_test
下载源代码
下面解释一下,里面用到的函数:
首先解释一下一个叫CPU亲和力(CPU Affinity)的概念
CPU亲合力就是指在Linux系统中能够将一个或多个进程绑定到一个或多个处理器上运行.
一个进程的CPU亲合力掩码决定了该进程将在哪个或哪几个CPU上运行.在一个多处理器系统中,设置CPU亲合力的掩码可能会获得更好的性能.
一个CPU的亲合力掩码用一个cpu_set_t结构体来表示一个CPU集合,下面的几个宏分别对这个掩码集进行操作:
CPU_ZERO() 清空一个集合
CPU_SET()与CPU_CLR()分别对将一个给定的CPU号加到一个集合或者从一个集合中去掉.
CPU_ISSET()检查一个CPU号是否在这个集合中.
而下面的函数实现了pid绑定对应CPU的过程:
sched_setaffinity(pid_t pid, unsigned int cpusetsize, cpu_set_t *mask)
该函数设置进程为pid的这个进程,让它运行在mask所设定的CPU上.如果pid的值为0,则表示指定的是当前进程,使当前进程运行在mask所设定的那些CPU上.第二个参数cpusetsize是 mask所指定的数的长度.通常设定为sizeof(cpu_set_t).如果当前pid所指定的CPU此时没有运行在mask所指定的任意一个CPU上,则该指定的进程会从其它CPU上迁移到mask的指定的 一个CPU上运行.
sched_getaffinity(pid_t pid, unsigned int cpusetsize, cpu_set_t *mask)
该函数获得pid所指示的进程的CPU位掩码,并将该掩码返回到mask所指向的结构中.即获得指定pid当前可以运行在哪些CPU上.同样,如果pid的值为0.也表示的是当前进程.
OK,到此为止~~~
转载请注明出处.http://www.vimer.cn
分享到:
相关推荐
特别是在处理密集型计算或者需要高效利用硬件资源的任务时,将特定的线程或进程绑定到特定的CPU核心上,可以有效提升效率,减少上下文切换带来的开销。本项目通过一个Gradle项目展示了如何实现这一功能,并提供了`...
当我们谈论"线程/进程绑定CPU代码"时,我们通常指的是通过编程手段将特定的进程或线程与特定的CPU核心关联,以优化系统性能或解决某些并发问题。 在多核处理器系统中,进程和线程的绑定可以带来以下好处: 1. **...
CPU亲和性设置:进程绑定CPU的两种方式 CPU亲和性设置是指将进程绑定到特定的CPU核心上,以提高应用对CPU的使用效率。进程绑定CPU可以通过两种方式实现:手动命令绑定和代码绑定。 手动命令绑定 手动命令绑定是...
Linux操作系统作为一个支持SMP的多任务操作系统,允许多个进程同时运行在多个CPU上。然而,在SMP系统中,进程的调度机制和Cache命中率的影响也变得非常重要。 首先,SMP系统中的内存子系统是共享的,每个CPU都有一...
本文将深入探讨Linux下的调度器、多核CPU绑定以及`schedule`函数等相关知识点。 一、Linux调度器 Linux调度器的主要目标是公平地分配CPU时间,提高系统整体性能。自Linux 2.6版本以来,其采用了CFS(Completely ...
在Linux操作系统中,为了优化系统性能,特别是在高负载的情况下,我们有时需要手动调整进程的CPU亲和性(CPU affinity),让特定的进程运行在指定的CPU核心上。这样做可以避免频繁的上下文切换,减少不必要的资源...
应用:客户将所有的刷新动作交给主线程完成时,可能拖动鼠标,窗口均在不断的刷新,CPU资源占用率很高,导致整个程序运行速度变慢,这样时候,可以考虑将一些刷新显示的工作绑定到另一颗核中去实现。 linux ...
此外,Linux 2.6.8.1的调度器还考虑了CPU亲和性,允许进程绑定到特定的CPU核心,减少跨核心调度带来的开销。同时,它支持SMP(对称多处理)系统,可以有效地在多个处理器之间分配工作负载。 在上下文切换过程中,...
Cgroup 中的 CPU 资源隔离机制可以将进程绑定到指定的 CPU 核心上运行,从而实现资源隔离的目的。这种机制可以使得不同的进程占用不同的 CPU 核心,从而提高系统的整体性能和资源利用率。 配置 Cgroup 中的 CPU ...
这个源码示例对于学习易语言在Linux环境下的服务器开发以及理解多进程TCP服务器的工作原理非常有帮助。通过分析和实践这个源码,开发者可以掌握如何在Linux环境下使用易语言构建高效、稳定的网络服务。
通过上述代码,我们可以将指定进程绑定到核心0和1上。 #### 3. 性能测试 为了验证线程绑定技术的有效性,本文采用STREAM benchmark来进行性能测试。该benchmark主要用于测试计算机内存带宽和简单数值运算性能,是...
**实现方法**:Linux提供了多种方法来实现进程绑定,其中最常用的是通过命令行工具`taskset`来进行。此外,也可以通过修改内核参数或者编写C语言程序调用`sched_setaffinity()`函数来实现进程的绑定。 #### 三、...
在嵌入式Linux系统中,CPU affinity是一种关键的性能优化技术,它允许我们控制进程或线程在哪个CPU核心上运行。"cpu_rmap.rar_cpu affinity"这个标题暗示了我们正在探讨一个与CPU亲和性相关的逆映射支持,可能是一个...
- **pthread库**: Linux下多线程编程的标准库,包括pthread_create创建线程,pthread_join等待线程结束,pthread_mutex互斥锁等。 - **线程上下文切换**: 线程在CPU上运行时,操作系统会进行线程上下文切换,以...
Linux处理器的亲和性是指应用程序或进程在运行时与特定CPU之间的关联性。在Linux操作系统中,有两种类型的亲和性:软亲和性和硬亲和性。软亲和性允许进程在多个处理器之间自然地迁移,以平衡负载,而硬亲和性则强制...
相较于进程,线程的创建和管理开销更小,且线程间的通信更为直接,这使得多线程成为提升应用程序响应速度和利用多CPU系统优势的有效手段。 Linux多线程编程主要基于POSIX线程接口,即pthread库。在编写多线程程序时...
本文将深入探讨如何在Linux环境下利用多线程和多定时器来实现不同任务的并发执行,以及它们如何协同工作以提高程序效率。 一、Linux多线程 1. **线程定义**:线程是程序执行的最小单位,一个进程可以包含多个线程...
该脚本的主要目的是将指定进程绑定到不同的CPU核心上,以实现负载均衡。其核心逻辑如下: - 获取指定进程的PID列表。 - 计算可用的CPU核心数量。 - 循环遍历进程PID,并使用`taskset`命令将每个进程绑定到不同的CPU...