Gibt es 3 oder 2 Pufferebenen, wenn die stdio-Bibliothek verwendet wird?

Gibt es 3 oder 2 Pufferebenen, wenn die stdio-Bibliothek verwendet wird?

AusDie Linux-Programmierschnittstelle:
(Ich habe die entsprechenden Abschnitte gelesen. Dieses Übersichtsdiagramm habe ich nur zur Veranschaulichung eingefügt.) Bildbeschreibung hier eingeben

Ich weiß, dass es für direkte E/A readund writeSystemaufrufe zwei Pufferebenen gibt. read/write buffer+ kernel buffer.

Bei der Verwendung von stdioBibliotheksaufrufen, die auf direkten System-IO-Aufrufen aufbauen, ist

  1. stdio buffer+ read/write buffer+ kernel buffer, 3 Pufferstufen,

oder

  1. stdiound write/readteilen 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 writeden 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 copyusw. vorgeschlagen. Der Punkt ist, dass es stdioIhnen sagt, was die Wirkung ist, nicht, wie sie erreicht wird.

verwandte Informationen