При запуске потока или процесса в .NET или Java есть ли способ выбрать, на каком процессоре или ядре он запускается? Как в таких случаях работает модель общей памяти?





Если вы используете несколько потоков, операционная система автоматически позаботится об использовании нескольких ядер.
Операционная система заботится о многопоточности, когда виртуальная машина использует собственные потоки (в отличие от зеленых потоков), и вы не можете указать детали низкого уровня, такие как выбор процессора для определенного потока. Так лучше, потому что обычно у вас гораздо больше потоков, чем доступно процессоров, поэтому операционной системе необходимо выполнять квантование времени, чтобы дать всем потокам возможность работать.
При этом вы можете установить приоритеты потоков, если у вас есть критическая задача, и API потоковой передачи обычно предоставляет такую возможность. См. Пример Java API: http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Thread.html#setPriority(int)
PS: что-то сломалось в движке синтаксического анализа ... Мне пришлось добавить приведенную выше ссылку в виде простого текста
is there a way to choose which processor or core it is launched on?
Вы можете использовать диспетчер задач, чтобы сообщить Windows, на каком процессоре (-ах) ваша программа должна работать. Обычно это полезно только для устранения неполадок устаревших программ, в которых нарушена реализация многопоточности. Сделать это,
Processes.Set Affinity....Если я правильно помню, окна будут `` запоминать '' эти настройки для последующих запусков вашего процесса, но, пожалуйста, не цитируйте меня по этому поводу - запустите несколько тестов самостоятельно :-)
Вы также можете сделать это программно в .NET после того, как ваша программа была запущена с использованием свойства System.Diagnostics.Process.ProcessorAffinity, но я не думаю, что он будет `` запоминать '' настройки, поэтому всегда будет короткий период, в течение которого ваше приложение запускается в зависимости от того, что Процессор windows считает нужным. Я не знаю, как это сделать в Java, извините.
Примечание:
Это применимо на уровне всего процесса. Если вы установите привязку только для CPU0, а затем запустите 50 потоков, все 50 из этих потоков будут выполняться на CPU0, а CPU1, 2, 3 и т. д. Будут сидеть без дела.
Чтобы повторить мысль, это в первую очередь полезно для устранения неисправностей устаревшего программного обеспечения. Если ваше программное обеспечение не сломано, вам действительно не следует связываться с какими-либо из этих параметров и позволить Windows выбрать лучший процессор (ы) для запуска вашей программы, чтобы он мог учесть остальную производительность системы.
Что касается модели «разделяемой памяти», она работает так же, но есть и другие вещи, которые могут немного пойти не так, когда ваше приложение работает на нескольких процессорах, а не только на одном временном интервале.
В качестве примера, который открывает глаза, прочтите эта нелепая статья о процессорах и барьерах памяти.
Он нацелен на разработку OSX на PowerPC, но достаточно общий, чтобы его можно было применять везде. ИМХО, это одна из десяти лучших статей, которые я прочитал, «все разработчики должны прочитать эту».
Я использовал это в паре программ, потому что мое ядро 0 было как-то испорчено.
// Programmatically set process affinity
var process = System.Diagnostics.Process.GetCurrentProcess();
// Set Core 0
process.ProcessorAffinity = new IntPtr(0x0001);
или же
// Set Core 1
process.ProcessorAffinity = new IntPtr(0x0002);
Подробнее об этом в "Свойство Process.ProcessorAffinity".
Я бы посмотрел на параллельные расширения платформы .NET. Он все еще находится в ОСАГО, однако он должен наилучшим образом использовать многоядерные процессоры. Начать работу с .NET проще всего на блог параллельных команд.
Насчет Java понятия не имею.
@ Джош Браун, кажется, это общеизвестно. Для справки: любая книга по Win32 API, имеющая дело с потоками, скажет вам это.