sisoputnfrba / foro

Foro de consultas para el trabajo práctico
151 stars 7 forks source link

[i-MongoStore] Dudas sobre el manejo de Blocks.ims #2164

Closed matiasfdevecchi closed 3 years ago

matiasfdevecchi commented 3 years ago

Internamente, este archivo deberá ser mapeado a memoria y se le realizará una copia sobre la cual se trabajará para lograr simular la concurrencia y asincronismo en las bajadas a disco de los sistemas operativos reales. El tiempo de sincronización hacia el archivo físico de Blocks.ims será especificado por archivo de configuración. Cualquier otra implementación es motivo de desaprobación directa.

Buenas, tengo una duda sobre esta parte del enunciado. Dice de hacer mmap() para tener el archivo en memoria, y también msync() para sincronizarlo con el archivo en el File System, hasta ahi todo perfecto. No me queda en claro el rol de lo que hay que hacer con memcpy(). Tenemos que hacer una copia de lo mapeado? Cual sería el objetivo?

Por lo que entiendo, no modificamos el archivo mapeado, sino la copia de este. Y msync lo usamos para qué entonces? Para sincronizar el copiado con el mapeado o para sincronizar el mapeado con el archivo real? (No recuerdo bien, pero segun entendí msync es para sincronizar con el archivo real)

Edit: aprovecho para dejar una duda más. En el enunciado dice que no se proveeran archivos inconsistentes. Entonces, para chequear si ya hay un FS existente, podemos chequear si existe SuperBloque.ims y listo? O a lo sumo SuperBloque.ims y Bloque.ims?

Edit2: La cantidad de blocks será siempre múltiplo de 8? Para saber si el bitarray tendrá bits innecesarios o no

RaniAgus commented 3 years ago

¡Buenas!

  1. Como vos mencionabas, msync() sirve para forzar la sincronización entre el archivo real y la memoria mapeada (pueden chequear el manpage para más info). Digo "forzar" porque el SO bajo ciertos criterios actualiza la memoria mapeada con mmap() sin necesidad de hacer msync(), es por eso que hacemos una copia (memcpy()) y trabajamos sobre ella en vez de trabajar directamente con la memoria mapeada.

También, es por eso que cuando se cumpla el tiempo de sincronización la idea es actualizar el contenido de la memoria mapeada con el de la copia (otro memcpy() pero en sentido opuesto) e inmediatamente forzar esa sincronización con msync().

  1. Exactamente, con chequear la existencia de ambos archivos (SuperBloque.ims y Bloque.ims) se puede asumir que el FS ya fue creado.

  2. Sí, de hecho para las pruebas siempre les vamos a dar valores iguales a 2^n (tanto para blocks como para block_size), así que no se preocupen porque el bitmap nunca tendrá bits "innecesarios".

Saludos

matiasfdevecchi commented 3 years ago

Ok, entonces el objetivo del blocks copiado es para que solamente se sincronice cuando lo hacemos nosotros y no porque al SO "le pintó" y de esa manera comprobar que hagamos bien la sincro, no?

RaniAgus commented 3 years ago

Exactamente