精华内容
下载资源
问答
  • windows线程绑定cpu核
    2022-01-26 08:46:17

    Windows下绑定线程到指定CPU

    目的

    解决对实时性要求高的信号处理。

    代码

    
    DWORD_PTR SetThreadAffinityMask(
    HANDLE hThread,
    DWORD_PTR dwThreadAffinityMask
    );
    
    参数说明:
    hThread:要限制哪个线程
    dwThreadAffinityMask:要在哪个核心上运行线程
    

    参数说明:
    (1)要知道当前线程的句柄,可以通过函数:GetCurrentThread()得到。
    (2)dwMask为CPU序号的或运算值:1(0001)代表只运行在CPU1,2(0010)代表只运行在CPU2,3(0011)代表可以运行在CPU1和CPU2,以此类推。
    (3)获取CPU个数:

    SYSTEM_INFO SystemInfo;
    GetSystemInfo(&SystemInfo);
    //CPU个数:SystemInfo.dwNumberOfProcessors
    

    CPU亲缘性

    按照默认设置,当系统将线程分配给处理器时,Windows使用软亲缘性来进行操作。这意味着如果所有其他因素相同的话,它将设法在它上次运行的那个处理器上运行线程。让线程留在单个处理器上,有助于重复使用仍然在处理器的内存高速缓存中的数据。
    有一种新的计算机结构,称为NUMA(非统一内存访问),在该结构中,计算机包含若干块插件板,每个插 件板上有4个CPU和它自己的内存区。
    当CPU访问的内存是它自己的插件板上的内存时,NUMA系统运行的性能最好。如果CPU需要访问位于另一个插件板上的内 存时,就会产生巨大的性能降低。在这样的环境中,就需要限制来自一个进程中的线程在共享同一个插件版的CPU上运行。为了适应这种计算机结构的需要,Windows允许你设置进程和线程的亲缘性。换句话说,你可以控制哪个CPU能够运行某些线程。这称为硬亲缘性。请注意,子进程可以继承进程的亲缘性。
    注意:
    (1)无论计算机中实际拥有多少个CPU,Windows98及以前系统只使用一个CPU,上述API不被支持。
    (2)在大多数环境中,改变线程的亲缘性就会影响调度程序有效地在 各个CPU之间移植线程的能力,而这种能力可以最有效地使用CPU时间。

    更多相关内容
  • 而随着CPU技术的快速发展,当前市场上双核甚至多核CPU已成为主流,这使得在Windows平台上用多核CPU的某些独立执行任务,从而有效地提高软件的实时性成为可能。本文介绍一种在Windows内核模式下编写Windows驱动程序...
  • 线程亲和性能够强制使你的应用线程运行在特定的一个或多个cpu上。通过这种方式,可以消除操作系统进行调度造成的线程的频繁的上下文切换。 实现方式: 1、引入依赖 maven: <!-- ...

    如果需要开发低延迟的网络应用,那应该对线程亲和性(Thread affinity)有所了解。线程亲和性能够强制使你的应用线程运行在特定的一个或多个cpu上。通过这种方式,可以消除操作系统进行调度造成的线程的频繁的上下文切换。

    实现方式:

    1、引入依赖

    maven:

    <!-- https://mvnrepository.com/artifact/net.openhft/affinity -->
    <dependency>
        <groupId>net.openhft</groupId>
        <artifactId>affinity</artifactId>
        <version>3.21ea5</version>
    </dependency>
    
    

    gradle:

    // https://mvnrepository.com/artifact/net.openhft/affinity
    implementation group: 'net.openhft', name: 'affinity', version: '3.21ea5'
    
    

    2、测试:

    public class AffinityTests {
    
        @Test
        public void test() {
            try (AffinityLock affinityLock = AffinityLock.acquireLock(2)) {
                while (true) {
                    
                }
            }
    
        }
    }
    

    运行起来会发现第三个核心利用率达到了100%(下标从0开始)
    在这里插入图片描述

    3、线程亲和调度的一些场景

    (1)Nginx亲和性
    例如4核心的CPU,每个核心绑定一个CPU
    worker_processes 4;
    worker_cpu_affinity 0001 0010 0100 1000;
    2核心4线程cpu,将第一个工作进程绑定到cpu0/2,第二个绑定cpu1/3,合有超线程技术的cpu
    worker_processes 2;
    worker_cpu_affinity 0101 1010;
    上面的计算方式是掩码计算,从右往左,绑定哪个核心,此位的值就为1

    (2)netty的eventloop

    final int acceptorThreads = 1;
    final int workerThreads = 10;
    EventLoopGroup acceptorGroup = new NioEventLoopGroup(acceptorThreads);
    ThreadFactory threadFactory = new AffinityThreadFactory("atf_wrk", AffinityStrategies.DIFFERENT_CORE);
    EventLoopGroup workerGroup = new NioEventLoopGroup(workerThreads, threadFactory);
    ServerBootstrap serverBootstrap = new ServerBootstrap().group(acceptorGroup, workerGroup);
    
    展开全文
  • C++多线程,为线程绑定cpu

    千次阅读 2019-06-25 18:40:12
    文章目录1,使用2,函数 ...set_cpu("detector", {0, 1, 2}); 2,函数 void set_cpu(std::string thread_name, std::vector<short> cpu_ids) { int i, cpus = 0; cpu_set_t mask; cpu_set_t get; cpus...

    文章目录

    1,使用

    set_cpu("detector", {0, 1, 2});
    

    2,函数

    void set_cpu(std::string thread_name, std::vector<short> cpu_ids) {
    	int i, cpus = 0;
        cpu_set_t mask;
        cpu_set_t get;
    
        cpus = sysconf(_SC_NPROCESSORS_CONF);
        LOG(WARNING) << thread_name << " has " << cpus << " processor(s)";
        
        CPU_ZERO(&mask);
        for(auto id : cpu_ids) {
            CPU_SET(id, &mask);
        }
    
        /* 设置cpu 亲和性(affinity)*/
        if(pthread_setaffinity_np(pthread_self(), sizeof(mask), &mask) < 0) {
            LOG(ERROR) << thread_name << " set thread affinity faild";
        }
        else {
            LOG(WARNING) << thread_name << " set thread affinity successfully";
        }
        
        /* 查看cpu 亲和性(affinity)*/
        CPU_ZERO(&get);
        if (pthread_getaffinity_np(pthread_self(), sizeof(get), &get) < 0) {
            LOG(ERROR) << thread_name << " get thread affinity failed";
        }   
    
        /* 查看当前线程所运行的所有cpu*/
        for (i = 0; i < cpus; i++) {
            if (CPU_ISSET(i, &get)) {
            	LOG(WARNING) << thread_name << " : " << (int)pthread_self()
                    << " is running in processor " << i; 
            }   
        }   
        sleep(3); //查看
    }
    
    展开全文
  • C\C++实现CPU核绑定固定线程

    千次阅读 2022-03-25 16:10:20
    设置线程亲和性,将线程绑定到指定CPU核 int pthread_setaffinity_np(pthread_t thread, size_t cpusetsize,const cpu_set_t *cpuset); thread:线程id cpusetsize:集合内存大小 cpuset:CPU核的集合 .

     参考文章:Linux中线程与CPU核的绑定_bluenet13的博客-CSDN博客

    long sysconf(int name);

    函数sysconf获取运行时的系统配置信息

    设置线程亲和性,将线程绑定到指定CPU核

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

    thread:线程id

    cpusetsize:集合内存大小

    cpuset:CPU核的集合

    获取指定线程的CPU集合

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

    thread:线程id

    cpusetsize:集合内存大小

    cpuset:CPU核的集合

    对CPU核的集合操作

    void CPU_ZERO (cpu_set_t *set); //初始化,设为空

    void CPU_SET (int cpu, cpu_set_t *set); //将某个cpu加入cpu集中

    void CPU_CLR (int cpu, cpu_set_t *set); //将某个cpu从cpu集中移出

    int CPU_ISSET (int cpu, const cpu_set_t *set); //判断某个cpu是否已在cpu集中设置了

    #define _GNU_SOURCE
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <pthread.h>
    #include <sched.h>
    
    void *myfun(void *arg)
    {
        cpu_set_t mask;
        cpu_set_t get;
        char buf[256];
        int i;
        int j;
        int num = sysconf(_SC_NPROCESSORS_CONF); // 在运行时获取配置信息,获取CPU核个数
        CPU_ZERO(&mask);    // 初始化,设为空
        printf("system has %d processor(s)\n", num);
        for(i = 0; i < num; i++){
            CPU_SET(i, &mask);  // 将某个cpu加入cpu集中 
        }
        // 将线程绑定到cpu集中的各个CPU核,这样做不太好,会导致线程在各CPU核中切换,导致性能下降
        // 本次只为测试
        if (pthread_setaffinity_np(pthread_self(), sizeof(mask), &mask) < 0) {
            fprintf(stderr, "set thread affinity failed\n");
        }
        CPU_ZERO(&get);
        if (pthread_getaffinity_np(pthread_self(), sizeof(get), &get) < 0) {
            fprintf(stderr, "get thread affinity failed\n");
        } 
        for (i = 0; i < num; i++) {
            if (CPU_ISSET(i, &get)) {
                printf("thread %ld is running in processor %d\n", pthread_self(), i);
            }
            j = 0;
            while (j++ < 100000000){
                memset(buf, 0, sizeof(buf));
            }
        }
        pthread_exit(NULL);
    }
    int main(){
        int num = sysconf(_SC_NPROCESSORS_CONF);
        printf("CPU核数:%d \n", num);
        pthread_t tid;
        if (pthread_create(&tid, NULL, myfun, NULL) != 0) {
            fprintf(stderr, "thread create failed\n");
            return -1;
        }
        pthread_join(tid, NULL);
        return 0;
    }

    在终端执行操作:

    [root@chen02 CPUBind]# g++ -o cpu CPU_Bind.cpp -lpthread

    展开全文
  • 2)Intel的自动降频技术和windows的机制冲突:windows有一个功能是平衡负载,可以将一个线程在不同时间分配到不同CPU,从而使得每一个CPU不“过累”。然而,Inter又有一个技术叫做SpeedStep,当一个CPU没有满负荷...
  • $ 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数 $ 查看物理CPU个数 cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l $ 查看每个物理CPU中core的个数(即核数) cat /proc/cpuinfo| grep ...
  • 线程/进程和核绑定CPU亲和性)

    千次阅读 2021-03-01 15:04:13
    文章目录前言一、CPU亲和性1 前言2 为何要手动绑定线程/进程到CPU核3 多进程和多线程在多核CPU上运行:4 应用场景举例二、Linux的CPU亲和性特征1 软亲和性2 硬亲和性3 硬亲和性使用场景三、查看CPU的核1 使用指令2 ...
  • linux下把进程/线程绑定到特定cpu核上运行

    万次阅读 多人点赞 2018-07-08 12:20:05
    概述 现在大家使用的基本上都是多核cpu,一般是4核的。平时应用程序在运行时都是由操作系统管理的。操作系统对应用进程进行调度,使其在...把某个进程/线程绑定到特定的cpu核上后,该进程就会一直在此核上运行,不...
  • 但是对于应用程序或者进程,其性能要求较高时,可能有必要绑定该进程到指定的CPU核来运行,避免调度带来的额外开销。我自己也是因为最近的项目上有需要进程运行在指定的CPU核上的要求,所以了解了一下这项技术,并且...
  • c++11 thread 线程绑定CPU方法

    千次阅读 2020-04-29 18:36:51
    通过编程设置CPU亲和性 (1) taskset 命令行工具让我们控制整个进程的CPU亲和性; (2)在Linux上,我们可以使用pthread特定的pthread_setafftinity_np...通过设置其亲和性将每个线程固定到单个CPU: code: #in...
  • 进程绑定CPU核心以提高性能

    千次阅读 2019-11-22 16:52:06
    在Linux系统中,进程的调度切换是由内核自动完成的,在多核CPU上,进程有可能在不同的CPU核上来回切换执行,这对CPU的缓存不是很有利。为什么呢?看一张 Intel i5 CPU 的缓存简单示意图: 在多核CPU结构中,每...
  • C/C++ 多线程编程/ 绑定CPU

    千次阅读 2020-06-06 22:28:13
    Pthread是由POSIX提出的一套通用的线程库,在linux平台下,它被广泛的支持,而windows平台下,却并不被支持,而pthreads-w32为我们提供了解决方案 多线程编程需要包含头文件 #include <pthread.h> #...
  • 概述 现在大家使用的基本上都是多核cpu,一般是4核的。平时应用程序在运行时都是由操作系统管理的。操作系统对应用进程进行调度,使其在...把某个进程/线程绑定到特定的cpu核上后,该进程就会一直在此核上运行,不...
  • 线程CPU核绑定

    千次阅读 2013-03-13 16:30:44
    最近在对项目进行性能优化,由于在多核平台上,所以了解了些进程、线程绑定cpu核的问题,在这里将所学记录一下。  不管是线程还是进程,都是通过设置亲和性(affinity)来达到目的。对于进程的情况,一般是使用sched...
  • 线程绑定CPU核

    千次阅读 2015-07-27 17:48:04
    Linux系统提供API函数sched_setaffinity和sched_getaffinity用于设置或获取线程的可以使用的CPU核。 int sched_setaffinity(pid_t pid, unsigned int cpusetsize, cpu_set_t *mask); 这个函数中pid表示需要设置或...
  • 现在大家使用的基本上都是多核cpu,一般是4的。平时应用程序在运行时都是由操作系统管理的。操作系统对应用进程进行调度,使其在不同的上轮番运行。 对于普通的应用,操作系统的默认调度机制是没有问题的。但是...
  • 在大数据量的数据图像处理过程中,我们通常需要提升处理效率和性能,意识优化算法,而是充分利用服务器的硬件资源,如CPU和GPU。 平时应用程序在运行时都是由操作系统管理的。操作系统对应用进程进行调度,使其在...
  • #include <thread> //线程 #include <unistd.h> // sysconf #include <sched.h> //sched_setaffinity 绑核 #define _GNU_SOURCE #include <sys/prctl.h>... //总共多少个CPU核 cons
  • 设置线程亲和性,通俗的说法就是将线程绑定cpu上某一个或多个上,此处的是指逻辑核心,非物理核心。 物理核心与逻辑核心的关系,如果开启超线程,一般逻辑核心数=物理核心数*2。 一、SetThreadAffinityMask ...
  • 效果我们现在是看到了,可以说这个项目非常的溜,可以实现把线程绑定到指定核心上去。 该功能也是有实际应用场景的,属于一直非常极致的性能优化手段吧。 绑定核心之后就可以更好的利用缓存以及减少线程的上下文...
  • OpenMP的三种线程核绑定方式

    千次阅读 2020-08-12 06:34:51
    之前看到OpenMP入门教程比较多,但是核绑定这部分比较少。把核绑定的语句先写在这里。 /*omp的三种核绑定方式*/ #pragma omp parallel proc_bind(master) #pragma omp parallel proc_bind(close) #pragma omp ...
  • 多核线程绑定

    2013-03-13 17:09:23
    创建一个线程,并将该线程绑定到多核cpu中,不占用主线程的资源,这样可以在所开的线程中做一些动作,不会影响主线程中的动作。应用:客户将所有的刷新动作交给主线程完成时,可能拖动鼠标,窗口均在不断的刷新,CPU...
  • 关于CPU的核心和线程与进程的不同cpu核心进程和线程之间的区别单线程和多线程CPU的指令集架构 cpu核心 最近的CPU,一个CPU插座有多个核心(实际进行处理的零部件)。 例如,在名为Intel Xeon E5-2643V4的CPU中,核心数...
  • 目录一:taskset概述二:安装taskset工具2.1taskset语法2.2taskset用法2.2.1指定PID为8528的进程在CPU1上运行2.2.2更改具体某一进程(或 线程CPU...但我观察发现,Linode服务器的4核CPU,只有第1个核心(CPU#0)非
  • 【进程线程绑定CPU】总结

    千次阅读 2014-06-03 09:37:14
    为了解决这个问题,我们想办法将线程绑定到另一颗CPU上,实现方法如下。   首先用API函数创建一个线程, HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD SIZE_T ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 34,515
精华内容 13,806
关键字:

windows线程绑定cpu核