欢迎来到IDC91站长网!
解决服务器各种技术问题,加微信uecomzsr

Linux

当前位置: IDC91 > 服务器教程 > Linux

Linux下进程的CPU配置与线程绑定过程

时间:2025-10-28 22:00:51|栏目:Linux|点击:

1.1 对CPU亲和力的配置

对于CentOS 8下的Linux系统,首先可以使用top命令来查看当前的CPU占用率,如下图所示:

键盘上按数字1,可以以数据化的形式看到具体的使用情况,如下图:

键盘上按字母t,可以以图形化的形式看到具体的使用情况,如下图:

可以看到,当前的CPU基本是空闲的状态。

这时候,我们写一个测试代码,让其挂在后台运行,例如下面的一个死循环函数:

#include 

int main()
{
    while (true) {
        // 在这里编写你的代码
        // 例如,输出一条信息
        std::cout << "Hello, I am running in an infinite loop!" << std::endl;
    }

    return 0;
}

让其挂在后台运行着,暂时不管。

如下图:

此时,我们再次使用top命令,来查看当前的CPU 状态,如下图:

可以看到,此时循环代码这个进程正在后台不停运行,此时的CPU占用率相比开始,非常的高。

记住当前的进程PID,然后使用taskset -c -p 13265 命令查看当前进程的CPU亲和力。13265是当前进程的PID。

可以从输出的信息看出,pid 为13265的进程(即当前的测试进程)的亲和力CPU为0-3,即它同时运行在了0,1,2,3这四个CPU上面。

现在我们更改pid 为13265的进程(即当前的测试进程)的亲和力,将其改成只在0,1这两个CPU上面运行。如下图:

这里由于我使用了ctrl + c暂停了刚才的进程,然后重新启动该进程时,进程的PID变成了13495,不过这没有任何影响。可以看到,当前的进程新的亲和力列表为0,1,说明设置新的CPU亲和力成功。而pid 13495 的当前亲和力掩码为3,同样能说明亲和力设置成功。使用taskset命令来查看进程运行在哪个CPU上。

使用以下命令:

taskset -p < PID >

【请将< PID >替换为你要查看的进程的实际PID。】

该命令将显示进程的当前亲和力掩码,其中每个位表示一个CPU核心。例如,如果输出为pid 's current affinity mask: 3,表示进程当前在CPU核心0和1上运行,因为二进制表示为11。

再次实验一下,这次我们将CPU亲和力设置在CPU 1,CPU2上,如下图:

由当前亲和力掩码可以看到,为6,说明此时运行在CPU1和CPU2上。(2^1 + 2^2 = 6)

1.2 绑定进程到指定CPU核上运行

查看CPU有几个核

使用 cat /proc/cpuinfo 查看CPU信息,如下两个信息:

  • ·processor:指明第几个cpu处理器
  • ·cpu cores:指明每个处理器的核心数

以本机中虚拟机为例,有4个CPU(分别为:CPU0, CPU1, CPU2, CPU3),每个CPU有1个核。

也可以使用系统调用sysconf获取CPU核心数:

#include 

int sysconf(_SC_NPROCESSORS_CONF);/* 返回系统可以使用的核数,但是其值会包括系统中禁用的核的数目,因 此该值并不代表当前系统中可用的核数 */
int sysconf(_SC_NPROCESSORS_ONLN);/* 返回值真正的代表了系统当前可用的核数 */

/* 以下两个函数与上述类似 */
#include 

int get_nprocs_conf (void);/* 可用核数 */
int get_nprocs (void);/* 真正的反映了当前可用核数 */

使用 taskset 指令

  • 获取进程pid:

  • 查看进程当前运行在哪个CPU上:

显示的十六进制f转换为二进制为最低四个是1,每个1对应一个CPU,所以进程运行在4个CPU上。

  • 指定进程10770运行在CPU0上:

注意,CPU的标号是从0开始的,所以cpu0表示第1个CPU(第一个CPU的标号是0)。

至此,就把应用程序绑定到了CPU0上运行,查看如下:

  • 启动程序时绑定CPU:

例如启动时绑定到第二个CPU上,即CPU1:

使用sched_setaffinity系统调用

通过系统调用sched_setaffinity进行绑定,通过sched_getaffinity获取绑定关系。注意这对方法是进程级别的绑定。代码中指定cpu0和cpu3,我们可以通过top查看,两个CPU使用达到了100%,其他的CPU均不会(正常场景)。

sched_setaffinity可以将某个进程绑定到一个特定的CPU。
#define _GNU_SOURCE             /* See feature_test_macros(7) */
#include 

/* 设置进程号为pid的进程运行在mask所设定的CPU上
 * 第二个参数cpusetsize是mask所指定的数的长度
 * 通常设定为sizeof(cpu_set_t)

 * 如果pid的值为0,则表示指定的是当前进程 
 */
int sched_setaffinity(pid_t pid, size_t cpusetsize, cpu_set_t *mask);

int sched_getaffinity(pid_t pid, size_t cpusetsize, cpu_set_t *mask);/* 获得pid所指示的进程的CPU位掩码,并将该掩码返回到mask所指向的结构中 */

代码示例:

/*

*该程序演示了如何使用sched_setaffinity函数将线程绑定到特定的CPU核心上运行。
*程序首先创建了两个线程,然后使用sched_setaffinity函数将线程1绑定到CPU 0上,将线程2绑定到CPU 3上。
*运行时,可以通过查看输出的pid来确定程序的进程ID。
*然后,程序将CPU_ZERO宏应用于一个cpu_set_t类型的变量mask,以将其初始化为空集。
*接下来,程序将CPU_SET宏应用于mask,将CPU 0和CPU 3添加到集合中。
*最后,程序调用sched_setaffinity函数将mask应用于当前进程,将线程1绑定到CPU 0上,将线程2绑定到CPU 3上。
*线程创建成功后,程序使用pthread_join函数等待线程1和线程2的结束。
*/
#define _GNU_SOURCE             /* See feature_test_macros(7) */
#include 
#include 
#include 
#include 
#include 
 
void* testfunc(void* t) {
  while(1);
  return NULL; 
}
 
int main()
{
  cpu_set_t mask; // 定义cpu_set_t类型的变量mask,用于存储CPU集合
  printf("pid=%dn", getpid()); // 打印进程ID
  CPU_ZERO(&mask); // 将mask初始化为空集
  CPU_SET(0, &mask);//将cpu0绑定到mask中
  CPU_SET(3, &mask);//将cpu3绑定到mask中

  // 将mask应用于当前进程,绑定线程到指定的CPU核心
  sched_setaffinity(0, sizeof(cpu_set_t), &mask) ;
  
  pthread_t tid1;//创建线程1
  if (pthread_create(&tid1, NULL, (void *)testfunc, NULL) != 0) 
  {      
    fprintf(stderr, "thread create failedn"); // 线程创建失败,打印错误信息
    return -1;   
  }
  pthread_t tid2;//创建线程2
  if (pthread_create(&tid2, NULL, (void *)testfunc, NULL) != 0) 
  {      
    fprintf(stderr, "thread create failedn"); // 线程创建失败,打印错误信息
    return -1;   
  } 
  pthread_join(tid1, NULL); // 等待线程1结束
  pthread_join(tid1, NULL); // 等待线程2结束
  return 0;
}

执行结果如下图所示:

  • 执行前:

  • 执行后:

上一篇:Linux进程CPU绑定优化与实践过程

栏    目:Linux

下一篇:Linux线程之线程的创建、属性、回收、退出、取消方式

本文标题:Linux下进程的CPU配置与线程绑定过程

本文地址:https://www.idc91.com/fuwuqizl/5160.html

广告投放 | 联系我们 | 免责申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

Copyright © 2025 IDC91.COM 版权所有晋ICP备17006296号