Как мне ограничить внешнюю библиотеку DLL одним процессором?

StackOverflow https://stackoverflow.com/questions/523385

Вопрос

У меня есть программа, которую я хотел бы запустить только на одном процессоре, чтобы она не занимала слишком много системных ресурсов.Проблема в том, что он вызывает внешнюю библиотеку DLL, которая автоматически использует все доступные ядра процессора.У меня нет исходного кода для внешней библиотеки DLL.Как я могу ограничить библиотеку DLL использованием только одного процессора?

Редактировать:Спасибо за помощь, вот код, который я использовал для ограничения одним процессором (Windows):

// Limit the process to only 1 thread so we don't chew up system resources
HANDLE ProcessHandle = GetCurrentProcess();
DWORD ProcessAffinityMask;
DWORD SystemAffinityMask;
if(GetProcessAffinityMask(ProcessHandle,&ProcessAffinityMask,&SystemAffinityMask)
    && SystemAffinityMask != 0)
{
    // Limit to 1 thread by masking all but 1 bit of the system affinity mask
    DWORD NewProcessAffinityMask = ((SystemAffinityMask-1) ^ SystemAffinityMask) & SystemAffinityMask;
    SetProcessAffinityMask(ProcessHandle,NewProcessAffinityMask);
}

Редактировать:Оказывается, подход Браннона к установлению приоритета процесса работает еще лучше для того, чего я хочу, а именно для того, чтобы процесс не расходовал ресурсы.Вот этот код (Windows):

// Make the process low priority so we don't chew up system resources
HANDLE ProcessHandle = GetCurrentProcess();
SetPriorityClass(ProcessHandle,BELOW_NORMAL_PRIORITY_CLASS);
Это было полезно?

Решение

Установка привязки к процессору - это неправильный подход.Позвольте операционной системе обрабатывать планирование.

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

Эта функциональность встроена в Windows.Правильным решением для этого является установка базового приоритета процесса.

Видишь http://msdn.microsoft.com/en-us/library/ms686219 (ПРОТИВ 85).aspx для получения подробной информации о SetPriorityClass().

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

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

Вы могли бы установить привязку к процессору вашей программы.Попробуйте Установите processaffinitymask функция в Windows или sched_setaffinity в Linux.

Обычно библиотека dll находится в том же потоке / пространстве памяти, что и вызывающий ее код.Сам процесс вызова библиотеки DLL не должен создавать потоки.Если кажется, что вызов DLL создает больше потоков, это означает, что сама DLL создает потоки где-то в своем коде.Если у вас нет исходного кода или документации для библиотеки DLL, вы мало что можете с этим поделать (и если вы хотите, чтобы библиотека DLL выполняла свою работу, вам мало что следует с этим делать).

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

Er......почему?Серьезно, зачем вам ограничивать библиотеку, которая способна таким образом обеспечить вам дополнительную производительность?Вы пытаетесь получить доступ к общему ресурсу или что-то в этом роде?Можно было бы подумать, что многопоточная библиотека была бы способна безопасно справиться с этим.

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

Итак, ваша программа использует один поток, но вы не хотите, чтобы внешняя DLL использовала более одного потока?У вас нет особого контроля над тем, что делает внешняя библиотека DLL, но некоторые подходы могут быть:

Вы не сказали, для какой платформы это предназначено.Я собираюсь предположить, что здесь Windows.

Создайте дочерний процесс и свяжите его с Объект задания.Затем вы можете установить привязку процессора к этому объекту задания таким образом, чтобы он включал только одно из доступных ядер процессора.Дочерний процесс не может изменить маску привязки к чему-либо, что не является подмножеством привязки процессора к объекту задания.Кроме того, вы должны помнить, что не следует устанавливать ограничение JOB_OBJECT_LIMIT_BREAKAWAY_OK или расширенный лимит JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK на задании, иначе дочерний процесс сможет прервать выполнение задания.

Кроме того, вы можете установить приоритет и класс планирования для задания.Возможно, будет достаточно создать дочерний процесс с более низким уровнем приоритета процессора и / или ввода-вывода?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top