2009-08-11 14 views
5

Gibt es eine Möglichkeit, den freien RAM auf einem Linux-Rechner mit zufälligen Daten zu füllen?Speicher mit zufälligen Daten füllen

Der Grund, warum ich das frage: Ich arbeite in einer Gruppe, wo wir numerische Programmierung in Fortran machen. Manchmal arbeiten Leute mit doppelter Genauigkeit, so dass Programme, die doppelt präzise Ergebnisse liefern, nur eine einfache Genauigkeit liefern.

Wenn mein Verständnis richtig ist, würde man zufällige Fluktuationen des Ergebnisses nach der einfachen Genauigkeitsgrenze in einem solchen Programm sehen. Das heißt, wenn Sie dasselbe Programm mehrmals mit derselben Eingabe ausführen, erhalten Sie jedes Mal ein zufällig unterschiedliches Ergebnis. Was Sie sehen (der zufällige Teil) hängt von den zufälligen Werten im freien RAM der Maschine ab. Aber in der Praxis, wenn Sie das Programm wiederholt auf demselben Computer ausführen, werden die gleichen Teile des Speichers wiederholt verwendet, die die gleichen zufälligen Daten in ihnen haben, die jedes Mal die gleiche Ausgabe führen.

Meine Idee ist, dass, wenn Sie den Speicher mit zufälligen Daten überschreiben könnten, Sie tatsächlich die zufälligen Schwankungen in Ihrer Programmausgabe sehen würden. Das würde es viel einfacher machen, diese Fehler zu finden.

Ist diese Idee zu schlagen, oder wenn nicht, wie fülle ich die Erinnerung? Kann ich/dev/random in den RAM pumpen, oder so?

+0

Der einem Prozess zugewiesene Speicher wird initialisiert (mit Daten von der Festplatte) oder auf Null gesetzt, bevor er verwendet wird. Keine Ausnahmen. Alles, was Sie hier tun können, ist die Randomisierung des Speichers innerhalb des betreffenden Programms. – bdonlan

+0

Ich bin mir ziemlich sicher, dass es nicht ist ... Besonders in Strings, die nicht initialisiert wurden, sehe ich die ganze Zeit "binären Müll" ... Es kann sein, dass der Speicher am Anfang initialisiert wird, und dass der Müll aus dem Speicher stammt wiederverwenden innerhalb des Programms, aber in jedem Fall kann es zufällige Daten geben. –

+0

Nachdem ich mir die Fragen angeschaut habe, sehe ich, dass Sie sich mit einer Legacy - Anwendung beschäftigen und sie debuggen müssen, und idealerweise möchten Sie sie "an Ort und Stelle" debuggen, und eine einfache, erfinderische Art wäre es, die Daten. Ich weiß nicht, ob das möglich ist. Sie würden wahrscheinlich besser dran sein, indem Sie den Code, der numerische Double/Single-Returns zu seinem eigenen Modul macht, abbrechen, ihn mit einem Unit-Test-Framework verbinden und so ausführen. Es könnte eine Menge Arbeit erfordern, aber Sie könnten beweisen, dass die Zahlen genau so zurückgegeben werden. Ich sehe das einfach nicht als einfach an. –

Antwort

2

Linux versorgt Sie mit /proc/pid/maps und , zu Ihrem eigenen Vergnügen. Natürlich muss man beim Schreiben besonders vorsichtig sein. Denken Sie auch daran, dass das einzige Speichersegment, das für jeden Prozess verfügbar ist, sein eigenes ist. Sie müssen also wahrscheinlich etwas anfügen und Code patchen, um dorthin zu gelangen, wo Sie möchten. Viel Glück, wie auch immer. :)

edit: Es ist immer noch ein paar Mal komplizierter als ein Code-Audit - das hat auch größere Chancen, die eigentliche Ursache des Problems zu offenbaren.

1

Ich würde denken, dass zufällige Daten Debugging viel viel schwieriger machen würde. Ist die Zufälligkeit in den Antworten durch zufällige Werte im Speicher oder einen Rechenfehler verursacht? Ich würde thnk feste und bekannte Werte wäre besser.

Auf der FORTRAN-Seite, sagst du "gemischte Präzision" Zahlen werden austauschbar verwendet? Ich bin nicht klar über das eigentliche Problem.

Aber ich habe keine Ahnung, wie man freien Speicher in Linux mit nichts füllt.

+0

Das Problem kann beispielsweise auftreten, wenn Sie eine Konvertierung durchführen und vergessen, die Genauigkeit explizit anzugeben.Zum Beispiel (mit idp = 8 für doppelte Genauigkeit): real (idp) :: a; Komplex (idp) :: b; a = 1.0_idp; b = cmplx (a, IDP); Wenn Sie den 'idp' im Aufruf von cmplx vergessen (was leicht passiert), wird der resultierende Wert von b nur eine Kopie von einer Grenze bis zur einfachen Genauigkeit sein. Die verbleibenden Ziffern können zufällige Schwankungen aufweisen, die davon abhängen, wie der Speicher zuvor verwendet wurde. Es gibt andere Beispiele für solche Probleme. Wenn Sie die Schwankungen tatsächlich erzwingen können, ist es einfacher zu debuggen. –

3

Wenn Sie eine glibc (> = 2.4 wie es scheint) haben, können Sie die Umgebungsvariable MALLOC_PERTURB_ verwenden, um malloc() return memory zu setzen, das auf einen Wert gesetzt ist. Siehe http://udrepper.livejournal.com/11429.html und innerhalb http://people.redhat.com/drepper/defprogramming.pdf

Dann ist die Frage, ob Ihr Fortran-Programm die glibc malloc() verwendet, ich denke, es kommt auf den Fortran-Compiler an.

+1

Beachten Sie auch, dass im Gegensatz zu dem, was viele Leute glauben, Speicher, den Sie von malloc() (oder allocate() in Fortran) erhalten, nicht garantiert auf Null gesetzt wird, obwohl viele Betriebssysteme dies als eine Option anbieten. – uekstrom

2

Ich würde versuchen Unit-Tests mit etwas wie fUnit zu schreiben, um sicherzustellen, dass Double-Precision-Werte immer wie erwartet funktionieren, indem Sie einige Tests schreiben, die ein doppeltes Genauigkeitsergebnis in Fällen erfordern, in denen ein einzelnes Genauigkeitsergebnis gespeichert wird.

ZB: schreibe einen Test, der eine Funktion mit verschiedenen Eingaben aufruft, die doppelt präzise Ausgaben erzeugen sollen, und teste, dass dies mit einem assert() funktioniert.

5

Ihr Verständnis ist falsch. Sie können den Speicher eines Programms nicht mit zufälligen Daten füllen, bevor es ausgeführt wird, und selbst wenn Sie könnten, würde es Ihr Problem nicht lösen.

Wenn Ihr Fortran-Programm eine Fließkomma-Variable mit einfacher Genauigkeit deklariert, weist der Compiler eine 32-Bit-Zelle im Speicher zu, die den Wert enthält. Jedes Mal, wenn Ihr Programm von der Variablen liest, holt der Prozessor einen 32-Bit-Wert aus der Zelle. Jedes Mal, wenn Sie der Variablen zuweisen, schreibt der Prozessor einen 32-Bit-Wert in die Zelle. Unter keinen Umständen sollten zufällige Bits in den Wert von den Zellen vor oder nach der Zelle "bluten".

Während Fließkomma-Arithmetik nicht präzise ist, ist es auch nicht zufällig.Wenn Sie 1.0/3.0 + 1.0/3.0 + 1.0/3.0) eintausend Mal berechnen, erhalten Sie jedes Mal 0.99999....

Der zweite Punkt ist, dass, wenn ein Programm unter Linux ausgeführt wird, alle Datenspeicher vom Betriebssystem sorgfältig auf Null vorinitialisiert werden. Dies geschieht, um zu vermeiden, dass sich Ihr Programm bei jeder Ausführung anders verhält: das wäre eine SCHLECHTE SACHE. BEARBEITEN: Ein weiterer Grund dafür ist, dass private Informationen von einem Prozess zum anderen verloren gehen.

(Commen: Bitte beachten Sie, dass ich absichtlich über eine Reihe von Fragen skated habe, um die Erklärung einfach zu machen.)

+0

Ich bin mir der Ungenauigkeiten der Gleitkommaarithmetik bewusst, wie Sie es veranschaulichen. Das ist genau der Punkt. Wenn das Programm solche Fehler aufweist, sind die Ergebnisse ungenau, aber nicht zufällig. Wenn jedoch Konvertierungsprobleme mit einfacher/doppelter Genauigkeit auftreten, sind die Ergebnisse zufällig. Ich bin ziemlich sicher, dass in Fortran Speicher nicht initialisiert wird, es sei denn Sie manuell anfordern. Das bedeutet, dass die vorherige Verwendung dieses Speicherplatzes sich in Form von zufälligen Schwankungen auswirken kann. Diese Dinge können auch compilerabhängig sein. –

+0

"Ich bin mir ziemlich sicher, dass in Fortran Speicher nicht initialisiert wird, es sei denn Sie manuell anfordern." Wenn Sie auf einem modernen Mehrbenutzerbetriebssystem laufen, kann ich garantieren, dass der Speicher, mit dem jedes Programm beginnt, initialisiert wird. Andernfalls kann ein Programm private Informationen aufnehmen, die im Speicher verbleiben, wenn ein anderes Programm beendet wird oder abstirbt. –

1

Sie haben um Hilfe gebeten ito Ihre Lösung für ein Problem implementieren, die Randomisierung Speicher sein. Ich finde jedoch, dass es eine seltsame und möglicherweise schwer zu debuggende Lösung ist.

Es scheint mir, dass Sie mehr von profitieren würden - statische Code-Analyse-Tools - spezifische Unit-Tests - Checklisten für die Code-Review, die speziell auf dieses Problem Manchmal

abgezielt, kann man an Lösungen denken noch einfacher ; Wenn Sie ohne Single-Precision-Mathematik auskommen, könnten Sie die Verknüpfung solcher Bibliotheken verhindern, so dass der Fehler einen Link-Fehler anzeigen würde; früh in Ihrem Entwicklungsprozess. Viel Glück.

2

Was Sie erreichen wollen, obwohl edel in der Absicht, und interessant konzipiert, erinnert mich an den Wile E. Coyote plant, den Roadrunner zu fangen, während ein Gewehr und eine Scharfschützen-Aktion die beste Option gewesen wäre.

Wenn Sie das Problem haben, das Sie präsentieren, bedeutet dies, dass Ihr Code ein strukturelles Problem aufweist und Sie die Kontrolle über Ihr Programm verlieren. Obwohl ich perfekt weiß, wie Software in der akademischen Welt entwickelt wird, und in Fortran, wirft man sich selbst auf die Klippe, nur weil der Rest der Welt es ist problematisch.

Was Sie tun sollten, ist eine Prüfung Ihres Codes. und dann einen grad Schüler zu schlagen, wenn er es wieder vermasselt.

+0

Es ist nicht wirklich mein Programm, es ist nur ein anderer Typ in meiner Gruppe, der mich um Hilfe bat. Er hat ein altes kompliziertes Durcheinander eines Programms, und er fand heraus, dass seine Ergebnisse schwanken, wenn er etwas nicht verwandtes ändert. Ich bin mir ziemlich sicher, dass es ein Problem mit doppelter/einfacher Genauigkeit ist. Außerdem ... ich bin der graduierte Student (aber ich war nicht derjenige, der es vermasselt hat;)) In jedem Fall kommt es nicht in Frage, ein komplettes Audit seines Programms zu machen, es ist viel zu chaotisch dafür und würde es nehmen zu viel Zeit. –

+0

hängt davon ab, was er ändert, wie er sich ändert. Wer weiß ? könnte sein wie du sagst, aber wer kann das wirklich sicher sagen? Ich sehe Ihren Sinn darin, das zu debuggen, aber vorausgesetzt, Sie finden tatsächlich heraus, dass es sich um ein Präzisionsproblem handelt, wissen Sie immer noch nicht, wo es auftritt, also brauchen Sie trotzdem ein Audit. –

Verwandte Themen