Question

J'ai un programme que je voudrais courir sur un seul CPU il ne prend pas des ressources système trop. Le problème est, il fait un appel dans une DLL externe qui utilise automatiquement tous les cœurs de processeur disponibles. Je n'ai pas le code source de la DLL externe. Comment puis-je limiter la DLL à l'aide d'une seule unité centrale de traitement?

EDIT: Merci pour l'aide, voici le code je limiter à une CPU (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);
}

EDIT: Active l'approche de Brannon de la mise en priorité du processus fonctionne encore mieux ce que je veux, ce qui est de maintenir le processus de mastication des ressources. Voici ce code (Windows):

// Make the process low priority so we don't chew up system resources
HANDLE ProcessHandle = GetCurrentProcess();
SetPriorityClass(ProcessHandle,BELOW_NORMAL_PRIORITY_CLASS);
Était-ce utile?

La solution

affinité du processeur de réglage est la mauvaise approche. Laissez la programmation de la poignée du système d'exploitation.

Si la machine est en veille, vous voulez utiliser autant de processeurs que vous pouvez. Sinon, vous faites moins de travail pour aucune raison. Si la machine est occupée, vous voulez utiliser des cycles « libres » et ne pas nuire d'autres processus.

Windows a cette fonctionnalité intégrée. La bonne solution pour cela est de définir la priorité de base du processus.

Voir http://msdn.microsoft.com /en-us/library/ms686219(VS.85).aspx pour plus de détails sur SetPriorityClass().

Si vous voulez tester cela sans écrire de code, utilisez le Gestionnaire des tâches pour changer la priorité de votre processus.

Autres conseils

Vous pouvez définir l'affinité CPU de votre programme. Essayez le SetProcessAffinityMask fonction sous Windows ou sched_setaffinity sur Linux.

Normalement, une dll vit dans le même fil / espace mémoire que le code qui l'appelle. Le fait d'appeler une DLL elle-même ne devrait pas créer de threads. Si vous appelez la DLL semble créer davantage de threads, cela signifie que la DLL crée elle-même les fils quelque part dans son code. Si vous ne disposez pas de code source ou de la documentation pour la DLL, il n'y a pas grand-chose que vous pouvez faire à ce sujet (et si vous voulez que la DLL de faire son travail, il n'y a pas grand-chose que vous devriez faire à ce sujet).

Vous pouvez essayer de jouer avec la priorité de votre demande - la mise à bas pourrait changer l'utilisation du processeur, même si elle ne change pas ce que threads sont créés. Mais il semble probable que ce que vous voulez vraiment est d'obtenir la documentation pour cette bête. Sans savoir comment fonctionne le code, en général, il n'y a pas grand-chose que vous pouvez faire pour changer la façon dont cela fonctionne. Pas super génie peut changer.

Er ...... pourquoi? Sérieusement, pourquoi voudriez-vous limiter une bibliothèque qui est capable de vous donner des performances supplémentaires de telle manière? Essayez-vous d'accéder à une ressource partagée ou quelque chose? On pourrait penser qu'une bibliothèque multi-thread serait capable de gérer cela en toute sécurité.

À moins qu'il ya quelque chose que vous n'êtes pas mentionner, je ne vois aucune raison valable même pour essayer pour limiter une bibliothèque multi-thread à un seul fil.

Ainsi, votre programme utilise un thread, mais vous ne voulez pas la DLL externe à utiliser plus d'un fil? Vous n'avez pas beaucoup de contrôle sur ce que fait la DLL externe, mais certaines approches pourraient être:

Vous ne dites pas ce que la plate-forme est ce pour. Je vais supposer que les fenêtres ici.

Créer le processus de l'enfant et l'associer à un emploi objet . Vous pouvez ensuite définir l'affinité du processeur pour cet objet de travail pour inclure seulement l'un des cœurs de processeur disponibles. Le processus enfant ne peut pas modifier le masque d'affinité à quoi que ce soit qui ne soit pas un sous-ensemble de l'affinité du processeur pour l'objet du travail. De plus, vous devez vous rappeler de ne pas définir la JOB_OBJECT_LIMIT_BREAKAWAY_OK limite ou la JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK limite prolongée au travail ou bien le processus enfant sera en mesure de sortir du travail.

En outre, vous pouvez définir la priorité et la classe de planification pour le travail. Peut-être que ce sera suffisant pour créer le processus de l'enfant à une unité centrale de traitement inférieure et / ou niveau de priorité IO?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top