Wie kann ich mein Programm läuft von Anfang an sicher, ohne Unterbrechung zu beenden?

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

  •  06-07-2019
  •  | 
  •  

Frage

Ich bin zu Timecode versuche RDTSC mit (keine anderen Profilierungssoftware Ich habe versucht, ist auf die Auflösung zu Zeit in der Lage ich brauche) auf Ubuntu 8.10. Allerdings habe ich immer wieder Ausreißer von Taskumschaltungen bekommen und Interrupts abfeuern, die meine Statistiken verursachen ungültig.

Unter Berücksichtigung meines Programm läuft in wenigen Millisekunden, ist es möglich, alle Unterbrechungen zu deaktivieren (die von Natur abschalten Schalter Aufgabe würde) in meiner Umgebung? Oder muß ich zu einem O gehen, die mir mehr Leistung ermöglicht? Werde ich besser dran, meinen eigenen OS-Kernel mit diesem Timing Code auszuführen? Ich versuche, ein Algorithmus beste / schlechteste Fall der Leistung zu beweisen, so muss er völlig fest sein mit Timing.

Der entsprechende Code, den ich zur Zeit bin mit ist:

inline uint64_t rdtsc()
{
    uint64_t ret;
    asm volatile("rdtsc" : "=A" (ret));
    return ret;
}

void test(int readable_out, uint32_t start, uint32_t end, uint32_t (*fn)(uint32_t, uint32_t))
{
    int i;
    for(i = 0; i <= 100; i++)
    {
        uint64_t clock1 = rdtsc();
        uint32_t ans = fn(start, end);
        uint64_t clock2 = rdtsc();

        uint64_t diff = clock2 - clock1;

        if(readable_out)
            printf("[%3d]\t\t%u [%llu]\n", i, ans, diff);
        else
            printf("%llu\n", diff);
    }
}

Extrapunkte zu denen, die ich bemerke ich nicht richtig Überlaufbedingungen in diesem Code verarbeitet. Zu diesem Zeitpunkt bin ich nur versucht, eine konsistente Ausgabe ohne plötzliche Sprünge zu bekommen aufgrund meines Programm Verlust der Zeitscheibe.

Der nette Wert für mein Programm ist -20.

So zu rekapitulieren, ist es mir möglich, diesen Code auszuführen, ohne Unterbrechung von der OS? Oder soll ich brauche es auf nackte Hardware in ring0 laufen, so kann ich IRQs und Terminierung deaktivieren? Vielen Dank im Voraus!

War es hilfreich?

Lösung

Wenn Sie nanosleep () aufrufen, für eine Sekunde zu schlafen oder so unmittelbar vor jeder Wiederholung des Tests sollten Sie eine „frische“ Zeitscheibe für jeden Test bekommen. Wenn Sie Ihren Kernel mit 100Hz Timer-Interrupts kompilieren, und Ihre Timer-Funktion vervollständigt unter 10ms in, dann sollten Sie in der Lage sein, Timer-Interrupts Sie auf diese Weise zu vermeiden, schlagen.

weitere Unterbrechungen zu minimieren, dekonfigurieren alle Netzwerkgeräte, konfigurieren Sie Ihr System ohne Swap und stellen Sie sicher, dass es sonst Ruhe.

Andere Tipps

Tricky. Ich glaube nicht, dass Sie das Betriebssystem drehen können ‚off‘ und garantieren strenge Terminplanung.

Ich würde dieses den Kopf abschlagen: da es so schnell läuft, führen Sie es oft eine Verteilung der Ergebnisse zu sammeln. Da Standard-Ubuntu Linux ist kein Echtzeitbetriebssystem im engeren Sinne, alle alternativen Algorithmen würden im gleichen Setup ausführen --- und Sie können dann Ihre Verteilungen vergleichen (mit etwas von Auswertungsstatistiken zu quantiles zu qqplots). Sie können diesen Vergleich mit Python tun, oder R oder Octave, ... je nachdem, was Ihnen am besten passt.

Das könnte Sie der Lage sein, um wegzukommen mit fliessendem FreeDOS , da es ist ein einzelner Prozess OS .

Hier ist der relevante Text aus dem zweiten Link:

  

Microsofts DOS-Implementierung, die die de ist   facto-Standard für DOS-Systeme in der   x86 Welt, ist ein Single-User,   Single-Tasking-Betriebssystem. Es   bietet rohen Zugriff auf Hardware und   nur eine minimale Schicht für OS APIs für   Dinge wie die Datei-I / O. Das ist ein   Sache gut, wenn es um eingebettete kommt   Systeme, weil Sie oft brauchen nur   etwas getan, ohne eine bekommen   Betriebssystem im Weg.

     

DOS hat (nativ) kein Konzept   Fäden und kein Konzept von mehreren,   die laufenden Prozesse. Anwendung   Software macht das System Anrufe über die   Verwendung einer Interrupt-Schnittstelle, ruft   verschiedene Hardware-Interrupts zu handhaben   Dinge wie Video und Audio, und   Aufruf Software-Interrupts zu handhaben   verschiedene Dinge wie das Lesen einer   Verzeichnis, eine Datei ausgeführt wird, und so   weiter.

Natürlich, werden Sie wahrscheinlich die beste Leistung tatsächlich bekommen FreeDOS auf tatsächliche Hardware, nicht in einem Emulator starten.

Ich habe nicht wirklich verwendet FreeDOS, aber ich nehme an, da Ihr Programm scheint Standard-C zu sein, werden Sie in der Lage sein zu verwenden, was die Standard-Compiler für FreeDOS ist.

Wenn Ihr Programm läuft in Millisekunden, und wenn Ihr auf Linux laufen, Stellen Sie sicher, dass Ihre Timer-Frequenz (auf Linux) auf 100 Hz eingestellt ist (nicht 1000Hz). (Cd / usr / src / linux; make menuconfig, und schauen Sie sich "Prozessortyp und Funktionen" -> "Timer-Frequenz") Auf diese Weise Ihre CPU wird alle 10 ms unterbrochen erhalten.

Darüber hinaus die Ansicht, dass die Standard-CPU-Zeitscheibe auf Linux 100ms ist, so mit einem schönen Niveau von -20, werden Sie nicht ausgeplant bekommen, wenn Sie für einige Millisekunden ausgeführt werden.

Auch Sie sind Looping 101 mal auf fn (). Bitte beachten Sie fn geben () einen No-op, um Ihr System richtig zu kalibrieren.

Statistiken Stellen (durchschnittlich + stddev) statt zu oft zu drucken (das wäre Ihre geplante Zeitscheibe verbrauchen, und das Terminal bekommt schließlich Zeitplan etc ... vermeiden, dass).

RDTSC Benchmark Beispielcode

Sie können verwenden chrt -f 99 ./test laufen ./test mit der maximalen Echtzeit-Priorität. Dann zumindest wird es nicht durch andere User-Space Prozesse unterbrochen werden.

Auch die Installation der linux-rt Paket wird eine Echtzeit-Kernel installieren, die Ihnen mehr Kontrolle über Interrupt-Handler Priorität über Gewinde Unterbrechungen geben.

Wenn Sie als root ausführen, können Sie sched_setscheduler () aufrufen und geben Sie sich eine Echtzeit-Priorität. Überprüfen Sie die Dokumentation.

Vielleicht gibt es eine Möglichkeit, preemptives Scheduling auf Linux zu deaktivieren, aber es ist vielleicht nicht nötig sein. Sie könnten möglicherweise Informationen von /proc/<pid>/schedstat oder ein anderes Objekt in /proc verwenden, um festzustellen, wann Sie vorbelegt sind, und diese Zeitproben außer Acht lassen.

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