Entendiendo el búfer de E/S de Ruby y OS
operating-system io (2)
La documentación de Ruby IO no es 100% clara sobre cómo funciona este almacenamiento en búfer, pero esto es lo que puede extraer de la documentación:
- Ruby IO tiene su propio buffer interno
- Además de que el sistema operativo subyacente puede o no puede almacenar datos adicionales.
Los métodos relevantes para mirar:
-
IO.flush
:IO.flush
IO
. También miré la fuente de Ruby y una llamada aIO.flush
también llama al sistema operativo subyacentefflush()
. Esto debería ser suficiente para obtener el archivo en caché, pero no garantiza datos físicos en el disco. -
IO.sync=
: si se establece entrue
, no se realiza el almacenamiento en búfer interno de Ruby. Todo se envía inmediatamente al sistema operativo, y se llama afflush()
para cada escritura. -
IO.sync
: devuelve la configuración de sincronización actual (true
ofalse
). -
IO.fsync
:IO.fsync
ambos buffers de Ruby + llama afsync()
en el sistema operativo (si es compatible). Esto garantizará una descarga completa hasta el archivo del disco físico. -
IO.close
: cierra RubyIO
y escribe los datos pendientes en el sistema operativo. Tenga en cuenta que esto no implicafsync()
. La documentación de POSIX enclose()
dice que NO garantiza que los datos se escriban físicamente en el archivo. Así que necesitas usar una llamadafsync()
explícita para eso.
Conclusión: el flush
y / o el close
deben ser suficientes para que el archivo se almacene en caché para que pueda leerse completamente mediante otro proceso u operación. Para obtener el archivo hasta el medio físico con seguridad, debe llamar a IO.fsync
.
Otros métodos relacionados:
-
IO.syswrite
:IO.syswrite
los buffers internos de Ruby y realice unawrite
directa del sistema operativo. Si usa esto, entonces no lo mezcle conIO.read/write
. -
IO.sysread
: Igual que el anterior, pero para leer.
¿Cómo funciona el buffering IO en Ruby? ¿Con qué frecuencia se transfieren los datos al flujo subyacente cuando se usan las clases de IO
y File
? ¿Cómo se compara esto con el búfer del sistema operativo? ¿Qué se debe hacer para garantizar que los datos dados se hayan escrito en el disco, antes de leerlos con seguridad para procesarlos?
Ruby hace su almacenamiento interno en búfer sobre el sistema operativo. Cuando haces file.flush, Ruby vacía su búfer interno. Para asegurarse de que el archivo esté escrito en el disco, debe hacer file.fsync. Pero al final no puede estar seguro de que el archivo esté escrito en el disco de todos modos, depende del sistema operativo, el controlador de disco duro y el disco duro.