Ringpuffer

Der Ringpuffer ist ein FIFO-artiger Datenspeicher, der meist ein Datenfeld fester Größe benutzt. Dadurch benötigen zeitkritische Abläufe, keinen Zugriff auf die Speicherverwaltung. Ringpuffer werden gerne, bei Audiotreibern, Eventsystemen oder zum Datenaustausch zwischen zwei nebenläufigen Prozessen benutzt.

Beispiel (Quellcode): ringbuffer.cpp
Download (Quellcode): ringbuffer.zip

Beschreibung

Ringpuffer Schaubild Durch zwei Zähler werden die Lese- und Schreibposition dargestellt. Wird ein Element ausgelesen, wird die Leseposition erhöht. Beim Hinzufügen eines Elements, erhöht sich die Schreibposition. Beim Erreichen des Datenfeldlimits, wird die Position auf den Anfang des Feldes zurückgesetzt. Alternativ kann auch ein Modulo oder eine andere Operation sicherstellen, dass die Position innerhalb des Datenfelds liegt und fortlaufend ist. Sind beide Positionen gleich, ist das Feld leer. Wären nach dem nächsten Hinzufügen beide Position gleich, ist das Feld voll.

Zum Austausch zwischen zwei Prozessen, bei denen einer der Datenerzeuger und einer der Datenempfänger ist, können auch sperrungsfreie Ringpuffer verwendet werden. Dies erhöht den Datendurchsatz erheblich.

Codeanmerkungen

  1. Das erste Programmargument gibt die Größe des Ringpuffers an.

    CRingBuffer<int> buffer(atoi(argv[1]));
    84
    
  2. Die restlichen Parameter werden als Ganzzahlen hinzugefügt. Ein 'd' gibt das aktuelle Datenfeld komplett aus und ein 'p' löscht eine Ganzzahl aus dem Puffer.

    for(int n=2; n<argc; n++)
    86
    
  3. So ergibt

    ./ringbuffer 5 1 2 3 4 d p p d 5 6 7 d
    

    die Ausgabe

    Ring buffer test...
    
     Pushed 1
     Pushed 2
     Pushed 3
     Pushed 4
     Debug Capacity: 4/5 Read (>): 0 Write (<): 4 | > 1 2 3 4 < 0 
     Popped 1
     Popped 2
     Debug Capacity: 2/5 Read (>): 2 Write (<): 4 | 1 2 > 3 4 < 0 
     Pushed 5
     Pushed 6
     Pushed 7
     Debug Capacity: 5/5 Read (>): 2 Write (<): 2 | 6 7 > < 3 4 5