Recientemente vi una pregunta que despertó este pensamiento. Realmente no pude encontrar una respuesta aquí o a través de la máquina de Google. Básicamente, estoy interesado en saber cómo se estratifica la arquitectura de E / S del kernel. Por ejemplo, ¿se kjournald
despacha a pdflush
la inversa? Mi suposición es que pdflush
(al ser más genérico para la E / S de almacenamiento masivo) se ubicaría en un nivel inferior y activaría el SCSI / ATA / cualquier comando necesario para realizar las escrituras y kjournald
manejaría las estructuras de datos del sistema de archivos de nivel superior antes de escribir. Sin embargo, también podía verlo al revés, kjournald
interactuando directamente con las estructuras de datos del sistema de archivos y pdflush
despertando de vez en cuando para escribir páginas sucias de caché de páginas en el dispositivo a través dekjournald
. También es posible que los dos no interactúen en absoluto por alguna otra razón.
Básicamente: necesito alguna forma de visualizar (gráfico o simplemente una explicación) la arquitectura básica utilizada para enviar E / S al almacenamiento masivo dentro del kernel de Linux.
Respuestas:
Antes de discutir los detalles con respecto a
pdflush
,kjournald, and
kswapd`, revisemos primero un poco de historia en el contexto de qué es exactamente lo que estamos hablando en términos del núcleo de Linux.La arquitectura GNU / Linux
La arquitectura de GNU / Linux puede considerarse como 2 espacios:
Entre User Space y Kernel Space se encuentra la Biblioteca GNU C (
glibc
). Esto proporciona la interfaz de llamada del sistema que conecta el kernel a las aplicaciones de espacio de usuario.El Kernel Space se puede subdividir en 3 niveles:
La interfaz de llamada del sistema, como su nombre lo indica, proporciona una interfaz entre
glibc
el núcleo y el núcleo. El Código de Kernel Independiente Arquitectónico se compone de las unidades lógicas como el VFS (Sistema de archivos virtuales) y el VMM (Administración de memoria virtual). El código dependiente arquitectónico son los componentes que son código específico de procesador y plataforma para una arquitectura de hardware dada.Diagrama de la arquitectura GNU / Linux
Para el resto de este artículo, centraremos nuestra atención en las unidades lógicas VFS y VMM dentro del Kernel Space.
Subsistemas del kernel GNU / Linux
Subsistema VFS
Con un concepto de alto nivel de cómo está estructurado el kernel GNU / Linux, podemos profundizar un poco más en el subsistema VFS. Este componente es responsable de proporcionar acceso a los diversos dispositivos de almacenamiento en bloque que finalmente se asignan a un sistema de archivos (ext3 / ext4 / etc.) en un dispositivo físico (HDD / etc.).
Diagrama de VFS
Este diagrama muestra cómo un proceso
write()
de un usuario atraviesa el VFS y, en última instancia, desciende al controlador del dispositivo donde está escrito en el medio de almacenamiento físico. Este es el primer lugar donde nos encontramospdflush
. Este es un demonio que es responsable de enjuagar los bloques de datos y metadatos sucios al medio de almacenamiento en segundo plano. El diagrama no muestra esto, pero hay otro demonio,kjournald
que se encuentra al ladopdflush
, realizando una tarea similar escribiendo bloques de diario sucios en el disco. NOTA: Bloques de diario es cómo los sistemas de archivos como ext4 y JFS realizan un seguimiento de los cambios en el disco en un archivo, antes de que esos cambios tengan lugar.Los detalles anteriores se analizan más adelante en este documento .
Resumen de
write()
pasosPara proporcionar una descripción general simple de las operaciones del sistema de E / S, utilizaremos un ejemplo en el que
write()
una aplicación llama a la función Space.write()
llamada al sistema.bio struct
( consulte 1.4.3, “Capa de bloque” en la página 23 ) y envía una solicitud de escritura a la capa de dispositivo de bloque.Subsistema VMM
Continuando con nuestra inmersión más profunda, ahora podemos mirar en el subsistema VMM. Este componente es responsable de mantener la coherencia entre la memoria principal (RAM), el intercambio y el medio de almacenamiento físico. El mecanismo principal para mantener la consistencia es
bdflush
. Como las páginas de memoria se consideran sucias, deben sincronizarse con los datos que están en el medio de almacenamiento.bdflush
coordinará conpdflush
demonios para sincronizar estos datos con el medio de almacenamiento.Diagrama de VMM
Intercambiar
Cuando la memoria del sistema se vuelve escasa o el temporizador de intercambio del núcleo caduca, el
kswapd
demonio intentará liberar páginas. Mientras el número de páginas gratuitas permanezca arribafree_pages_high
,kswapd
no hará nada. Sin embargo, si el número de páginas gratuitas cae a continuación,kswapd
comenzará el proceso de recuperación de la página. Después dekswapd
haber marcado las páginas para la reubicación,bdflush
se encargará de sincronizar cualquier cambio pendiente en el medio de almacenamiento, a través de lospdflush
demonios.Referencias y lecturas adicionales
fuente