Utilización de llamadas sync y fsync
Si se abre un archivo con O_SYNC o O_DSYNC, cada escritura hará que los datos de esa escritura se vacíen en disco antes de que se devuelva la escritura. Si la escritura provoca una nueva asignación de disco (el archivo se amplía en lugar de sobrescribir una página existente), esa escritura también provocará una escritura de registro de JFS correspondiente.
La sincronización forzada del contenido de la memoria real y del disco tiene lugar de varias maneras:
- Un programa de aplicación realiza una llamada fsync() para un archivo especificado. Esto hace que todas las páginas que contienen datos modificados para ese archivo se escriban en el disco. La escritura se completa cuando la llamada fsync() vuelve al programa.
- Un programa de aplicación realiza una llamada sync(). Esto hace que todas las páginas de archivo en la memoria que contienen datos modificados se programen para que se escriban en el disco. La escritura no necesariamente se ha completado cuando la llamada sync() vuelve al programa.
- Un usuario puede entrar el mandato sync, que a su vez emite una llamada sync(). De nuevo, es posible que algunas de las escrituras no se completen cuando se solicite entrada al usuario (o se procese el siguiente mandato en un script de shell).
- El daemon /usr/sbin/syncd emite una llamada sync() a intervalos regulares, normalmente cada 60 segundos. Esto garantiza que el sistema no acumula grandes cantidades de datos que solo existen en la RAM volátil.
Una operación de sincronización tiene varios efectos, aparte de su pequeño consumo de CPU:
- Hace que las escrituras sean topadas, en lugar de extenderse.
- Provoca que se escriban al menos 28 KB de datos del sistema, aunque no haya habido actividad de E/S desde la operación sync anterior.
- Acelera la escritura de datos en disco, prevaleciendo sobre el algoritmo de escritura postergada. Este efecto es significativo principalmente en los programas que emiten una llamada fsync() después de cada escritura.
- Cuando se producen llamadas sync() o fsync(), los registros se escriben en el dispositivo de registro JFS para indicar que los datos modificados se han confirmado en el disco.