GNU/Linux >> Tutoriales Linux >  >> Linux

Linux:¿cómo interoperan Pdflush, Kjournald, Swapd, etc.?

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. NOTA: Journal blocks es la forma en que los sistemas de archivos como ext4 y JFS realizan un seguimiento de los cambios en el disco en un archivo, antes de que se produzcan.

Relacionado:Hoja de referencia de los comandos CLI de Linux

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.

  1. Un proceso solicita escribir un archivo a través de write() llamada al sistema.
  2. El núcleo actualiza la memoria caché de la página asignada al archivo.
  3. Un subproceso del kernel de pdflush se encarga de vaciar la memoria caché de la página en el disco.
  4. 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.
  5. 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.
  6. Un controlador de dispositivo como SCSI u otros controladores específicos del dispositivo se encargarán de la operación de escritura.
  7. 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

Linux
  1. Cómo actualizar Kernel en Linux Desktop

  2. Cómo verificar la versión del Kernel en Linux

  3. Cómo instalar Linux Kernel 5.0 en CentOS 7

  4. ¿Cómo codificar un módulo del kernel de Linux?

  5. ¿Cómo puede un kernel de Linux ser tan pequeño?

Cómo instalar Linux Kernel 4.10.1 en Ubuntu 16.04

Cómo instalar Linux kernel 5.15 en Ubuntu 20.04

Cómo instalar Linux Kernel 5.15 en AlmaLinux 8

Cómo instalar Linux Kernel 5.15 en Debian 11

Cómo construir el kernel de Linux desde cero

Cómo actualizar el kernel de Linux en varias distribuciones [Tutorial]