ruby operating-system io buffering io-buffering

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 a IO.flush también llama al sistema operativo subyacente fflush() . 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 en true , no se realiza el almacenamiento en búfer interno de Ruby. Todo se envía inmediatamente al sistema operativo, y se llama a fflush() para cada escritura.
  • IO.sync : devuelve la configuración de sincronización actual ( true o false ).
  • IO.fsync : IO.fsync ambos buffers de Ruby + llama a fsync() en el sistema operativo (si es compatible). Esto garantizará una descarga completa hasta el archivo del disco físico.
  • IO.close : cierra Ruby IO y escribe los datos pendientes en el sistema operativo. Tenga en cuenta que esto no implica fsync() . La documentación de POSIX en close() dice que NO garantiza que los datos se escriban físicamente en el archivo. Así que necesitas usar una llamada fsync() 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 una write directa del sistema operativo. Si usa esto, entonces no lo mezcle con IO.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.