• Miércoles 20 de Noviembre de 2024, 14:29

Autor Tema:  Memoria intermedia vs disco  (Leído 2347 veces)

Leber

  • Miembro activo
  • **
  • Mensajes: 65
    • Ver Perfil
Memoria intermedia vs disco
« en: Miércoles 30 de Marzo de 2011, 22:42 »
0
EDITO

Disculpa, lo escribí con prisas  :ouch:

Basicamente es:

Tienes una estructura tal que asi:

Código: C
  1. typedef struct _iobuf {
  2.     int cnt;    //Caracteres que quedan en la memoria intermedia
  3.     char *ptr;  //Puntero al siguiente carácter de la memoria intermedia
  4.     char *base; //Puntero al inicio de la memoria intermedia
  5.     int flag;   //Modo de acceso al fichero
  6.     int fd;     //Descriptor del fichero
  7. }FILE;
  8.  

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
  1. flujo2->ptr++ = caracter_a_poner
  2.  
a media que
Código: C
  1. flujo2->cnt
  2.  
se decrementa como antes.
Una vez flujo2->cnt llega a 0, se escribe en el fichero lo contenido en
Código: C
  1. flujo2->ptr
  2.  
, se coloca de nuevo el puntero al inicio de la memoria intermedia
Código: C
  1. flujo2->ptr = flujo2->base
  2.  
y se vuelve a reservar memoria.

Entonces, como ves, unicamente se copia a disco cuanto
Código: C
  1. flujo2->ptr
  2.  
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
« última modificación: Jueves 31 de Marzo de 2011, 00:25 por Leber »

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Memoria intermedia vs disco
« Respuesta #1 en: Miércoles 30 de Marzo de 2011, 23:55 »
0
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:

Leber

  • Miembro activo
  • **
  • Mensajes: 65
    • Ver Perfil
Re: Memoria intermedia vs disco
« Respuesta #2 en: Jueves 31 de Marzo de 2011, 00:26 »
0
Edite la primera entrada, ya que me di cuenta que lo habia explicado de un modo bastante horrible  :no:

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Memoria intermedia vs disco
« Respuesta #3 en: Viernes 1 de Abril de 2011, 10:06 »
0
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

  • Miembro activo
  • **
  • Mensajes: 65
    • Ver Perfil
Re: Memoria intermedia vs disco
« Respuesta #4 en: Viernes 1 de Abril de 2011, 10:22 »
0
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
  1. read(0, buffer, 1);
  2.  

Y uno que si:

Código: C
  1. read(0, buffer, 1024);
  2.  

Gracias por responder

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Memoria intermedia vs disco
« Respuesta #5 en: Viernes 1 de Abril de 2011, 10:26 »
0
En realidad de todo eso se encarga el kernel del SO. Aunque pongas

Código: C
  1. read(0, buffer, 1);
  2.  
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.

Leber

  • Miembro activo
  • **
  • Mensajes: 65
    • Ver Perfil
Re: Memoria intermedia vs disco
« Respuesta #6 en: Viernes 1 de Abril de 2011, 10:35 »
0
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.

Gracias m0skito  ^_^