Gepuffertes gegen ungepuffertes IO
Habe ich gelernt, dass durch Standard-I/O-Programme gepuffert ist, ich.e Sie serviert wird, von einem temporären Speicher in das anfordernde Programm.
Ich verstehe, dass die Pufferung verbessert die IO-Leistung (vielleicht durch eine Verringerung der system calls). Ich habe schon Beispiele gesehen, deaktivieren Sie die Pufferung, wie setvbuf
in C. Was ist der Unterschied zwischen den zwei Modi und Wann sollte man sich über die anderen?
InformationsquelleAutor der Frage sud03r | 2009-09-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du willst Ungepufferte Ausgabe, Wann immer Sie wollen, um sicherzustellen, dass die Ausgabe geschrieben wurde, bevor Sie fortfahren. Ein Beispiel ist der standard-Fehler unter eine C-Laufzeit-Bibliothek ist in der Regel Ungepuffert standardmäßig. Da sind die Fehler (hoffentlich) selten, möchten Sie wissen, über Sie sofort. Auf der anderen Seite, standard-Ausgabe ist gepuffert, einfach weil es davon ausgegangen, es werden weit mehr Daten, die über es.
Weiteres Beispiel ist eine logging-Bibliothek. Wenn Ihre log-Nachrichten in Puffern, die in Ihrem Prozess, Ihren Prozess core-dumps gibt es eine sehr gute chance, die Ausgabe wird nie geschrieben werden.
Zusätzlich, es ist nicht nur die system-Aufrufe, minimiert aber die disk-I/O sowie. Lassen Sie uns sagen, ein Programm liest eine Datei ein byte zu einem Zeitpunkt. Mit ungepufferten Eingabe, werden Sie gehen, um die (relativ langsame) Festplatte für jedes byte, obwohl es wahrscheinlich ist zu Lesen in einem ganzen block sowieso (die hardware Ihrer Festplatte an sich haben können Puffer, aber du bist noch aus der Festplatten-controller, die gehen, um langsamer als in-memory-access).
Durch die Pufferung der ganze block gelesen, um den Puffer auf einmal, dann die einzelnen bytes geliefert werden, um Sie von der (in-memory, unglaublich schnell) Pufferzone.
Beachten Sie, dass die Pufferung kann viele Formen annehmen, wie im folgenden Beispiel:
InformationsquelleAutor der Antwort paxdiablo
Du willst Ungepuffert-Ausgang, wenn Sie bereits große Folge von bytes bereit zu schreiben auf die Festplatte, und möchten vermeiden Sie eine zusätzliche Kopie in einen zweiten Puffer in der Mitte.
Gepufferten Ausgabe-streams sammeln, schreiben der Ergebnisse in einem Zwischenpuffer, dem senden an die OS-Datei-system nur, wenn genug Daten gesammelt hat (oder
flush()
angefordert wird). Dies reduziert die Anzahl der Datei-system-Aufrufe. Seit Dateisystem Anrufe können teuer sein, auf den meisten Plattformen (im Vergleich zu kurzenmemcpy
), gepufferte Ausgabe ist ein Netto-Gewinn, wenn die Durchführung einer großen Anzahl von kleinen schreibt. Ungepufferte Ausgabe ist in der Regel besser, wenn Sie bereits über große Puffer zum senden -- kopieren der Daten auf einem zwischengeschalteten Puffer wird nicht reduzieren die Anzahl der Betriebssystem-Aufrufe weiter, und führt zu zusätzlichen arbeiten.Ungepuffert-Ausgang hat nichts zu tun, sicherzustellen, dass Ihre Daten an der Festplatte; diese Funktionalität wird durch
flush()
und arbeitet auf beiden gepufferte und Ungepufferte streams. Unbuffered-IO schreibt keine Garantie für die Daten erreicht hat, den physischen Datenträger -- die OS-Datei-system frei zu halten, um eine Kopie Ihrer Daten auf unbestimmte Zeit, nie zu schreiben auf die Festplatte, wenn Sie es will. Es ist nur erforderlich, die zu Begehen es auf die Festplatte, wenn Sie aufrufenflush()
. (Beachten Sie, dassclose()
rufenflush()
auf Ihren Namen).InformationsquelleAutor der Antwort