ein Kapitel zurück                                           ein Kapitel weiter

Oft ist immer die Rede von der Pufferung der Daten bei Ein-/Ausgabe. Selten erfährt man aber dazu etwas genaueres. Ich möchte mit diesem Kapitel etwas mehr Licht dazu in den Tunnel bringen. Ich gehe hierbei vom Betriebssystem Linux aus. Wie die Verwaltung des Puffers unter Windows/DOS läuft ist mir nicht geläufig, würde mich aber über Informationen dazu freuen.

Wie kommen also die Datenblöcke von der Festplatte zum Programm und wieder dorthin zurück? Ein direkter Datenaustausch zwischen der Festplatte und dem Anwendungsprogramm wäre zu Zeitaufwendig. Besonders bei größeren Dateien die geladen bzw. gespeichert werden müssten. Aus diesem Grund werden die Datenblöcke im Arbeitsspeicher gepuffert (zwischengespeichert) Dies ist ein Speicherbereich auf den nur das Betriebssystem zugreifen kann. Man spricht dabei vom Buffer-Cache. Wollen wir uns doch zuerst mal ein Zeichnung dazu ansehen wie dies abläuft....



Beginnen wir mit dem Lesen von der Festplatte:

Zuerst sieht das Datei-System von Linux nach ob sich entsprechende Blöcke bereits im Puffer befinden. Falls ja wird diese Datei gleich ins Programm eingelesen.

Falls sich die Datenblöcke noch nicht im Puffer befinden werden diese vom Datei-System über den Gerätetreiber von der Festplatte angefordert. Befinden sich die Angeforderten Daten im Puffer sendet der Gerätetreiber ein Interupt und signalisiert somit das sich die Daten im Puffer befindet. Nun holt sich das Datei-System die Datenblöcke aus dem Puffer und gibt diese Daten weiter an unser Programm das die Daten angefordert hat.

Schreiben auf die Festplatte:

Zuerst legt unser Datei-System die Daten in den Puffer, bis der Puffer "voll" ist. Erst dann werden die Datenblöcke die sich im Puffer befinden auf die Festplatte geschrieben.

Wenn ich von einem Datei-System spreche, meine ich damit z.B. ext2, ext3, ReiserFS, sysV, msdos, proc....

Da die Pufferverwaltung Teil des Kernel ist, will ich nicht tiefer in das Detail gehen. Aber sollten sie sich mehr dafür Interessieren, hier ein paar Anhaltspunkte.

Die Struktur des Puffers finden sie in der Headerdatei...


/usr/src/linux/include/fs.h

Halten sie dort nach der Struktur....

struct buffer_head

...Ausschau. Da die Pufferung mit Hilfe einer Hash-Liste reallisiert wird, befindet sich in der Datei.....

/usr/src/linux/fs/buffer.c

...die Funktion buffer_init womit durch die Größe Ihres Arbeitsspeichers die genaue Anzahl der Teillisten festgelegt wird (Variable nr_hash). Beispielsweise bei 64MB Hauptspeicher.......

if(memsize >= 64*1024*1024)
 nr_hash=65521;

...hier werden 65521 Teillisten angelegt.

Desweiteren befinden sich in buffer.c die Makros hashfn und hash womit der Index der Hash-Liste errechnet wird. Für die weiteren Operationen können sich den weiteren Quellcode von buffer.c durchlesen. Zugegeben das war nur ein kleiner Einblick zu diesem Thema, aber dies soll ein C-Kurs bleiben und keine Kernel-Hacking-Kurs.

ein Kapitel zurück          nach oben           ein Kapitel weiter


© 2001,2002 Jürgen Wolf