2009-02-27 9 views
0

Ich führe ein Benutzermodusprogramm mit normaler Priorität aus. Mein Programm sucht nach einem NP-Problem und verbraucht dadurch viel Speicher, der schließlich in der Auslagerungsdatei landet.Windows blockiert, wenn mein Programm Swapfile verwendet

Dann friert meine Maus ein und es dauert ewig, bis sich der Aufgabenmanager öffnet und mich den Prozess beenden lässt.

Was ich wissen möchte, ist, wie ich mein Windows-Betriebssystem davon abhalten kann, vollständig davon abzuschließen, obwohl nur 1 von meinen 2 Kernen verwendet wird.

Edit: Danke für die Antworten.

Ich weiß, dass es weniger helfen wird, weniger Speicher zu verwenden, aber es macht einfach keinen Sinn für mich, dass das gesamte Betriebssystem gesperrt werden sollte.

+0

Wenn Sie das Programm nicht ändern können, versuchen Sie, Ihre Auslagerungsdatei zu defragmentieren, und wenn möglich, verschieben Sie Ihre Auslagerungsdatei auf eine schnellere Festplatte. Stellen Sie sicher, dass DMA für das Laufwerk und all diese Dinge aktiviert ist. Schweres Paging ist unter den besten Umständen eine ziemlich traumatische Erfahrung für das System. – overslacked

+0

Ihr Betriebssystem blockiert nicht, es läuft nur langsam, da es stark ausgelastet ist. :) Es weiß nicht, welche Programme du in zwei Minuten benutzen wirst, also tauscht es einfach alles aus, was du gerade nicht benutzt. Oder schlagen Sie vor, dass es eine bessere Strategie für das Betriebssystem gibt? – flodin

+0

flodin: Ich würde denken, dass das Betriebssystem die GUI nicht auslagern sollte. – Unknown

Antwort

1

Das Problem ist, dass, wenn ein anderes Programm (z. B. explorer.exe) ausgeführt wird, sein gesamter Code und Speicher ausgelagert worden ist. Um Platz für das andere Programm zu machen, muss Windows zuerst Daten schreiben, die das Programm verwendet, und dann den Speicher des anderen Programms laden. Jede neue Code-Seite, die in dem anderen Programm ausgeführt wird, benötigt Festplattenzugriff, wodurch es langsam ausgeführt wird.

Ich kenne nicht das Zugriffsmuster Ihres Programms, aber ich denke, es berührt alle seine Speicherseiten viel in zufälliger Weise, was das Problem verschlimmert, weil sobald Windows eine Speicherseite aus Ihr Programm, plötzlich brauchen Sie es wieder und Windows muss eine andere Seite finden, um die gleiche Behandlung zu geben.

Um anderen Prozessen mehr RAM zum Leben zu geben, können Sie SetProcessWorkingSetSize verwenden, um die maximale RAM-Menge zu reduzieren, die Ihr Programm möglicherweise verwendet. Dies führt natürlich dazu, dass Ihr Programm langsamer läuft, weil es mehr Swapping durchführen muss.

Eine andere Alternative, die Sie versuchen könnten, ist, dem System weitere Laufwerke hinzuzufügen und die Auslagerungsdateien über diese zu verteilen. Sie haben möglicherweise eine Dual-Core-CPU, aber Sie haben nur ein einziges Laufwerk. Durch das Verteilen der Auslagerungsdatei auf mehrere Laufwerke kann Windows die Arbeit über diese hinweg ausgleichen (obwohl ich aus erster Hand nicht weiß, wie gut dies funktioniert).

2

Die offensichtliche Antwort ist "weniger Speicher verwenden". Wenn Ihre App den gesamten verfügbaren Speicher belegt, muss das Betriebssystem den Task-Manager (usw.) aufrufen, um Platz für Ihre App zu schaffen. Wenn Sie Programme wechseln, muss das Betriebssystem die anderen Programme zurücksenden (so wie sie benötigt werden). Disk liest sind langsamer als Speicher liest, so scheint alles langsamer zu gehen.

Wenn Sie dies vermeiden möchten, müssen Sie in Ihrer App einen eigenen Speicher verwalten, oder verwenden Sie einen besseren Algorithmus als Brute-Force. (Es gibt genetische Algorithmen, Simulated Annealing, etc.)

1

Ich glaube nicht, es gibt eine Programmierung Antwort auf diese Frage, abgesehen von "restrukturieren Sie Ihre App, um weniger Speicher zu verwenden." Das Problem mit dem Auslagerungsdatei ist höchstwahrscheinlich auf den Flaschenhals beim Zugriff auf die Festplatte zurückzuführen, insbesondere wenn Sie eine IDE-Festplatte oder eine stark fragmentierte Auslagerungsdatei verwenden.

1

Es ist ein bisschen extrem, aber Sie könnten immer Ihre Auslagerungsdatei minimieren, so dass Sie nicht die ganze Festplatte Thashing haben, und Ihr Programm ist nicht erlaubt, viel virtuellen Speicher zuzuweisen. Setzen Sie die Seitendatei unter Systemsteuerung/Erweitert/Erweitert/Perforance/Virtueller Speicher auf die benutzerdefinierte Größe und geben Sie einen Wert von 2 MB ein (der kleinste zulässige Wert für XP). Wenn eine Zuweisung fehlschlägt, sollten Sie eine Ausnahme erhalten und ordnungsgemäß beendet werden können.Es repariert Ihr Problem nicht, beschleunigt es nur;)

Eine andere Sache, die in Betracht ziehen würde, wäre, wenn Sie auf einer 32bit-Plattform sind, Port zu einem 64-Bit-System und erhalten eine Box mit viel mehr adressierbaren RAM.

Verwandte Themen