Je l'ai appris par E/S par défaut dans les programmes est mise en tampon, i.e. ils sont servis d'un stockage temporaire au programme demandeur. Je comprends que la mise en mémoire tampon améliore les performances des E/S (peut-être en réduisant les appels système). J'ai vu des exemples de mise en mémoire tampon désactivée, comme setvbuf
en C. Quelle est la différence entre les deux modes et quand doit-on être utilisé par rapport à l'autre?Buffered vs unbuffered IO
Répondre
Vous voulez une sortie unbuffered chaque fois que vous voulez vous assurer que la sortie a été écrit avant de poursuivre. Un exemple est l'erreur standard sous une bibliothèque d'exécution C - elle est généralement non tamponnée par défaut. Puisque les erreurs sont (espérons-le) peu fréquentes, vous voulez les connaître immédiatement. D'autre part, la sortie standard est tamponnée simplement parce qu'il est supposé qu'il y aura beaucoup plus de données qui la traversent.
Un autre exemple est une bibliothèque de journalisation. Si vos messages de log sont stockés dans des tampons dans votre processus, et que votre processus est vide, il y a de fortes chances que la sortie ne soit jamais écrite.
En outre, il n'y a pas que les appels système qui sont réduits au minimum, mais le disque E/S ainsi. Disons qu'un programme lit un fichier un octet à la fois. Avec une entrée sans tampon, vous allez sortir le disque (relativement très lent) pour chaque octet même s'il doit probablement lire dans un bloc entier de toute façon (le matériel du disque lui-même peut avoir des tampons mais vous allez toujours sur le contrôleur de disque qui va être plus lent que l'accès en mémoire).
En mémoire tampon, le bloc entier est lu dans la mémoire tampon à la fois les octets individuels sont livrées à partir du (en mémoire, incroyablement rapide) zone tampon.
Gardez à l'esprit que le buffering peut prendre plusieurs formes, comme dans l'exemple suivant:
+-------------------+-------------------+
| Process A | Process B |
+-------------------+-------------------+
| C runtime library | C runtime library | C RTL buffers
+-------------------+-------------------+
| OS caches | Operating system buffers
+---------------------------------------+
| Disk controller hardware cache | Disk hardware buffers
+---------------------------------------+
| Disk |
+---------------------------------------+
Vous voulez sortie unbuffered lorsque vous avez déjà grande séquence d'octets prêts à écrire sur le disque, et que vous voulez évitez une copie supplémentaire dans un second tampon au milieu.
flux de sortie tamponnées accumuleront des résultats d'écriture dans un tampon intermédiaire, en l'envoyant au système de fichiers du système d'exploitation uniquement lorsque suffisamment de données est accumulée (ou flush() est demandée). Cela réduit le nombre d'appels système de fichiers. Étant donné que les appels de système de fichiers peuvent être coûteux sur la plupart des plates-formes (par rapport aux memcpy courts), la sortie mise en mémoire tampon est une victoire nette lors de l'exécution d'un grand nombre de petites écritures. La sortie sans tampon est généralement meilleure lorsque vous avez déjà de gros tampons à envoyer - la copie vers un tampon intermédiaire ne réduit pas le nombre d'appels de système d'exploitation et introduit un travail supplémentaire.
La sortie non tamponnée a rien à voir avec pour s'assurer que vos données atteignent le disque; Cette fonctionnalité est fournie par flush() et fonctionne sur les flux tamponnés et non tamponnés. Les écritures d'E/S non tamponnées ne garantissent pas que les données ont atteint le disque physique - le système de fichiers du système d'exploitation est libre de conserver indéfiniment une copie de vos données, ne l'écrit jamais sur le disque, s'il le souhaite. Il est uniquement nécessaire de le valider sur le disque lorsque vous invoquez flush(). (Notez que close() appellera flush() en votre nom).
L'appel de 'flush()' garantit-il qu'il est écrit sur le disque? Je pensais que cela ne le passait que sur le tampon du disque. – jrdioko
Vous avez besoin de 'O_SYNC' pour garantir les écritures. – moshbear