Подтвердить что ты не робот

Что означает "Сходство по теме"?

Где-то я слышал о Thread Affinity и Thread Affinity Executor. Но я не могу найти правильную ссылку для него, по крайней мере, в java. Может кто-нибудь, пожалуйста, объясните мне, что это такое?

4b9b3361

Ответ 1

Есть два вопроса. Предпочтительно, чтобы потоки имели близость к определенному процессору (ядру), чтобы максимально использовать их локальные кеши процессора. Это должно быть выполнено операционной системой.

В Java есть наблюдение, что в типичных программах объекты являются нито-аффинными, то есть обычно используются только одним потоком большую часть времени. Поэтому задача оптимизатора JVM для обеспечения того, чтобы объекты, привязанные к одному потоку, помещались рядом друг с другом в памяти, чтобы вписаться в один кэш ЦП, но помещали объекты, аффинные к различным потокам, не слишком близко друг к другу, чтобы избежать совместного использования объектов так как в противном случае два процессора/ядра должны синхронизировать их слишком часто.

Идеальная ситуация заключается в том, что ЦП может работать с некоторыми объектами независимо от другого ЦП, работающего с другими объектами, размещенными в неродственной области памяти.

Ответ 2

Позвольте мне объяснить это. С ростом многоядерных процессоров, передачи сообщений между потоками и пулом потоков, планирование стало более дорогостоящим делом. Почему это стало намного тяжелее, чем раньше, потому что нам нужно понять концепцию "механической симпатии". Подробнее см. blog. Но в грубых словах, когда потоки распределяются по разным ядрам процессора, когда они пытаются обмениваться сообщениями; Вероятность кеш-ошибки высокая. Теперь, приходя к вашему конкретному вопросу, сродство потоков может назначать конкретные потоки конкретному процессору/ядру. Вот одна из библиотека для java, которая может быть использована для нее.

Ответ 3

Библиотека Java Thread Affinity версии 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());

Ответ 4

Сходство по нити (или сродство к процессу) описывает, на каком процессоре ядра запускается поток/процесс. Обычно этот параметр равен (логическим) ЦП в вашей системе, и вряд ли есть причина для его изменения, потому что тогда у операционной системы есть лучшие возможности для планирования ваших задач среди доступных процессоров.

См., например, http://msdn.microsoft.com/en-us/library/windows/desktop/ms683213(v=vs.85).aspx, как это работает в Windows. Я не знаю, предлагает ли Java API для их настройки.