【问题标题】:running a process on a particular core of a processor [duplicate]在处理器的特定核心上运行进程[重复]
【发布时间】:2012-08-25 04:50:40
【问题描述】:

可能重复:
CPU Affinity

在运行 Linux (fc12) 的 x86 机器上,我可以创建一个进程在多处理器系统的特定内核上运行吗?我知道有一个函数sched_setaffinity 可以帮助选择处理器,但我想在处理器的特定内核上执行该进程。

【问题讨论】:

  • 很好奇,这是什么用例?
  • @anio 我认为 sched_setaffinity 用于设置处理器的亲和力,我想设置内核的亲和力
  • “我想使用所有内核以获得更好的性能”——你很可能会得到相反的结果。除非您确切知道自己在做什么,否则不要篡改处理器关联性。最好不要碰它们(唯一允许的例外是在 NUMA 系统上运行多个重量级进程)。操作系统本身将使用多个内核,并且对可以使用哪些内核没有硬性限制,从而总体上提供了更好的资源利用率(如果您担心的话,有一些机制可以防止线程在 CPU 之间无意义地跳动)。
  • @ankur 内核被视为处理器。
  • @taz:我是说在 CPU 空闲时执行代码而不是不执行它更快,更好(很明显)。唯一的问题是缓存不会很热。但是,如果每秒不发生十亿次,这不是问题。例如,默认情况下,Linux 永远不会在 0.5 微秒之后迁移线程,这大约是一百万条左右的指令。这使得缓存效果的影响可以忽略不计,但同时允许线程及时运行,否则它可能不得不等待几毫秒。

标签: linux operating-system multiprocessing


【解决方案1】:

AFAIK 你无法区分 CPU 内核和 CPU。就 Linux 而言,核心是成熟的 CPU。例如,如果您有 2 个 CPU,每个 CPU 有 2 个内核,Linux 会认为您有 4 个 CPU。

【讨论】:

    【解决方案2】:

    不确定这是否是您需要的,我使用此代码使线程在特定内核上运行。 使用 -pthread 编译和链接。

    #include "pthread.h"
    #include "sched.h"
    
    int affinity = 3; //core id
    pthread_t mythread;
    mythread = pthread_self();
    cpu_set_t cpuset;
    CPU_ZERO(&cpuset);
    CPU_SET(affinity, &cpuset); //lets kernel know only core affinity may run this thread
    if (pthread_setaffinity_np(mythread, sizeof(cpu_set_t), &cpuset) <0){
        perror("sched_set_affinity");
    }
    

    【讨论】:

    • pthread_setaffinity_np 设置线程的 cpu(而不是核心)亲和力。一个 cpu 可能有多个核心
    猜你喜欢
    • 2019-09-29
    • 2011-03-22
    • 1970-01-01
    • 2020-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-30
    • 2013-10-09
    相关资源
    最近更新 更多