Programación General => C/C++ => Mensaje iniciado por: Leber en Miércoles 30 de Marzo de 2011, 22:42
Título: Memoria intermedia vs disco
Publicado por: Leber en Miércoles 30 de Marzo de 2011, 22:42
EDITO
Disculpa, lo escribí con prisas :ouch:
Basicamente es:
Tienes una estructura tal que asi:
Código: C
typedefstruct _iobuf {
int cnt;//Caracteres que quedan en la memoria intermedia
char*ptr;//Puntero al siguiente carácter de la memoria intermedia
char*base;//Puntero al inicio de la memoria intermedia
int flag;//Modo de acceso al fichero
int fd;//Descriptor del fichero
}FILE;
Ahora, supongamos que tienes dos punteros a FILE, uno para el fichero a copiar(llamemosle flujo1), y el otro para el fichero destino(flujo2).
Entonces, lo que haces es:
Primeramente lees 1024 bytes(por decir algo) del flujo1, los pones en un puntero (char *base) y luego haces ptr = base. Entonces, cada vez que haces un getc para tomar el siguiente carácter, se hace una comprobación, si nos hemos quedado sin memoria intermedia (--flujo1->cnt <0) , la volvemos a llenar, si todavía tenemos se toma el caracter de flujo1->ptr++
Cuando haces un putc, para copiar el carácter al fichero, también se comprueba si hay memoria intermedia. Si no la hay, se reserva memoria para el puntero flujo2->base del tamaño de 1024 bytes y hacemos que flujo2->ptr = flujo2->base, y se van colocando los caracteres en
Código: C
flujo2->ptr++= caracter_a_poner
a media que
Código: C
flujo2->cnt
se decrementa como antes. Una vez flujo2->cnt llega a 0, se escribe en el fichero lo contenido en
Código: C
flujo2->ptr
, se coloca de nuevo el puntero al inicio de la memoria intermedia
Código: C
flujo2->ptr = flujo2->base
y se vuelve a reservar memoria.
Entonces, como ves, unicamente se copia a disco cuanto
Código: C
flujo2->ptr
contiene los 1024 bytes que hemos leido con antes. Mi duda era porque no copiarlos de golpe, sin esperar a que la memoria intermedia este llena?
Espero que ahora me haya explicado mejor
Título: Re: Memoria intermedia vs disco
Publicado por: m0skit0 en Miércoles 30 de Marzo de 2011, 23:55
Perdona pero no me he enterado qué preguntas.
Cita de: "Leber"
Es decir, llenas la memoria intermedia de 1024 bytes, y los escribes directamente a disco sin escribirlos en la memoria intermedia del fichero destino ?
:blink:
Título: Re: Memoria intermedia vs disco
Publicado por: Leber en Jueves 31 de Marzo de 2011, 00:26
Edite la primera entrada, ya que me di cuenta que lo habia explicado de un modo bastante horrible :no:
Título: Re: Memoria intermedia vs disco
Publicado por: m0skit0 en Viernes 1 de Abril de 2011, 10:06
Ok, mucho mejor ^_^
Eso se debe a que el hardware para grabar datos persistentes (también llamado memoria secundaria) es muchísimo más lento que la memoria principal (échale 100.000 veces más lento). Por tanto al grabar un carácter habría que estar esperando a la terminación de la operación de E/S, con el consiguiente ralentizamiento bestial (aunque uses DMA u otros mecanismos). Además, generalmente estos dispositivos de memoria secundaria suelen estar divididos por sectores, siendo los tamaños más comunes 512 y múltiplos, y son la unidad mínima de lectura/escritura. Por tanto es absurdo escribir un byte en un sector porque vas a gastar el resto del sector para nada.
Título: Re: Memoria intermedia vs disco
Publicado por: Leber en Viernes 1 de Abril de 2011, 10:22
Uhm, más o menos sabía que iba por aquí el asunto, pero no acaba de afinarlo.
Entonces, es más rápido llenar un array, esperar a que este completo, y luego escupir todo esto a disco, que ir byte por byte, hasta ahi más o menos lo tengo claro. Lo que ocurre es que me estoy liando.
Las llamadas al sistema, por ejemplo write y read, supongo que también trabajan con este tipo de memoria intermedia. Al fin y al cabo, se puede decir que un programa que no trabaje con memoria intermedia, sería tal que así:
Código: C
read(0, buffer,1);
Y uno que si:
Código: C
read(0, buffer,1024);
Gracias por responder
Título: Re: Memoria intermedia vs disco
Publicado por: m0skit0 en Viernes 1 de Abril de 2011, 10:26
En realidad de todo eso se encarga el kernel del SO. Aunque pongas
Código: C
read(0, buffer,1);
el SO no lo escribirá a disco (realmente vale para cualquier dipositivo) directamente hasta que se llene el buffer o que lo fuerces con llamadas del tipo fflush.
Por esta razón siempre se recomienda desmontar los dispositivos en los que hayamos escrito datos antes de desconectarlos (por ejemplo el USB), dado que es posible y probable que el SO no haya vaciado los buffers temporales y ello resulte en una pérdida de datos. Al desmontar el SO directamente hace un fflush de los buffers temporales.
Título: Re: Memoria intermedia vs disco
Publicado por: Leber en Viernes 1 de Abril de 2011, 10:35
Si, algo lei acerca de esto, sobre el buffer cache y las llamadas a fsync para escribir a disco la información que todavía este en el buffer.