AusDie Linux-Programmierschnittstelle:
(Ich habe die entsprechenden Abschnitte gelesen. Dieses Übersichtsdiagramm habe ich nur zur Veranschaulichung eingefügt.)
Ich weiß, dass es für direkte E/A read
und write
Systemaufrufe zwei Pufferebenen gibt. read/write buffer
+ kernel buffer
.
Bei der Verwendung von stdio
Bibliotheksaufrufen, die auf direkten System-IO-Aufrufen aufbauen, ist
stdio buffer
+read/write buffer
+kernel buffer
, 3 Pufferstufen,
oder
stdio
undwrite/read
teilen sich den gleichen Puffer, 2 Ebenen der Pufferung
stdio calls
<---> user buffer
<-----> read/write
+kernel buffer
?
(Ich glaube, es sind zwei Pufferebenen, aber ich möchte sicher sein.)
Antwort1
Im Normalfall gibt es zwei Ebenen. Ein Puffer im Benutzerbereich wird von der stdio-Bibliothek zugewiesen, und Aufrufe von puts/printf/fprintf usw. fügen Zeichen in diesen Puffer ein. Irgendwann (z. B. wenn der Puffer voll ist oder eine neue Zeile geschrieben wird und der Stream sich im zeilengepufferten Modus befindet) ruft die stdio-Bibliothek write
den Kernel auf, um ihn aufzufordern, den Puffer zu schreiben. Der Kernel kopiert den Puffer normalerweise in einen Kernelpuffer, startet alles, was zum Übertragen der Daten an das Ziel erforderlich ist, und kehrt zurück. Der Benutzerbereich kann den Benutzerbereichspuffer dann beliebig verwenden.
Es ist möglich (aber ungewöhnlich), dass es verschiedene Implementierungen von stdio gibt, die dies unterschiedlich tun.sfioverfügt über eine Stdio-Kompatibilitätsschicht. Es wurden verschiedene Schemata für zero copy
usw. vorgeschlagen. Der Punkt ist, dass es stdio
Ihnen sagt, was die Wirkung ist, nicht, wie sie erreicht wird.