# Puffer (Informatik)

Puffer (englisch buffer) sind in der Informatik und Telekommunikation Speicher für die Zwischenlagerung von Daten. Je nach Aufgabe kann der Puffer unterschiedlich strukturiert sein.
Ein Puffer speichert die Daten in der Regel zeitweise und kann in einem flüchtigen, aber auch in einem nichtflüchtigen Speicher angesiedelt sein.

## Formen von Pufferspeicherung
### Piping und Queueing (FIFO-Buffer)

Puffer zum Ausgleich von Unterschieden in der Verarbeitungsgeschwindigkeit ermöglichen es, einen Stau in einer Verarbeitung zu tolerieren, indem die Daten im Puffer zwischengelagert werden, bis sie bearbeitet werden können. Solche Puffer bilden eine Warteschlange (engl. pipe ‚Rohr‘ oder queue ‚Warteschlange‘) und funktionieren nach dem Prinzip First In – First Out. Technisch werden sie häufig als Ringpuffer implementiert. Puffer können hardware- oder softwareseitig implementiert werden, wobei die überwiegende Zahl von Puffern softwareseitig realisiert wird.
Typische Anwendungen sind die Druckwarteschlange, die Aufgaben für einen Drucker puffert, oder die Kommunikation von System- und Anwendungsprogrammen untereinander, die Interprozesskommunikation.

### Stacking (LIFO-Buffer)

Puffer zum Speichern eines Zustandes während einer Unterbrechung des Programmablaufs oder während des „Abstiegs“ in ein Unterprogramm nennt man im Allgemeinen Stack (‚Stapel‘). Sie funktionieren nach dem Prinzip Last In – First Out. Sie ermöglichen es dem Programm, nach der Unterbrechung genau dort fortzufahren, wo die Unterbrechung stattfand. Stack-Puffer werden auch manchmal benutzt, um Daten in einem Programm für die spätere Bearbeitung vorzumerken.
Der Stack gehört zu den frühesten Speichersystemen der Computertechnik. Auf Ebene der Maschinensprache wird er z. B. mittels der Anweisungen push/pop realisiert, was direkt auf den Stackpointer des Mikroprozessors einwirkt. Ein großer Nachteil des Stacks ist, dass er eine feste Größe hat – ein programmtechnisch nicht abgefangener Stacküberlauf (Sonderfall eines Pufferüberlaufs) ist ein schwerer und gefahrenträchtiger Programmierfehler und Angriffsbasis zahlreicher Malware.

### Caching und Mapping

Puffer für den schnelleren Zugriff auf Daten auf einem langsamen Speichermedium nennt man Cache (‚Versteck‘), insbesondere bei Hardware spricht man von Mapping (zu deutsch: „auf einer Karte eintragen“)
Beides heißt, einen Datenbereich in einem Speicher abzubilden. Beim Einlesen von Daten werden diese zusätzlich im Cache gespeichert, so dass sie beim erneuten Lesen direkt von dort übernommen werden können. Die Daten im Cache sind dabei frei über ihre Adresse zugänglich, wobei die Adressierung des unterliegenden Speichermediums nachgebildet wird. Schreibzugriffe erfolgen im laufenden Betrieb nur auf das Abbild (indirekter Zugriff).
Beim sequentiellen Lesen von Daten entspricht das Verhalten des Caches einem FIFO-Puffer, ein paralleles Verfahren hat den Vorteil, dass die eine Seite des gemappten Bereichs unabhängig davon befüllt werden kann, wie die Daten ausgelesen werden sollen.
Mapping wird etwa typischerweise bei dem Schreiben auf eine Festplatte oder einen USB-Stick eingesetzt: Das Betriebssystem arbeitet nur an einem vom Festspeicher gemappten Datensatz und kann daher schneller arbeiten. Endgültig geschrieben wird bei der Festplatte etwa bei Sektorwechsel, beim USB-Stick beim „Auswerfen“ – können die Daten nicht korrekt übertragen werden (Versagen von System, Leitung oder Speichereinheit, vorschnelles Entfernen), sind sie verloren.
Ein anderes Einsatzgebiet sind zeitkritische Anwendungen. Ein Beispiel ist der Framebuffer des Monitors, der in einem geschützten Speicherbereich oder auf der Grafikkarte liegt, und vom Grafiktreiber unabhängig von der Ausleserate des Anzeigegeräts befüllt werden kann. Sonderformen sind Doppelpufferung und Dreifachpufferung. Auch für das Brennen einer CD, bei denen eine Unterbrechung in der Versorgung mit Daten einen Fehler zur Folge hätte, benötigt man solche Puffer.

### Swapping und Paging (Virtual Memory)

Ziel des Virtual Memory (virtueller Speicher) ist, Daten aus einem schnelleren Speichermedium im langsameren vorzuhalten, indem derzeit nicht benutzte Datensätze ausgelagert werden. Dadurch kann der – meist teure – schnelle Speicher kleiner dimensioniert werden – das Virtual Memory gaukelt einen viel größeren aktiven Speicher vor. Dabei wird beim Swapping ein kompletter inaktiver Prozess, beim Paging ein Speicherblock ausgelagert. Typischer Pagebuffer ist die Auslagerungsdatei.
Typische Konzepte über die Kriterien, welche Prozesse/Daten geswappt werden, sind neben FIFO etwa least recently used (‚am längsten ungenutzt‘, LRU), least frequently used (‚am seltensten genutzt‘, LFU) oder not recently used (‚zuletzt ungenutzt‘, NRU).

### Heaping

Auch Speicherbereiche, die Programme für die spätere Bearbeitung mit Daten füllen, dienen der Datenstrompufferung. Hierzu reservieren sich die Programme einen über ihren geladenen Programmcode hinausgehenden Speicher. Heute beruht der Heap (engl. für Halde, daher auch Haldenspeicher) auf dynamischer Speicherreservierung, die das Betriebssystem auf Anforderung des Programms bedient – typische Programmbefehle zur Speicheranforderung sind malloc und realloc.

### Clipboarding

Clipboarding umfasst die Puffer, die nur eine fixierte Anzahl von Plätzen haben, die als solche aber unabhängig belegt und gelesen werden können. Die Zwischenablage etwa ist ein vom Betriebssystem zur Verfügung gestellter, anwendungsübergreifender Kleinspeicherbereich für das Zwischenspeichern von Daten. Sie erlaubt im Allgemeinen nur einen Datensatz, der vorherige wird immer überschrieben.