Pufferung - <stdio.h>



  • Hallo Ansic C-Gurus 😉

    Als ich ich im Zusammenhang mit Puffern bzw. deren spezieller Terminierung im Ethernet Bereich bei Google gesucht habe ist mir folgendes in die Hände gefallen:
    http://www.pronix.de/pronix-790.html

    Eine kurze Erklärung zur Pufferung: Die Standardeinstellung ist bei ANSI C Compilern die Vollpufferung. Dies ist auch sinnvoller und schneller als keine Pufferung, da wenige Lese- und Schreiboperationen etwa auf der Festplatte, der Diskette oder dem Arbeitsspeicher stattfinden. Die Puffergröße ist abhängig vom Compiler, liegt aber meistens bei 512 und 4096 Bytes. Die Größe ist in der Headerdatei <stdio.h> mit der Konstante BUFSIZ angegeben.

    Hmm was meint der Autor mit diesen Sätzen?

    Die Standardeinstellung ist bei ANSI C Compilern die Vollpufferung. Dies ist auch sinnvoller und schneller als keine Pufferung, da wenige Lese- und Schreiboperationen etwa auf der Festplatte, der Diskette oder dem Arbeitsspeicher stattfinden

    Das verstehe ich schon gar nicht, denn wenn ich Dateien mit fgets auslese gebe ich doch die Pufferlänge mit bzw. verwende Puffer mit fester Größe? Was versteht dann der Autor unter Vollpufferung? Ich verstehe den Zusammenhang nicht....

    Bei Vollpufferung läuft dies so: Es wird so lange gelesen, bis der Puffer voll ist (BUFSIZE), und dann wird geschrieben. Im obigen Beispiel würde bei Vollpufferung einmal gelesen und einmal geschrieben.

    hö? wenn ich mein char array 80 Zeichen groß mache, ich aber beim fgets nur 60 angebe werden auch nur 60 zeichen gelesen...

    Oder meint der Autor etwas ganz anderes mit der Pufferung 😕

    Wäre super wenn mir das jemand von Euch erklären könnte



  • codefrag schrieb:

    Das verstehe ich schon gar nicht, denn wenn ich Dateien mit fgets auslese gebe ich doch die Pufferlänge mit bzw. verwende Puffer mit fester Größe? Was versteht dann der Autor unter Vollpufferung? Ich verstehe den Zusammenhang nicht....

    damit ist eher die andere richtung gemeint. die stdio lib hat 'nen eingebauten buffer um schreiboperationen zu beschleunigen. also z.b. ein 'fwrite()' schreibt erstmal in den buffer und erst wenn der voll ist (oder man fclose, fflush, etc. aufruft) wandert's auf die platte. grund: die systemfunktion zum schreiben wird seltener aufgerufen und manche dateisystem mögen's besonders gern, wenn man denen daten häppchenweise vorsetzt, die ein vielfaches der sektorgrösse sind. einstellen kann man die puffergrösse z.b. mit 'setvbuf()'.

    btw: wie 'pronix' schreibt: 'die puffergrösse ist abhängig vom compiler' - das ist einfach nur gelogen 😉



  • net schrieb:

    damit ist eher die andere richtung gemeint. die stdio lib hat 'nen eingebauten buffer um schreiboperationen zu beschleunigen. also z.b. ein 'fwrite()' schreibt erstmal in den buffer und erst wenn der voll ist (oder man fclose, fflush, etc. aufruft) wandert's auf die platte. grund: die systemfunktion zum schreiben wird seltener aufgerufen und manche dateisystem mögen's besonders gern, wenn man denen daten häppchenweise vorsetzt, die ein vielfaches der sektorgrösse sind. einstellen kann man die puffergrösse z.b. mit 'setvbuf()'.

    btw: wie 'pronix' schreibt: 'die puffergrösse ist abhängig vom compiler' - das ist einfach nur gelogen 😉

    D.h. wenn ich Daten mit scanf/fscanf lese, werden diese erst in einem Puffer der stdio.h kopiert und dann in die Varaible die ich beim scanf/fscanf angeben kopiert?
    Nehmen wir an mein Buffer ist 4096 Byte groß. Ich benutze aber nur ein Zeichen zur Eingabe (= 1 Byte) dann wird der Buffer ja nicht vollständig beschrieben. Es sind noch 4095 Bytes frei, die bei den nächsten Streams (= Eingabe von Daten oder schreiben von Daten in File mittels fwrite) aufgefüllt werden.
    Gibt es einen Buffer für Outputs (= z.B fwrite) und einen für Input (= z.B fgets) oder wird einer für alle Streamrichtungen benutzt?

    D.h. der Buffer wird eigentlich von verschiedensten Datenquellen (Filestream) oder Tastutureingaben fragmentiert und gleichzeitig belegt.

    Naja wenns Compilerabhängig wäre hätte ja jeder Compiler ne eigene stdio.h :p

    Vielen Dank erstmal 👍



  • codefrag schrieb:

    Gibt es einen Buffer für Outputs (= z.B fwrite) und einen für Input (= z.B fgets) oder wird einer für alle Streamrichtungen benutzt?

    ich nehme mal an für jeden FILE*, den man aufmacht, gibt's einen eigenen buffer.
    bei 'reads' könnte es z.b. so ablaufen:
    1. programm: fread(10 bytes) stdio: read(512 bytes), 10 bytes zum programm
    2. programm: fread(20 bytes) stdio: 20 bytes zum programm
    3. programm: fread(500 bytes) stdio: 482 bytes zum programm, read(512 bytes), 18 bytes zum programm
    usw...

    also immer so, dass die system-read funktion eine feste grösse liesst und somit der durchsatz maximiert wird.

    aber vielleicht täusche ich mich auch. mal abwarten, vielleicht kann noch jemand was dazu schreiben...


Anmelden zum Antworten