2012-02-03 16 views
7

Cuando hago un fopen y luego un fread, ¿cuándo está el archivo realmente/parcialmente cargado en la memoria durante fopen o fread?¿Cuándo se carga el archivo en la memoria, para las llamadas fread, fopen y fwrite?

¿O está parcialmente cargado en fopen según el tamaño del archivo y luego completamente cargado en el momento de fread?

De manera similar, ¿qué ocurre internamente en el nivel del sistema operativo cuando se llama a fwrite? ¿Se ha cargado el archivo en la memoria en ese momento o se produce un intercambio de páginas recuperando solo la parte del archivo en la memoria?

¿Qué sucede en el nivel del sistema operativo en cada una de estas llamadas con respecto a la carga de archivos en la memoria?

+4

¿Para qué sistema (s) de archivos? ¿Para qué OS? –

+4

¿Qué sistema operativo? Esto es totalmente dependiente del sistema operativo. (Esperaría que, por lo general, no se lean datos del archivo cuando lo acaba de abrir). –

+0

necesitaba los datos para Windows, pero sería curioso saber la diferencia para el mismo en Linux también – seahorse

Respuesta

6
  • fopen() solo crea un identificador para el archivo.
  • fread() realmente lee el archivo en una memoria intermedia (nivel de sistema operativo se puede producir de forma transparente para el cliente de amortiguación.)
  • fwrite() escribe datos en el archivo, aunque su comprometerse con el porta objetos puede retardada (por ejemplo, con el sistema de archivos articulado.)
4

Normalmente, el archivo no se carga en la memoria al abrirlo. En cambio, las partes se cargan en cada lectura; debido a todos los tipos de almacenamiento en búfer, se pueden cargar trozos más grandes y luego pedir en cada fread.

Cuando usted fwrite algunos datos, eventualmente se copia en el núcleo que luego lo escribirá en el disco (o en cualquier otro lugar) después del almacenamiento en búfer. En general, no es necesario cargar ninguna parte de un archivo para poder escribir.

2

En general, depende del sistema de archivos y el sistema operativo. en Windows hay un mecanismo de almacenamiento en caché que trata con un archivo en trozos de 256 KB y carga cada fragmento cuando la solicitud de lectura cae en ese trozo. Una llamada al fopen no debe causar la lectura del contenido del archivo de los medios. Y fread causará lectura parcial (o lectura completa para archivos pequeños) de los medios. La lectura parcial generalmente es igual al tamaño de la línea de caché en el administrador de caché (256 KB).

fwrite también puede/no causar una escritura real en el medio. Por lo general, hace que los datos del cliente se transfieran al área del archivo en caché en la RAM, pero no hay garantía de que los datos realmente se escriban en los medios. en Windows, el administrador de caché decide cuándo vaciar un área almacenada en caché de un archivo a los medios. Si desea asegurarse de que todos los datos sucios se descarguen a los medios después de fwrite, debe llamar al fflush posteriormente.

1

Si bien esto depende del sistema operativo, en el sistema operativo moderno toda la actividad del disco se almacena en caché de forma transparente, de modo que cuando abre un archivo en realidad se asigna a una parte del espacio de la memoria virtual.

Esto significa que no hay actividad de disco antes de la lectura/escritura real.

Esto es cierto incluso si abre el archivo sin asignación de memoria (por ejemplo: fopen), mientras que si lo abre con asignación de memoria (por ejemplo: mmap) simplemente pierde la "transparencia".

Cuestiones relacionadas