Scheduling-Verfahren für ein Messprogramm



  • Hallo,

    ich hoffe ich bin mit meiner Problemstellung im richtigen Forum, ich hab leider nichts gefunden was besser geeignet wäre um nach einem Scheduling-Algorithmus zu fragen.

    Z.Z. bin ich dabei, ein Scheduling-Verfahren für ein Messtechnik-Programm (C++ unter Linux) auszusuchen. Die Konfiguration vom Programm kann vom Nutzer per Konfigurationsdatei erstellt werden. In der Praxis wird es meistens etwa so aussehen:

    - bis zu 150 Kanäle; jeder Kanal führt entweder eine Messung mit einem Messgerät durch oder ruft andere Kanäle auf, die dann Messungen durchführen. d.h. ich habe dynamisch veränderliche Zeiten für die Messungen.
    - Prozesszeit (für eine Messung) ca 50 msec bis 200 msec;
    - Intervalle wann ein Kanal mind. einmal gemessen werden muss: bis zu 10 Kanäle mit 1 Sek, die anderen Kanäle 20, 30, 60 oder 300 Sek
    - Seltener muss das Programm TCP/IP-Anfragen verarbeiten und beantworten, oder Messwerte in Dateien schreiben.

    Die Auslastung kann u.U. auch mal gut über 100% liegen (allein 10 Kanäle mit 1 Sek-Intervall und 100msec Prozeszeit wären ja schon 100% Auslastung).

    Die CPU ist keineswegs ausgelastet, muss aber auf die Messergebnisse warten. Da die Messungen mit wenigen Geräten (bspw. einem Mehrkanal-DMM und einem Zählermodul) durchgeführt werden, bringt mich Thread-Programmierung nicht weiter.

    Beim Vorgänger-Programm wurde "Earliest Deadline First" verwendet. Probleme:
    - Bei geringer Auslastung wird immer der schnellste Kanal übermäßig oft gemessen, während die anderen in ihrer normalen Zeit gemessen werden (was unschön, aber nicht verheerend ist).
    - Bei hoher Auslastung sind die Fehlerzeiten bei schnellen Kanälen in etwa genauso groß wie bei den langsam zu messenden. Wünschenswert wäre dass die schnellen Kanäle (1 Sek-Intervall) kleinere Fehlerzeiten haben als die langsameren.

    Ich habe mir mal Prioritätenscheduling mit Aging angesehen und denke, wenn man die Prioritäten aus den Intervallzeiten und der Anzahl der Kanäle richtig berechnen könnte, wäre das ein gutes Verfahren. Allerdings hab' ich keine Ahnung wie ich das anstellen kann. Ein Problem ist dabei, dass - sobald eine Reihe langsamer Kanäle (bspw. 60Sek-Intervall) in ihrer (für alle gleichen) Priorität hoch genug ist um aufgerufen zu werden - die komplette Reihe langsamer Kanäle gemessen würde, bevor wieder ein schneller Kanal gemessen wird. Damit kriegt der schnelle Kanal einen hohen Zeitfehler.

    Im Moment tendiere ich zum EDF-Verfahren, aber ich wär auch froh wenn es eine elegantere Möglichkeit gäbe.



  • Hallo Radix,

    ich versteh nicht ganz dein Problem, in welche Richtung willst du Optimieren und wie sieht der normal Fall aus?
    Also sind die 10 langsamen Messungen die Normale Auslastung und wie wichtig ist die Timing Genauigkeit.
    Ich hab auf der arbeit ein aehnliches System nur wir haben ein Job queue der nacheinander abgearbeitet wird und der Anwender muss darauf aufpassen das seine Messungen in der richtigen Reihenfolge passieren und das System auslasten, aber wir haben keine dynamische Umgebung.

    gruss O.G.Wrapper



  • Also das Programm läuft nicht interaktiv, es liest nur einmal beim Programmstart über eine Konfigurationsdatei ein welche Kanäle es hat, wie oft diese gemessen werden müssen etc.

    Die meiste Zeit wird es so sein dass die "statischen" Kanäle aus der Konfigurationsdatei gemessen werden. Aber abhängig von deren Messergebnissen müssen evtl. andere Kanäle dynamisch nachgemessen werden.

    Es gibt Kanäle die ca. einmal pro Sekunde gemessen werden müssen (Volumenstrom einer Flüssigkeit, der sich schnell verändern kann) und welche bei denen einmal pro Minute reicht (Bsp: Außentemperatur). Wenn meine Auslastung zu hoch ist, möchte ich nicht, dass sowohl der Volumenstrom als auch die Temperaturmessung beide bspw 30 Sekunden nachhinken, sondern dass der Volumenstrom vielleicht wenige Sekunden, die Temperatur dafür zwei Minuten nach der Deadline gemessen werden.


Anmelden zum Antworten