码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Qt 设置CPU亲缘性,把进程和线程绑定到CPU核心上(Linux)


    头图

    Qt 设置CPU亲缘性,把进程和线程绑定到CPU核心上(Linux)

    文章目录

    • Qt 设置CPU亲缘性,把进程和线程绑定到CPU核心上(Linux)
      • 摘要
      • 1 什么是CPU亲缘性
      • 2 目的
      • 3 API 介绍
        • 3.1 进程绑定到CPU
        • 3.2 线程绑定到CPU
      • 4 实际操作
        • 4.1 实操代码
          • 主进程
          • 串口线程
          • USB线程
        • 程序运行资源管理器截图
          • 虚拟机测试
          • 板子测试

    关键字: CPU、 Qt、 Linux、 线程、 进程

    内容背景:

    最近项目终于切到Linux下开发了,所以最近的记录都是发生在Debian 10 以及Arm Debain 10 下,Qt版本5.12.3。这几天真是问题多多,收获满满,不过目前阶段仅仅停留在解决问题,至于原理性的东西,还得慢慢消化。最近好多问题都是直接群里问大神,感谢各位大神助我成长。

    摘要

    哎呀,说多了都是泪,一直以为Arm Linux 天下无敌,谁知道性能还是没法和PC比,不过也是,毕竟功耗在那摆着呢。这不,最近遇到了一个问题,就是使用QCustomPlot绘制曲线的时候,在一屏200个点的时候没有问题,但是当我绘制 8K×5×2个点的时候,就卡的要死要死的,虽然加入了线程,但是还是未解决,所以就想到了这个,设置CPU亲缘性,但是每个平台的设置方式还不一样,所以今天的这个是在Linux下的,具体是在Debian 10 Qt 5.12.3 下测试。

    1 什么是CPU亲缘性

    这里我也就只能是现学现卖;

    亲缘性的作用就是把线程or进程与CPU做黏合,也就是说,做了亲缘性的线程或进程,只会在这一个CPU核上运行,只在这一个CPU核上被调度,且不会切换到其他的CPU核上运行。这就是亲缘性。

    以上引用来之:https://blog.csdn.net/qq_42956653/article/details/126160543

    2 目的

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

    以上应用来之:https://blog.csdn.net/tbadolph/article/details/101363120?spm=1001.2014.3001.5506

    3 API 介绍

    本节一下内容来之:https://blog.csdn.net/tbadolph/article/details/101363120?spm=1001.2014.3001.5506

    3.1 进程绑定到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);
    
    • 1
    • 2
    • 3
    • 4
    • 5

    参数

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    3.2 线程绑定到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);
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    该接口与进程绑定到CPU的接口的使用方法基本一致。当进程绑定到特定的CPU之后,线程还是可以绑定到其他的CPU的,没有冲突。

    4 实际操作

    在我的项目里面,暂时有主进程,串口数据处理线程和USB数据处理线程,如下图所示,我将主进程绑定到了CPU:0上,将串口线程绑定到了CPU:1上,将USB数据处理线程绑定到了 CPU:2 上。

    image-20220907144743221

    4.1 实操代码

    主进程
        cpu_set_t mask;
        CPU_ZERO(&mask);
        CPU_SET(0,&mask);
        if(sched_setaffinity(0,sizeof(cpu_set_t),&mask) < 0)
            qDebug() << "False:" << "sched_setaffinity(0,sizeof(cpu_set_t),&mask)";
    
    • 1
    • 2
    • 3
    • 4
    • 5
    串口线程
        cpu_set_t mask;
        CPU_ZERO(&mask);
        CPU_SET(1,&mask);
        if(pthread_setaffinity_np(pthread_self(), sizeof(mask), &mask) < 0)
            qDebug() << "False:" << "pthread_setaffinity_np(pthread_self(), sizeof(mask), &mask)" << LOGINFOR;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    USB线程
            cpu_set_t mask;
            CPU_ZERO(&mask);
            CPU_SET(2,&mask);
           if(pthread_setaffinity_np(pthread_self(), sizeof(mask), &mask) < 0)
               qDebug() << "False:" << "pthread_setaffinity_np(pthread_self(), sizeof(mask), &mask)" << LOGINFOR;
    
    • 1
    • 2
    • 3
    • 4
    • 5

    程序运行资源管理器截图

    虚拟机测试

    可以看到两个明显的处理,每次都是运行在CPU 1 和 3 上,因为串口没有接,所以低一点,淹没在下面的曲线里面了

    image-20220908082454673

    板子测试

    这里我还没有找到那个对应那个,也不知道程工没有。

    image-20220908083204023


    博客签名2021
  • 相关阅读:
    【优雅的参数验证@Validated】@Validated参数校验的使用及注解详解——你还在用if做条件验证?
    32.同步FIFO-IP核的调用
    【Docker】docker部署springboot+vue+mysql+nginx前后端分离项目【部署实战篇】
    【python】python内置函数——eval()/exec()执行一个字符串形式的python表达式
    常见的中间件都在解决什么问题?
    电子商务盛行,怎么提高商店转换率?
    Linux 三剑客之AWK
    【MindSpore易点通】数据处理之中文文本数据预处理
    [ATC复盘] abc329 20231118
    多叉树组合运算(未完待续)
  • 原文地址:https://blog.csdn.net/z609932088/article/details/127928892
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号