La compréhension de Rubis et d'OS I/O tampon
Comment IO de mise en mémoire tampon de travail en Ruby? À quelle fréquence les données vidées dans le flux sous-jacent lors de l'utilisation de la IO
et File
classes? Comment cela se compare à des OS de mise en mémoire tampon? Ce qui doit être fait pour garantir que les données ont été écrites sur le disque, avant toute confiance en les lisant pour le traitement?
InformationsquelleAutor jrdioko | 2011-07-14
Vous devez vous connecter pour publier un commentaire.
Le Rubis IO documentation n'est pas 100% clair sur la façon dont cette mise en mémoire tampon des œuvres, mais c'est ce que vous pouvez extraire de la documentation:
Les méthodes pertinentes à regarder:
IO.rincer
: Bouffées de chaleurIO
. J'ai aussi regardé le Ruby source et un appel àIO.flush
également les appels de l'OS sous-jacentfflush()
. Cela devrait être suffisant pour obtenir le fichier mis en cache, mais ne garantit pas de données physiques sur le disque.IO.sync=
: Si la valeur detrue
, pas de Ruby interne de mise en mémoire tampon est fait. Tout est immidiately envoyé à l'OS, etfflush()
est appelée pour chaque écriture.IO.sync
: Renvoie le paramètre de synchronisation (true
oufalse
).IO.fsync
: Bouffées de chaleur à la fois le Rubis tampons + appelsfsync()
sur le système d'exploitation (si elle accepte). Ce sera la garantie d'une pleine chasse tout le chemin sur le disque physique de fichier.IO.fermer
: Ferme le RubisIO
et écrit les données en attente de l'OS. Notez que cela ne signifie pasfsync()
. POSIX documentation surclose()
dit qu'il ne garantit PAS que les données sont écrites physiquement sur le fichier. Si vous avez besoin d'utiliser explicitefsync()
appel pour que.Conclusion:
flush
et/ouclose
devrait être suffisant pour obtenir le fichier mis en cache afin qu'il puisse être lu entièrement par un autre processus ou une opération. Pour obtenir le fichier de tout le chemin vers le support physique avec certitude, vous devez appelerIO.fsync
.Autres méthodes:
IO.syswrite
: Bypass Ruby tampons internes et straight OSwrite
. Si vous utilisez ce alors ne les mélangez pas avecIO.read/write
.IO.sysread
: Même que ci-dessus, mais pour la lecture.Ruby fait son interne de mise en mémoire tampon sur le dessus de l'OS. Quand vous faites fichier.rincer Ruby bouffées de chaleur la mémoire tampon interne. Pour s'assurer que le fichier est écrit sur le disque que vous devez faire fichier.fsync. Mais à la fin vous ne pouvez pas être certain que le fichier est écrit sur le disque de toute façon, ça dépend de l'OS, le contrôleur de disque dur et le disque dur.