Publicidad

lunes, 1 de diciembre de 2008

Cahé de Inodos ....

Algo de in formacion espero sea de interes:



Caché de Inodos e Interacción con DcacheEn orden para soportar múltiples sistemas de archivos, Linux contiene un nivel especial de interfaces del núcleo llamado VFS (Interruptor de Sistemas de Ficheros Virtuales). Esto es muy similar a la interfaz vnode/vfs encontrada en los derivados de SVR4 (originalmente venían de BSD y de las implementaciones originales de Sun).

La antememoria de inodos de Linux es implementada en un simple fichero, fs/inode.c, el cual consiste de 977 lineas de código. Es interesante notar que no se han realizado muchos cambios en él durante los últimos 5-7 años: uno todavía puede reconocer algún código comparando la última version con, digamos, 1.3.42.

La estructura de la antememoria de inodos Linux es como sigue:


Una tabla global hash, inode_hashtable, donde cada inodo es ordenado por el valor del puntero del superbloque y el número de inodo de 32bit. Los inodos sin un superbloque (inode->i_sb
NULL) son añadidos a la lista doblemente enlazada encabezada por anon_hash_chain en su lugar. Ejemplos de inodos anónimos son los conectores creados por net/socket.c:sock_alloc(), llamado por fs/inode.c:get_empty_inode().
Una lista global del tipo "en_uso" (inode_in_use), la cual contiene los inodos válidos con i_count>0 y i_nlink>0. Los inodos nuevamente asignados por get_empty_inode() y get_new_inode() son añadidos a la lista inode_in_use.
Una lista global del tipo "sin_usar" (inode_unused), la cual contiene los inodos válidos con i_count = 0.
Una lista por cada superbloque del tipo "sucia" (sb->s_dirty) que contiene los inodos válidos con i_count>0, i_nlink>0 y i_state & I_DIRTY. Cuando el inodo es marcado como sucio, es añadido a la lista sb->s_dirty si el está también ordenado. Manteniendo una lista sucia por superbloque de inodos nos permite rápidamente sincronizar los inodos.
Una antememoria propia de inodos - una antememoria SLAB llamada inode_cachep. Tal como los objetos inodos son asignados como libres, ellos son tomados y devueltos a esta antememoria SLAB.

Los tipos de listas son sujetadas desde inode->i_list, la tabla hash desde inode->i_hash. Cada inodo puede estar en una tabla hash y en uno, y en sólo uno, tipo de lista (en_uso, sin_usar o sucia).

Todas estas listas están protegidas por un spinlock simple: inode_lock.

El subsistema de caché de inodos es inicializado cuando la función inode_init() es llamada desde init/main.c:start_kernel(). La función es marcada como init, lo que significa que el código será lanzado posteriormente. Se le pasa un argumento simple - el número de páginas físicas en el sistema. Esto es por lo que la antememoria de inodos puede configurarse ella misma dependiendo de cuanta memoria está disponible, esto es, crea una tabla hash más grande si hay suficiente memoria.

Las únicas estadísticas de información sobre la antememoria de inodos es el número de inodos sin usar, almacenados en inodes_stat.nr_unused y accesibles por los programas de usuario a través de los archivos /proc/sys/fs/inode-nr y /proc/sys/fs/inode-state.

Podemos examinar una de las listas desde gdb en un núcleo en funcionamiento de esta forma:



--------------------------------------------------------------------------------
(gdb) printf "%d\n", (unsigned long)(&((struct inode *)0)->i_list)
8
(gdb) p inode_unused
$34 = 0xdfa992a8
(gdb) p (struct list_head)inode_unused
$35 = {next = 0xdfa992a8, prev = 0xdfcdd5a8}
(gdb) p ((struct list_head)inode_unused).prev
$36 = (struct list_head *) 0xdfcdd5a8
(gdb) p (((struct list_head)inode_unused).prev)->prev
$37 = (struct list_head *) 0xdfb5a2e8
(gdb) set $i = (struct inode *)0xdfb5a2e0
(gdb) p $i->i_ino
$38 = 0x3bec7
(gdb) p $i->i_count
$39 = {counter = 0x0}


***************************************************
********Inodo***************(Wikipedia....
En informática, un inodo, nodo-i, nodo índice o i-node en inglés es una estructura de datos propia de los sistemas de archivos tradicionalmente empleados en los sistemas operativos tipo UNIX como es el caso de Linux. Un inodo contiene las características (permisos, fechas, ubicación, pero NO el nombre) de un archivo regular, directorio, o cualquier otro objeto que pueda contener el sistema de ficheros.

El término "inodo" refiere generalmente a inodos en discos (dispositivos en modo bloque) que almacenan archivos regulares, directorios, y enlaces simbólicos. El concepto es particularmente importante para la recuperación de los sistemas de archivos dañados.

Cada inodo queda identificado por un número entero, único dentro del sistema de ficheros, y los directorios recogen una lista de parejas formadas por un número de inodo y nombre identificativo que permite acceder al archivo en cuestión: cada archivo tiene un único inodo, pero puede tener más de un nombre en distintos o incluso en el mismo directorio para facilitar su localización.

Denominacion;
No existe una explicación clara para la denominación "inodo". Dennis Ritchie, precursor de UNIX lo explicó así:

'Realmente, tampoco lo sé. Era simplemente el nombre que comenzamos a utilizar. "Índice" es lo mejor que se me ocurre, debido a la estructura algo inusual de un sistema de ficheros que almacenaba la información del acceso a los archivos como una lista plana en disco, dejando al margen toda la información jerárquica de los directorios. Así el número "i'" es un índice sobre la lista, el nodo "i" es el elemento seleccionado de la lista. (En la primera edición del manual se empleó la notación "i-nodo"; el guión fue desapareciendo poco a poco).'

No hay comentarios: