2009-06-27 4 views
10

У меня есть программа, написанная на C#, я использую VSTS 2008 + .Net 3.5 + Windows Vista Enterprise x86 для разработки приложения Windows Forms.Как установить близость процессора к программе?

Мой текущий компьютер - двухъядерный процессор, я хочу настроить близость процессора к своей программе для работы на определенном процессоре и освободить другой процессор для выполнения другой работы. Есть идеи, как это сделать? Любое кодирование или конфигурация в порядке.

Немного больше фона, моя программа имеет интенсивный процессор, поэтому я не хочу, чтобы он занимал все два ресурса ЦП на моем компьютере, и я хочу освободить один процессор, чтобы я мог быстро просматривать сеть одновременно , :-)

спасибо заранее, Джордж

+1

Я видел утилиту для этого межбазового сервера (ibaffinity, я думаю, он был вызван). Мне было бы интересно посмотреть, как это сделать для любой из моих собственных программ - возможно, вы не сможете сделать это во время выполнения вашего исполняемого файла, вам придется делать это через внешнюю конфигурацию или во время процесса установки (I Думаю). – robsoft

+1

@robsoft: Это было необходимо только для старых версий Interbase/Firebird. Последние версии связывают серверные процессы с одним ядром процессора. Это открытый исходный код, поэтому всегда можно проверить, как это делается. – mghie

ответ

3

На самом деле, ваше приложение не будет использовать более одного процессора, если вы специально не делать что-то, чтобы использовать больше процессоров. Если вы используете пул потоков и/или запускаете дополнительные потоки, вы можете использовать дополнительные доступные ядра, но в противном случае ваше приложение будет иметь только один поток по умолчанию и, следовательно, использовать только один процессор.

+0

Мое приложение будет использовать более одного процессора, потому что оно записывается через Windows Media Encoder и выполняет кодировку в реальном времени в формате wmv - я протестировал его и увидел, что все ресурсы процессора заняты из диспетчера задач Windows. Любые идеи о настройке близости процессора? – George2

+1

@Brian: Возможно, все еще имеет смысл заставить поток оставаться на одном ядре для тех систем, где кеш-сервер. – mghie

+0

@mghie, я согласен с вами. Любые идеи для моей проблемы? – George2

12
  1. Перейти к Task Manager ->Процессы вкладки.
  2. Ищите свою программу. Щелкните правой кнопкой мыши по нему.
  3. Выбрать Установить Affinity и снять отметку с одной из отметок.

Это должно освободить один процессор для вас.

Для делать это из кода Вы можете добавить это заявление:

System.Diagnostics.Process.GetCurrentProcess().ProcessorAffinity = (System.IntPtr) 1; 

Ура!

+0

Любые способы программирования или конфигурации? Я не хочу, чтобы конечный пользователь делал это каждый раз. :-) – George2

+2

Попробуйте следующее: System.Diagnostics.Process.GetCurrentProcess(). ProcessorAffinity = 1; – Gaurav

+0

BTW: использовать второй набор для 2 и использовать оба ядра, вы можете установить значение 3: – Gaurav

7

функции API окон, чтобы сделать это являются SetProcessAffinityMask() и SetThreadAffinityMask(). Я не знаю .NET, поэтому не могу сказать, есть ли обертки вокруг этих функций, но this, похоже, предлагает обратное.

BTW: Я согласен, что это необходимо только в особых обстоятельствах, обычно лучше всего разрешить планировщику ОС. Это один из тех вопросов, где вы, вероятно, не должны этого делать, если вам нужно спросить, как это сделать.

+1

@mghie, в моей проблеме, 1. Мне кажется, я должен назвать SetProcessAffinityMask, кроме SetThreadAffinityMask, правильно? 2. Могу ли я вызвать SetProcessAffinityMask из текущего процесса, чтобы установить близость текущего процесса? Или я должен настроить его из внешнего инструмента? – George2

+3

Вы можете сделать это из самого процесса. Вероятно, лучше всего начать с этой статьи MSDN: http://msdn.microsoft.com/en-us/magazine/cc300701.aspx#S11, он должен предоставить некоторый код, а также полезную справочную информацию. – mghie

+0

Мне нравится ваш ответ, об использовании System.Diagnostics.Process.GetCurrentProcess(). Свойство ProcessorAffinity, почему мы должны использовать IntPrt, почему бы не использовать int? – George2

 Смежные вопросы

  • Нет связанных вопросов^_^