Как приложение может использовать несколько ядер или процессоров в .NET или Java?

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
10
0
12 546
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

Если вы используете несколько потоков, операционная система автоматически позаботится об использовании нескольких ядер.

@ Джош Браун, кажется, это общеизвестно. Для справки: любая книга по Win32 API, имеющая дело с потоками, скажет вам это.

Chris O 25.04.2010 02:30

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

При этом вы можете установить приоритеты потоков, если у вас есть критическая задача, и 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....
  • Установите флажки рядом с процессорами, на которых вы хотите разрешить запуск вашего приложения. Затем Windows будет планировать потоки из этого процесса только на этот конкретный процессор.

Если я правильно помню, окна будут `` запоминать '' эти настройки для последующих запусков вашего процесса, но, пожалуйста, не цитируйте меня по этому поводу - запустите несколько тестов самостоятельно :-)

Вы также можете сделать это программно в .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 понятия не имею.

Другие вопросы по теме