Где-то я слышал о Thread Affinity и Thread Affinity Executor. Но я не могу найти правильную ссылку для него, по крайней мере, в java. Может кто-нибудь, пожалуйста, объясните мне, что это такое?
Что означает "Сходство по теме"?
Ответ 1
Есть два вопроса. Предпочтительно, чтобы потоки имели близость к определенному процессору (ядру), чтобы максимально использовать их локальные кеши процессора. Это должно быть выполнено операционной системой.
В Java есть наблюдение, что в типичных программах объекты являются нито-аффинными, то есть обычно используются только одним потоком большую часть времени. Поэтому задача оптимизатора JVM для обеспечения того, чтобы объекты, привязанные к одному потоку, помещались рядом друг с другом в памяти, чтобы вписаться в один кэш ЦП, но помещали объекты, аффинные к различным потокам, не слишком близко друг к другу, чтобы избежать совместного использования объектов так как в противном случае два процессора/ядра должны синхронизировать их слишком часто.
Идеальная ситуация заключается в том, что ЦП может работать с некоторыми объектами независимо от другого ЦП, работающего с другими объектами, размещенными в неродственной области памяти.
Ответ 2
Позвольте мне объяснить это. С ростом многоядерных процессоров, передачи сообщений между потоками и пулом потоков, планирование стало более дорогостоящим делом. Почему это стало намного тяжелее, чем раньше, потому что нам нужно понять концепцию "механической симпатии". Подробнее см. blog. Но в грубых словах, когда потоки распределяются по разным ядрам процессора, когда они пытаются обмениваться сообщениями; Вероятность кеш-ошибки высокая. Теперь, приходя к вашему конкретному вопросу, сродство потоков может назначать конкретные потоки конкретному процессору/ядру. Вот одна из библиотека для java, которая может быть использована для нее.
Ответ 3
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 для их настройки.