- Off-topic:
- Es muy temprano para tener todas las neuronas prendidas, y estoy leyendo esto sin acordarme lo que había escrito, así que en cuanto dudes de lo que pongo, desconfiá y re-preguntá.
El ejercicio que inventó Caro es el de un archivo con 612668 bloques de datos. Entonces, si en algún momento tenemos más bloques de datos que esos (o menos), algo hicimos mal.
Pero cuando almacenamos un archivo en un FS de tipo ext no usamos únicamente bloques de datos: hay algunos bloques que los usamos, no para guardar los datos del archivo, si no para guardar los punteros a los bloques de datos.
Los niveles de indirección en los bloques son eso: en lugar de para guardar
los bytes que componen mi archivo, tomo un bloque de datos y lo uso para guardar punteros a otros bloques (que podré usar para guardar los bytes de mi archivo, o para guardar más punteros a bloques, según el nivel de indirección en que esté).
Entonces, en este caso el inodo tiene 12 punteros directos (o sea, de indirección 0), 1 puntero indirecto simple (indirección 1), 1 puntero indirecto doble (indirección 2), y 1 puntero indirecto triple (indirección 3).
Así que hay que ver cómo direccionamos cada uno de esos 612668 bloques de datos.
Los primeros 12 bloques los vamos a direccionar directamente desde el inodo, usando los punteros directos, por lo que
direccionamos 12 bloques usando 0 bloques de punteros. Nos quedan sólo 612656 bloques por direccionar.
Después tenemos un puntero indirecto simple.
Si tenemos bloques de 4KiB (4096 bytes) y punteros de 64 bits (8 bytes), en cada bloque que usemos para punteros podemos guardar 4096 bytes / 8 bytes/puntero = 512 punteros.
Entonces, un puntero indirecto simple apunta a un bloque de punteros que apuntan a bloques de datos (un único nivel de indirección). O sea, el puntero indirecto simple apunta a un bloque de
512 punteros, que cada uno apunta a un bloque de datos:
direccionamos 512 bloques de datos usando 1 bloque de punteros. Vamos usando 1 bloque extra para punteros y nos quedan 612144 bloques de datos para direccionar.
Sigue un indirecto doble. O sea, el inodo apunta a un bloque de 512 punteros, y cada uno de ellos apunta, no a un bloque de datos, si no a otro bloque con 512 punteros a bloques de datos cada uno. El bloque apunta a 512 bloques, que direccionan 512 bloques de datos cada uno: 512 punteros * 512 bloques = 262144 bloques de datos direccionados con el bloque de punteros apuntado desde el inodo + los 512 bloques de punteros apuntados desde ese bloque anterior.
Direccionamos 262144 bloques de datos usando 513 bloques de punteros. Vamos usando 513 + 1 = 514 bloques extra para punteros, y nos falta direccionar 612144 - 262144 = 350000 bloques de datos.
Y nos queda el indirecto triple. Parecido a lo que hicimos antes: el inodo apunta un bloque de punteros, que apunta a 512 bloques de punteros, que cada uno apunta a 512 bloques también de punteros, que cada uno apunta a 512 bloques de datos. Si sacamos la cuenta "full" como veníamos haciendo, tenemos 512 * 512 * 512 = 134.217.728, que son
algunos bloques más de los que necesitamos (
sólo nos faltaban 350.000). Entonces no vamos a usar 512*512 bloques de punteros (es decir, usar toooodos los punteros que podemos llegar a tener en este nivel), si no que nomás vamos a usar los que necesitamos.
Pero, ¿cuántos necesitamos?
Buen, lo mínimo que podemos hacer es apuntar a
un bloque de datos, y para eso necesitamos desde el inodo apuntar a un bloque de punteros, que apunte a un segundo bloque de punteros, que apunte a un tercer bloque de punteros, y ése sí apunte a un bloque de datos. Sería como quedarse únicamente con la rama de arriba del dibujito este de Caro:
Pero con eso apuntaríamos un único bloque de datos, y necesitamos más que eso. Llenando ese último bloque de punteros, apuntamos a 512 bloques de datos. Sigue faltándonos. Si agregamos otro bloque de punteros (apuntado desde el de segundo nivel), pasaríamos a tener 4 bloques de punteros (uno de primer nivel, uno de segundo, y dos de tercero), y apuntaríamos a 2*512 = 1024 bloques de datos.
Podemos seguir así hasta llenar los 512 bloques de punteros que podemos referenciar desde el único bloque de segundo nivel que tenemos por ahora. En ese caso tendríamos un bloque de punteros de primer nivel, uno de segundo, y 512 bloques de punteros de tercer nivel. Y como cada uno de esos 512 bloques de tercer nivel apunta a 512 bloques de datos, estamos usando 512+1+1 = 514 bloques de punteros para direccionar 512*512 = 262144 bloques de datos. Necesitábamos 350000, así que necesitamos seguir agregando bloques.
Así que agregamos otro bloque de segundo nivel, que apunte a un nuevo bloque de tercer nivel, que apunta a 512 de datos. Entonces tenemos un bloque de primer nivel, dos de segundo, y 512+1 de tercer nivel: 516 bloques de punteros para 513*512 = 262656 bloques de datos. Siguen faltando 87344 bloques de datos.
En vez de seguir probando "a ojo", hacemos algunas estimaciones: si llenamos este bloque de segundo nivel, tendríamos 1024 bloques de tercer nivel, que apuntan a 512 bloques de datos cada uno: 1024*512 = 524288 bloques de datos. Nosotros necesitamos sólo 350000, así que con este bloque de segundo nivel nos va a alcanzar. Así que nuestra configuración final va a ser 1 bloque de punteros de primer nivel, 2 bloques de punteros de segundo nivel, y (512 + los que necesitemos ahora) bloques de tercer nivel.
350000 bloques que nos faltaban, direccionados de a 512 por bloque de tercer nivel, significa que necesitamos 683.59375 ---> 684 bloques de tercer nivel. 512 de esos se apuntan desde el primer bloque de segundo nivel, y quedan 172 direccionados desde el segundo bloque de segundo nivel.
En resumen (y me hice una re ensalada), necesitamos 1 bloque de punteros de primer nivel, 2 de segundo nivel, y 684 de tercer nivel. Eso da 687 bloques de punteros + los 612668 bloques de datos, y en total usamos 613355 bloques para guardar todo el archivo.
En vez de "ir sumando" bloques de segundo nivel, si sabés que cada bloque de tercer nivel direcciona 512 bloques de datos, directamente te conviene arrancar por ahí: 350.000/512 = 684 bloques de tercer nivel para direccionar todo eso. Y como cada bloque de segundo nivel direcciona 512 bloques de tercer nivel, entonces necesitás 2 bloques de segundo nivel para direccionar 684 de tercer nivel. Y esos dos bloques los direccionás con 1 bloque de primer nivel, y voilá.
Ya ni me acuerdo la pregunta, así que espero haberla respondido
O sea que en el post anterior le mentí a Caro :O