Programación General > C/C++

 Memoria intermedia vs disco

(1/2) > >>

Leber:
EDITO

Disculpa, lo escribí con prisas  :ouch:

Basicamente es:

Tienes una estructura tal que asi:


--- Código: C ---typedef struct _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

m0skit0:
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 ?
--- Fin de la cita ---
:blink:

Leber:
Edite la primera entrada, ya que me di cuenta que lo habia explicado de un modo bastante horrible  :no:

m0skit0:
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.

Leber:
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

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa