Recientemente vi una pregunta que provocó este pensamiento. Realmente no pude encontrar una respuesta aquí o a través de la máquina de Google. Básicamente, me interesa saber cómo se organiza en capas la arquitectura de E/S del kernel. Por ejemplo, kjournald
enviar a pdflush
¿O al revés? Mi suposición es que pdflush
(siendo más genérico para E/S de almacenamiento masivo) se ubicaría en un nivel inferior y activaría los comandos SCSI/ATA/lo que sea necesario para realizar las escrituras, y kjournald
maneja estructuras de datos del sistema de archivos de nivel superior antes de escribir. Sin embargo, también podría verlo al revés, con kjournald
interactuando directamente con las estructuras de datos del sistema de archivos y pdflush
despertarse de vez en cuando para escribir páginas sucias de caché de página en el dispositivo a través de kjournald
. 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.
Respuesta aceptada:
Antes de discutir los detalles sobre pdflush
, kjournald, and
kswapd`, primero analicemos un poco el contexto de lo que estamos hablando exactamente en términos del Kernel de Linux.
La arquitectura GNU/Linux
La arquitectura de GNU/Linux se puede considerar como 2 espacios:
- Usuario
- Núcleo
Entre el espacio de usuario y Espacio del núcleo se encuentra la biblioteca GNU C (glibc
). Esto proporciona la interfaz de llamadas al sistema que conecta el kernel con las aplicaciones del espacio de usuario.
El Kernel Space se puede subdividir en 3 niveles:
- Interfaz de llamada del sistema
- Código kernel independiente de arquitectura
- Código dependiente de la arquitectura
Interfaz de llamada del sistema como su nombre lo indica, proporciona una interfaz entre glibc
y el núcleo. El Código Kernel Independiente de la Arquitectura se compone de las unidades lógicas como el VFS (Sistema de archivos virtual) y el VMM (Administración de memoria virtual). El Código Dependiente de la Arquitectura son los componentes que son código específico del procesador y de la plataforma para una arquitectura de hardware dada.
Diagrama de la Arquitectura GNU/Linux
En el resto de este artículo, centraremos nuestra atención en las unidades lógicas VFS y VMM dentro del espacio del kernel.
Subsistemas del Kernel GNU/Linux
Subsistema VFS
Con un concepto de alto nivel de cómo está estructurado el kernel de GNU/Linux, podemos profundizar un poco más en el subsistema VFS. Este componente es responsable de brindar 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 write()
desde el proceso de un usuario atraviesa el VFS y, en última instancia, se abre camino hasta el controlador del dispositivo, donde se escribe en el medio de almacenamiento físico. Este es el primer lugar donde encontramos pdflush
. Este es un demonio que es responsable de vaciar los datos sucios y los bloques de búfer de metadatos al medio de almacenamiento en segundo plano. El diagrama no muestra esto, pero hay otro demonio, kjournald
, que se encuentra junto a pdflush
, realizando una tarea similar escribiendo bloques de diario sucios en el disco.
Los detalles anteriores se analizan más adelante en este documento.
Resumen de write()
pasos
Para proporcionar una descripción general simple de las operaciones del sistema de E/S, usaremos un ejemplo en el que la función write()
es llamado por una aplicación de espacio de usuario.
- Un proceso solicita escribir un archivo a través de
write()
llamada al sistema. - El núcleo actualiza la memoria caché de la página asignada al archivo.
- Un subproceso del kernel de pdflush se encarga de vaciar la memoria caché de la página en el disco.
- La capa del sistema de archivos une cada búfer de bloque en una
bio struct
(consulte 1.4.3, “Capa de bloques” en la página 23) y envía una solicitud de escritura a la capa de dispositivos de bloques. - La capa de dispositivos de bloques recibe solicitudes de las capas superiores y realiza una operación de elevador de E/S y coloca las solicitudes en la cola de solicitudes de E/S.
- Un controlador de dispositivo como SCSI u otros controladores específicos del dispositivo se encargarán de la operación de escritura.
- El firmware de un dispositivo de disco realiza operaciones de hardware como cabeza de búsqueda, rotación y transferencia de datos al sector en el plato.
Subsistema VMM
Continuando con nuestra inmersión más profunda, ahora podemos ver 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 la memoria se consideran sucias, deben sincronizarse con los datos que se encuentran en el medio de almacenamiento. bdflush
se coordinará con pdflush
demonios para sincronizar estos datos con el medio de almacenamiento.
Diagrama de VMM
Intercambiar
Cuando la memoria del sistema escasea o el temporizador de intercambio del kernel caduca, el kswapd
daemon intentará liberar páginas. Siempre que el número de páginas gratuitas permanezca por encima de free_pages_high
, kswapd
no hará nada Sin embargo, si el número de páginas gratuitas cae por debajo, entonces kswapd
comenzará el proceso de recuperación de la página. Después de kswapd
ha marcado páginas para reubicación, bdflush
se encargará de sincronizar cualquier cambio pendiente en el medio de almacenamiento, a través de pdflush
demonios.
Referencias y lecturas adicionales
- Arquitectura conceptual del kernel de Linux
- Diagrama de pila de E/S de Linux:ver. 0.1, 2012-03-06:describe la pila de E/S de Linux a partir de Kernel 3.3
- Actualización de los sistemas de archivos locales:específicamente la diapositiva n.º 7
- Mapa interactivo del kernel de Linux
- Comprensión de la memoria virtual en Red Hat Enterprise Linux 4
- Pautas de ajuste y rendimiento de Linux:específicamente las páginas 19 a 24
- Anatomía del kernel de Linux
- El caso de la replicación remota consciente de la semántica