Thread Affinity是什么意思?

Hos*_*ein 44 java concurrency multithreading

在某处我听说过Thread Affinity和Thread Affinity Executor.但至少在java中我无法找到适当的参考.有人可以向我解释这是什么一回事吗?

Hol*_*ger 49

有两个问题.线程最好与某个CPU(核心)具有亲缘关系,以充分利用其CPU本地缓存.这必须由操作系统处理.

在Java中,观察到在典型的程序中,对象是线程仿射的,即通常在大多数时间仅由一个线程使用.因此,JVM优化器的任务是确保将一个线程所关联的对象放在内存中以便放在一个CPU的缓存中,但是将对象关联到不同的线程,这些线程彼此不太靠近,以避免它们共享一个高速缓存行,否则两个CPU /核心必须经常同步它们.

理想的情况是,CPU可以独立地处理某些对象,而另一个CPU处理放置在不相关的内存区域中的其他对象.


Pra*_*eek 9

让我试着解释一下.随着多核处理器的兴起,线程与线程池之间的消息传递,调度变得更加昂贵.为什么这比以前变得更重,因为我们需要理解"机械同情"的概念.有关详细信息,您可以浏览一个博客.但粗略地说,当线程分布在处理器的不同核心时,当它们尝试交换消息时; 缓存未命中概率很高.现在讨论您的具体问题,线程关联能够将特定线程分配给特定处理器/核心.这是可以用于它的java 之一.

  • 不知道为什么有人拒绝投票给这个答案.被投票的人应该提到这个答案有什么问题.我挑战它没有任何问题.这很好. (7认同)

Imr*_*ran 5

Java线程亲和1.4版本库试图获得两全其美,通过允许您保留一个逻辑线程的关键线程,并保留完整的内核在大多数性能敏感的线程.不太重要的线程仍将运行超线程的优势.例如,下面的代码片段

AffinityLock al = AffinityLock.acquireLock();
    try {
        // find a cpu on a different socket, otherwise a different core.
        AffinityLock readerLock = al.acquireLock(DIFFERENT_SOCKET, DIFFERENT_CORE);
        new Thread(new SleepRunnable(readerLock, false), "reader").start();

        // find a cpu on the same core, or the same socket, or any free cpu.
        AffinityLock writerLock = readerLock.acquireLock(SAME_CORE, SAME_SOCKET, ANY);
        new Thread(new SleepRunnable(writerLock, false), "writer").start();

        Thread.sleep(200);
    } finally {
        al.release();
    }

    // allocate a whole core to the engine so it doesn't have to compete for resources.
    al = AffinityLock.acquireCore(false);
    new Thread(new SleepRunnable(al, true), "engine").start();

    Thread.sleep(200);
    System.out.println("\nThe assignment of CPUs is\n" + AffinityLock.dumpLocks());
Run Code Online (Sandbox Code Playgroud)