2010-05-02 18 views
5

Me refiero a the link acerca de los conceptos de InodesComprender el concepto de Inodes

estoy confundido en las piezas:

  1. 12 punteros de bloques directos
  2. 1 único puntero de bloque indirecta
  3. 1 dobles puntero de bloque indirecto
  4. 1 puntero de bloque indirecto triple

Ahora el diagrama dice que cada puntero es 32/64 bits.

  • [Consulta]: ¿Por qué y cómo se infieren estos valores? Me refiero a por qué específicamente solo tienen punteros de 32 o 64 bits.

El diagrama dice, un bloque de datos {8} KB para cada puntero {4 bytes/8 bytes}

  • [Consulta]: ¿Cómo funciona esto realmente funciona? es decir, 8 * 1024 bytes/8 bytes = 1024 bytes? ¿Cuál es la lógica detrás de tener un puntero de 8 bytes para un bloque de 8 KB?

Respuesta

8

Los punteros se hace referencia son direcciones de bloque de disco - cada puntero contiene la información necesaria para identificar un bloque en el disco. Como cada bloque de disco tiene al menos 512 bytes (a veces 4096 u 8192 bytes), con direcciones de 32 bits, el disco puede gestionar hasta 512 * 4 * 1024 = 2 TiB (Tebibytes, más comúnmente llamado Terabytes) suponiendo 1/2 bloques KiB; tamaños correspondientemente más grandes a medida que crece el tamaño del bloque (por lo que 32 TiB a 8 kB de tamaño de bloque). Para un esquema de direccionamiento para discos más grandes, tendría que pasar a tamaños de bloque más grandes o direcciones de disco más grandes, por lo tanto, las direcciones de 48 bits o de 64 bits podrían ser plausibles.

Por lo tanto, para responder Q1, 32 bits es un tamaño común para muchas cosas. Muy a menudo, cuando 32 bits ya no son lo suficientemente grandes, el siguiente tamaño razonable es de 64 bits.

Contestar P2:

  • Con 8 bloques de datos KiB, si el archivo es de 96 KiB o menor, entonces se utiliza 12 bloques o menos en el disco, y todas esas direcciones de bloque se almacenan directamente en el nodo-i sí mismo.

  • Cuando el archivo crece, el controlador de disco asigna un solo bloque indirecto y lo registra en el inodo. Cuando el conductor necesita obtener un bloque, lee el bloque indirecto en la memoria y luego encuentra la dirección del bloque que necesita del bloque indirecto. Por lo tanto, requiere (nominalmente) dos lecturas para llegar a los datos, aunque, por supuesto, el indirecto tiende a almacenarse en la memoria.

  • Con un tamaño de bloque de 8 KiB y direcciones de disco de 4 bytes, puede acomodar 2048 direcciones de disco en el único bloque indirecto. Por lo tanto, para archivos de 96 KiB + 1 byte a 16 MiB más o menos, solo hay un bloque indirecto.

  • Si un archivo crece aún más grande, el controlador asigna un doble bloque indirecto. Cada puntero en el bloque indirecto doble apunta a un solo bloque indirecto. Por lo tanto, puede tener 2048 bloques indirectos más, cada uno de los cuales puede apuntar eficazmente a 16 MiB, lo que permite almacenar archivos de hasta 32 GiB (aproximadamente).

  • Si un archivo crece aún más, el controlador asigna un bloque indirecto triple. Cada uno de los 2048 punteros en un bloque indirecto triple apunta a un doble bloqueo. Por lo tanto, en el esquema de direccionamiento de 32 bits con direcciones de 32 bits, se podrían abordar archivos de hasta 64 TiB. Excepto que se ha quedado sin direcciones de disco antes de eso (32 TiB máximo debido a las direcciones de 32 bits a 8 bloques KiB).

Por lo tanto, la estructura del inodo puede manejar archivos de más de 32 bits que las direcciones de disco pueden manejar.

Lo dejaré como un ejercicio para que el lector vea cómo cambian las cosas con las direcciones de disco de 64 bits.

+0

Muchas gracias por la respuesta detallada. ¿Puede por favor explicarme el cálculo: direcciones de 32 bits que el disco puede tratar hasta 512 * 4 * 10243 = 2 TiB hecho arriba? –

+0

@ darkie15: suponga que cada dirección de disco es un número de bloque. Con números de 32 bits, puede abordar aproximadamente 4 mil millones de bloques diferentes; cada uno de esos bloques es un 1/2 KiB, por lo que puede abordar aproximadamente 2 billones de bytes, también conocido como 2 TiB. –

3

Antes de dar las respuestas, usted debe entender cómo funciona el sistema de archivos:

Cada vez que un usuario o un programa hace referencia a un archivo por su nombre, el sistema operativo utiliza ese nombre para buscar el i-nodo correspondiente, el cual luego permite que el sistema obtenga la información que necesita sobre el archivo para realizar más operaciones. Es decir, un nombre de archivo en un sistema operativo tipo Unix es simplemente una entrada en una tabla con números de inodo, en lugar de asociarse directamente con un archivo (a diferencia de otros sistemas operativos, como los sistemas Microsoft Windows). Los números de inodo y sus inodos correspondientes se guardan en tablas de inode, que se almacenan en ubicaciones estratégicas en un sistema de archivos, incluso cerca de su comienzo.

La respuesta a la primera pregunta es que el espacio de bits cubre el total de 32 o 64 bits. simplemente hace 2^32 y es lo suficientemente grande como para definir todas estas variables. También, para usos posteriores, tiene que saber el tamaño de los bits para las operaciones. En su ejemplo, simplemente definieron de esa manera.

En segundo lugar, cada puntero (el tamaño depende de la capacidad de su disco) hace referencia a un bloque de datos (8 KB en el disco, el disco tiene bloques) pero tenga en cuenta que el sistema de archivos Unix tiene una estructura jerárquica. Una tabla que señala muchas otras tablas y finalmente la última tabla apunta al bloque de datos.

Te ofrezco revisar este libro, muy útil para entender el Unix file system.

alt text http://ecx.images-amazon.com/images/I/511L2NK6ZNL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA300_SH20_OU01_.jpg

8

Ejemplo de cálculo del tamaño máximo del archivo

* Assume that there are 10 direct pointers to data blocks, 1 indirect pointer, 1 double indirect pointer, and 1 triple indirect pointer 
* Assume that the size of the data blocks is 1024 bytes = 1Kb, i.e., BlockSize = 1Kb 
* Assume that the block numbers are represented as 4 byte unsigned integers, i.e., BlockNumberSize = 4b 
* Some data blocks are used as index blocks. They store 1024 bytes/4 bytes/entry = 256 entries 
* Maximum number of bytes addressed by 10 direct pointers is 

    = Number of direct pointers * Blocksize 
    = 10 * 1Kb 
    = 10Kb 


* Maximum number of bytes addressed by single indirect pointer is 

    = NumberOfEntries * BlockSize 
    = (Blocksize/BlockNumberSize) * BlockSize 
    = (1Kb/4b) * 1Kb 
    = 256 * 1Kb 
    = 256Kb 


* Maximum number of bytes addressed by double indirect pointer is 

    = NumberOfEntries^2 * BlockSize 
    = (Blocksize/BlockNumberSize)^2 * BlockSize 
    = (1Kb/4b)^2 * 1Kb 
    = (2^10/2^2)^2 * (2^10b) 
    = (2^8)^2 * (2^10)b 
    = (2^16) * (2^10)b 
    = 2^6 * 2^20 b 
    = 64 Mb 


* Maximum number of bytes addressed by triple indirect pointer is 

    = NumberOfEntries^3 * BlockSize 
    = (Blocksize/BlockNumberSize)^3 * BlockSize 
    = (1Kb/4b)^3 * 1Kb 
    = (2^10/2^2)^3 * (2^10b) 
    = (2^8)^3 * (2^10)b 
    = (2^24) * (2^10)b 
    = 2^4 * 2^30 b 
    = 16 Gb 


* Maximum file size is 16Gb + 64Mb + 266Kb