A.3. Fsync
Fsync
se conoce como una operación de E/S costosa, pero esto no es totalmente cierto. Por ejemplo, consulte el artículo de Theodore Ts No le tema a fsync! [5] y la discusión que lo acompaña.
Firefox llamaba a la biblioteca sqlite cada vez que el usuario hacía clic en un enlace para ir a una nueva página. Sqlite llamaba a
fsync
y debido a las configuraciones del sistema de archivos (principalmente ext3 con datos en modo ordenado), había más latencia cuando nada sucedía. Esto podía tardar un largo tiempo (más de 30 segundos) si otro proceso estaba copiando un archivo grande al mismo tiempo.
Sin embargo, en otros casos, donde
fsync
wasn't no se utilizaba, se presentaban problemas con el cambio al sistema de archivos ext4. Ext3 se establecía de modo datos-ordenados, lo cual borraba la memoria cada pocos segundos y le ahorraba al disco. Sin embargo, con ext4 y modo_portátil, el intervalo entre almacenamiento utilizaba más tiempo y los datos podían perderse cuando el sistema inesperadamente era apagado. Ahora ext4 está corregido, pero debe aún considerarse cuidadosamente el diseño de sus aplicaciones y usar fsync
como es apropiado.
El siguiente ejemplo de lectura y escritura en un archivo de configuración muestra cómo se puede hacer una copia de seguridad de un archivo y cómo se pueden perder datos:
/* open and read configuration file e.g. ~/.kde/myconfig */ fd = open("./kde/myconfig", O_WRONLY|O_TRUNC|O_CREAT); read(myconfig); ... write(fd, bufferOfNewData, sizeof(bufferOfNewData)); close(fd);
Un mejor enfoque sería:
open("/.kde/myconfig", O_WRONLY|O_TRUNC|O_CREAT); read(myconfig); ... fd = open("/.kde/myconfig.suffix", O_WRONLY|O_TRUNC|O_CREAT); write(fd, bufferOfNewData, sizeof(bufferOfNewData)); fsync; /* paranoia - optional */ ... close(fd); rename("/.kde/myconfig", "/.kde/myconfig~"); /* paranoia - optional */ rename("/.kde/myconfig.suffix", "/.kde/myconfig");