![ein Kapitel weiter](../weiter.gif)
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....
![](puffer.png)
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 weiter](../weiter.gif)
© 2001,2002 Jürgen Wolf
|