Queuing – Warteschlangentheorie für Embedded-Software

Seite: 2/12

Modell einer Message Queue

Eine Message Queue besteht aus Speicherlokationen zur temporären Speicherung von Daten, die von einer Task zu einer anderen weitergegeben werden (bzw. von/zu einer Interrupt-Service-Software). Ein Datensatz wird als „Message“ (Nachricht) bezeichnet. Wenn eine neue Message in einer Queue gespeichert wird, in der sich schon Messages befinden, wird die neue Message den vorhandenen Messages in der Queue hinzugefügt. Wird eine Message aus der Queue entfernt, bleiben keine ihrer Daten in der Queue gespeichert.

In der Fachsprache wird dies auch als „Zerstörungsfreies Schreiben/ Zerstörendes Lesen“ bezeichnet. Dies lässt sich mit dem vereinfachten Modell einer Queue verdeutlichen, hier als Abfüllanlage für Olivenöl. Über einen Trichter wird Olivenöl in Flaschen gefüllt. Der Trichter hat oben eine breite Öffnung und kann damit viel Olivenöl aufnehmen (vgl. Software-Messages). Unten hat er eine schmale Öffnung, so dass die Menge begrenzt wird, mit der das Olivenöl aus dem Trichter austritt (analog: Softwareprozess, in dem Messages langsam empfangen und verarbeitet werden können).

Die Rate, mit der das Olivenöl in den Trichter gefüllt wird (bzw. Messages der Message-Queue hinzugefügt werden), ist Pr(t) - die so genannte Production Rate (Eingangsrate). Die Rate, mit der das Olivenöl unten aus dem Trichter austritt (bzw. Messages aus der Message-Queue entfernt werden), ist Cr(t) - die Consumption Rate (Ausgangsrate). Sowohl Pr(t) als auch Cr(t) sind abhängig von der Zeit t. Ein- und Ausgang sind also über die Zeit veränderlich.

Wann ist eine Message Queue sinnvoll?

Es scheint also fast, als wären Olivenöltrichter bzw. Message Queues gar nicht sinnvoll. Und das sind sie auch tatsächlich nur in einem Szenario:

Nur wenn die Production Rate für eine kurze Zeit T größer ist als die Consumption Rate, also Pr(t) > Cr(t) zu den Zeitpunkten t innerhalb der Zeitspanne T, ist ein Olivenöltrichter bzw. eine Message Queue sinnvoll. Diese kurze Zeit T kann man auch als „Burst“ (Stoßzeit) bezeichnen. Ein Trichter oder eine Queue kann nur während eines gelegentlichen Bursts einen temporären Überschuss an Production gegenüber Consumption absorbieren. Ein Trichter bzw. eine Queue ist also nur sinnvoll, wenn die Production Rate während eines zeitlich begrenzten Bursts größer ist als die Consumption Rate. Diese Bursts sollten über die Zeit verteilt sein.

Viele Softwareentwickler übersehen diese Einschränkung beim Einsatz von Message Queues oder anderen Methoden zur Daten-Zwischenspeicherung und greifen viel zu häufig darauf zurück. Sollen Ihre Queues, Ringpuffer oder Pufferpools tatsächlich Daten speichern, die in Bursts ankommen? Wenn Daten gespeichert werden müssen, die viel schneller eintreffen als sie verarbeitet werden können, wird die Kapazität mit Sicherheit irgendwann überschritten.

(ID:44833511)