UNIX-gebufferde versus ongebufferde I/O

Wat is het verschil tussen Unbuffered I/O en standaard I/O? Ik weet dat het gebruik van read (), write (), close() niet-gebufferde IO is. Printf en gets zijn gebufferde IO. Ik weet ook dat het beter is om gebufferde IO te gebruiken voor grote transacties. Ik weet gewoon niet de reden waarom. En wat betekent de term "gebufferd" in deze context?

1
Strikt genomen, lees Linux onder andere kernel gebufferd tenzij O_DIRECT is ingeschakeld. Voor uw context betekent bufferen dat de C-bibliotheek een interne array onderhoudt die niet wordt leeggemaakt na elke I/O-functie-aanroep. Integendeel, fflush moet worden aangeroepen. Evenzo kan de leesbuffer tijdens het lezen minder per oproep hangen veroorzaken.
toegevoegd de auteur moshbear, de bron
Uit de handleiding: voor uitvoerstromen forceert fflush() een schrijven van alle door de gebruikersruimte gebufferde gegevens voor de gegeven uitvoer- of updatestroom via de onderliggende schrijffunctie van de stroom. Voor invoerstromen verwijdert fflush() alle gebufferde gegevens die zijn opgehaald uit het onderliggende bestand, maar niet zijn gebruikt door de toepassing.
toegevoegd de auteur moshbear, de bron
@moshbear: Kunt u alstublieft verduidelijken wat fflush doet? Lost dit c interne array of de gebufferde cache op?
toegevoegd de auteur FourOfAKind, de bron
toegevoegd de auteur Dave, de bron

1 antwoord

Niet-gebufferde I/O betekent eenvoudigweg dat er geen buffer wordt gebruikt tijdens het lezen of schrijven. In het algemeen wanneer we systeemaanroepen gebruiken zoals lezen() en schrijven (), lezen en schrijven ze char by char en kunnen ze enorme prestatieafbraak veroorzaken. Dus voor grote datums hebben algemeen hoge lees-/schrijfwaarden of gewoon gebufferde I/O de voorkeur. Gebufferd betekent eenvoudigweg dat we niet te maken hebben met enkelvoudige char, maar een blok met tekens, dat is waarom het soms ook bekend staat als block I/O.Generally in Unix wanneer we lees-/schrijffuncties op hoog niveau gebruiken, halen of bewaren ze de gegevens van een gegeven blokgrootte en plaatsen ze in buffercache en uit deze buffercache halen deze I/O-functies de gewenste hoeveelheid gegevens.

4
toegevoegd