Frage

Ich habe ein Programm, das Ich mag würde auf nur eine CPU laufen, so dass es nicht zu viele Systemressourcen in Anspruch nimmt. Das Problem ist, es macht einen Anruf in eine externe DLL, die alle verfügbaren CPU-Kerne automatisch verwendet. Ich habe nicht den Quellcode der externen DLL. Wie kann ich begrenzen die DLL nur mit einer CPU mit?

EDIT: Danke für die Hilfe, hier ist der Code, den ich verwenden, um eine CPU zu begrenzen (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: Es stellte sich heraus Brannons Ansatz Prozesspriorität der Einstellung funktioniert noch besser für das, was ich will, was den Prozess Ressourcen vom Kauen zu halten ist. Hier ist der Code (Windows):

// Make the process low priority so we don't chew up system resources
HANDLE ProcessHandle = GetCurrentProcess();
SetPriorityClass(ProcessHandle,BELOW_NORMAL_PRIORITY_CLASS);
War es hilfreich?

Lösung

Einstellung Prozessor-Affinität ist der falsche Ansatz. Lassen Sie das OS Griff Scheduling.

Wenn die Maschine im Leerlauf sitzt, wollen Sie so viel Prozessor verwenden, wie Sie können. Ansonsten tun Sie weniger Arbeit ohne Grund. Wenn die Maschine ausgelastet ist, dann wollen Sie die Verwendung von „freien“ Zyklus machen und nicht negativ auf andere Prozesse beeinflussen.

Windows verfügt über diese Funktionalität eingebaut. Die richtige Lösung für diese ist es, die Basispriorität des Prozesses zu setzen.

Siehe http://msdn.microsoft.com /en-us/library/ms686219(VS.85).aspx für Details auf SetPriorityClass().

Wenn Sie dies testen möchten, ohne Code zu schreiben, verwenden Sie den Task-Manager die Priorität des Prozesses zu ändern.

Andere Tipps

Sie können die CPU-Affinität des Programms festgelegt. Versuchen Sie, die SetProcessAffinityMask Funktion unter Windows oder sched_setaffinity auf Linux.

Normalerweise lebt eine DLL im selben Thread / Speicherplatz als der Code, der es nennt. Der Akt der Aufruf einer DLL selbst sollte keine Threads erstellen. Wenn die DLL-Aufruf scheint mehr Threads zu erstellen, bedeutet das, dass die DLL selbst die Fäden irgendwo schafft darin Code. Wenn Sie keine Quellcode oder Dokumentation für die DLL haben, gibt es nicht viel können Sie dagegen tun (und wenn Sie die DLL möchten, um ihre Arbeit zu tun, gibt es nicht viel sollten Sie dies tun).

Sie könnten versuchen, mit der Priorität der Anwendung zu spielen - es auf niedrige Einstellung kann die CPU-Auslastung auch ändern, wenn sie sich nicht ändert, welche Threads erstellt werden. Aber es scheint wahrscheinlich, dass das, was Sie wirklich wollen, ist die Dokumentation für dieses Tier zu bekommen. Ohne zu wissen, wie Code funktioniert in der Regel gibt es nicht viel können Sie tun, um zu ändern, wie es funktioniert. Kein Super-Genie kann das ändern.

Er ...... warum? Im Ernst, warum würden Sie eine Bibliothek beschränken, die Sie geben zusätzliche Leistung in einer solchen Art und Weise fähig ist? Versuchen Sie, eine gemeinsam genutzte Ressource oder etwas zugreifen? Man würde denken, dass eine Multi-Threaded-Bibliothek der Lage wäre, diese sicher zu handhaben.

Es sei denn, es ist etwas, das Sie nicht zu erwähnen, kann ich sehen, jeden triftigen Grund nicht für noch Versuch ein Multi-Threaded-Bibliothek auf einen einzelnen Thread zu beschränken.

So Ihr Programm einen Thread verwendet, aber Sie wollen nicht die externe DLL mehr als ein Thread zu benutzen? Sie haben nicht viel Kontrolle darüber, was die externe DLL tut, aber einige Ansätze könnten sein:

Sie hat nicht gesagt, welche Plattform diese für ist. Ich werde Fenster hier zu übernehmen.

Erstellen Sie das Kind Prozess und es mit einem Job Objekt . Anschließend können Sie die Prozessor-Affinität gesetzt für das Auftragsobjekt nur eine der verfügbaren CPU-Kerne enthalten. Das Kind Prozess ist nicht in der Lage, die Affinitätsmaske auf, etwas zu ändern, die nicht eine Teilmenge der Prozessor-Affinität für das Job-Objekt ist. Darüber hinaus sollten Sie daran denken, nicht die Grenze JOB_OBJECT_LIMIT_BREAKAWAY_OK oder die erweiterte Grenze JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK auf dem Arbeitsmarkt zu setzen oder aber das Kind Prozess wird in der Lage sein, aus dem Job zu brechen.

Darüber hinaus können Sie die Priorität und Scheduling-Klasse für den Job festgelegt. Vielleicht wird es ausreichend sein, das Kind Prozess bei einer niedrigeren CPU und / oder IO Prioritätsstufe zu schaffen?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top