При запуске потока или процесса в .NET или Java существует ли способ выбрать, какой процессор или ядро запускается? Как работает модель общей памяти в таких случаях?
Как приложение может использовать несколько ядер или процессоров в .NET или Java?
Ответ 1
Если вы используете несколько потоков, операционная система автоматически позаботится об использовании нескольких ядер.
Ответ 2
Есть ли способ выбрать, какой процессор или ядро запускается?
Вы можете использовать диспетчер задач, чтобы сообщить о том, на какой процессор должна быть запущена ваша программа. Обычно это полезно только для устранения устаревших программ, которые нарушили реализацию многопоточности. Для этого
- Запустить диспетчер задач
- Найдите ваш процесс в окне
Processes
. - Щелкните правой кнопкой мыши и выберите
Set Affinity...
- Установите флажки рядом с процессором, который вы хотите разрешить запуску своего приложения. Затем Windows будет только планировать потоки из этого процесса на эти конкретные процессоры
Если я правильно помню, окна будут "помнить" эти параметры для последующего запуска вашего процесса, но, пожалуйста, не цитируйте меня по этому поводу - выполните некоторые тесты самостоятельно: -)
Вы также можете сделать это программно в .NET после запуска вашей программы с использованием свойства System.Diagnostics.Process.ProcessorAffinity, но я не подумайте, что он "запомнит" настройки, поэтому всегда будет короткий период, в течение которого ваше приложение будет запускаться в зависимости от того, какие окна процессора подходят. Я не знаю, как это сделать в java извините.
Примечание:
Это относится ко всему процессу. Если вы устанавливаете близость только для CPU0, а затем запускаете 50 потоков, все 50 из этих потоков будут выполняться на CPU0, а CPU1, 2, 3 и т.д. Будут сидеть без дела.
Чтобы повторить это, это в первую очередь полезно для устранения неполадок с устаревшим программным обеспечением. Если ваше программное обеспечение не сломано, вы действительно не должны вмешиваться в какие-либо из этих параметров, и пусть окна решат лучший процессор для запуска вашей программы, поэтому он может учитывать остальную часть производительности системы.
Что касается модели с "общей памятью", она работает одинаково, но есть много вещей, которые могут выглядеть неправильно, когда ваше приложение работает на нескольких процессорах, а не только на один раз.
Для примера с открытием для глаз прочитайте эту статью о смехотворной планете о CPU и Memory Barriers.
Он нацелен на разработку OSX на PowerPC, но достаточно общий, что он должен применяться повсеместно. ИМХО, это одна из десяти лучших разработчиков, которые должны прочитать эти статьи, которые я прочитал.
Ответ 3
Операционная система заботится о многопоточности, когда виртуальная машина использует собственные потоки (в отличие от зеленых потоков), и вы не можете указывать детали низкого уровня, например, выбирать процессор для определенного потока. Это лучше, потому что у вас, как правило, гораздо больше потоков, чем у вас есть процессоры, поэтому операционная система должна выполнять временную привязку, чтобы дать всем потокам возможность запускать.
При этом вы можете установить приоритеты потоков, если у вас есть критическая задача, и API-интерфейс потоков обычно предоставляет эту возможность. См. API Java, например: http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Thread.html#setPriority(int)
PS: там что-то сломалось в синтаксическом движке... Мне пришлось добавить ссылку выше как обычный текст
Ответ 4
Я использовал это в нескольких программах, потому что мое ядро 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".
Ответ 5
Я бы посмотрел на параллельные расширения в .NET framework. Он по-прежнему находится в CTP, однако он должен наилучшим образом использовать многоядерные процессоры. Самое легкое место для начала работы .NET - это блог параллельных команд.
Что касается Java, я понятия не имею.