Si ejecutas el comando ps aux
verás algo parecido a esto:
USER PID %CPU %MEM SIZE RSS TTY STAT START TIME COMMAND root 1 0.1 8.0 1284 536 ? S 07:37 0:04 init [2] root 2 0.0 0.0 0 0 ? SW 07:37 0:00 (kflushd) root 3 0.0 0.0 0 0 ? SW 07:37 0:00 (kupdate) root 4 0.0 0.0 0 0 ? SW 07:37 0:00 (kpiod) root 5 0.0 0.0 0 0 ? SW 07:37 0:00 (kswapd) root 52 0.0 10.7 1552 716 ? S 07:38 0:01 syslogd -m 0 root 54 0.0 7.1 1276 480 ? S 07:38 0:00 klogd root 56 0.3 17.3 2232 1156 1 S 07:38 0:13 -bash root 57 0.0 7.1 1272 480 2 S 07:38 0:01 /sbin/agetty 38400 tt root 64 0.1 7.2 1272 484 S1 S 08:16 0:01 /sbin/agetty -L ttyS1 root 70 0.0 10.6 1472 708 1 R Sep 11 0:01 ps aux
Esto es una lista de los procesos que están ejecutándose en el sistema. La información viene del
sistema de archivos /proc
que mencioné en la sección anterior. Fíjate en que
init
es el proceso número uno. Los procesos 2, 3, 4 y 5 son kflushd, kupdate, kpiod y
kswapd. Aquí hay, sin embargo, algo extraño: fíjate en que tanto en la columna del tamaño de
almacenamiento virtual (SIZE) com en la del tamaño de almacenamiento real (Real Storage Size, RSS)
estos procesos tienen ceros. ¿Cómo puede un proceso no usar memoria?
Estos procesos son los demonios del núcleo. La mayor parte del núcleo no aparece para nada en la lista de procesos, y sólo pudes calcular cuánta memoria está usando restando la memoria disponible de la que tiene tu sistema. Los demonios del núcleo se arrancan tras init, por lo que reciben números de proceso igual que los procesos normales. Pero su código y sus datos vivne en la parte de memoria del núcleo.
Hay paréntesis rodeando las entradas de la columna de comando porque el sistema de archivos
/proc
no contiene información de línea de comandos para esos procesos.
¿Para qué sirven entonces esos demonios del núcleo? Las versiones anteriores de este documento tenían una petición de ayuda, ya que no sé mucho sobre los demonios del núcleo. La historia parcial que sigue se ha hecho con retazos de varias respuestas a aquella petición, por las que estoy sumamente agradecido. Agadeceré más pistas, referencias y correcciones.
La entrada y la salida se hacen a través de buffers de memoria. Esto permite que las
cosas vayan más rápidas. Lo que los programas escriben se puede guardar en memoria, en un buffer, y
luego escribirse en el disco en trozos más grandes y más eficientes. Los demonios
kflushd
y kupdate
controlan esta tarea: kupdate
se ejecuta
periódicamente (¿unos 5 segundos?) para comprobar si hay buffers sucios. Si los hay, hace que
kflushd
los vierta al disco.
Muchas veces los procesos no tienen nada que hacer, y los que se están ejecutando muchas veces
no necesitan todo su código y datos en memoria. Eso significa que podemos hacer mejor uso de
nuestra memoria, desplazando las partes no usadas de los programas en ejecución a la(s)
partición(es) de intercambio (swap) del disco duro. El movimiento de estos datos desde y hacia la
memoria cuando se necesitan lo hacen kpiod
y kswapd
. Más o menos cada
segundo, kswapd
despierta para comprobar la situación de la memoria, y si se necesita
algo en memoria que está en el disco o si no hay suficiente memoria libre, se llama a
kpiod
.
También puede haber un demonio kapmd
ejecutándose en tu sistema si has configurado
la gestión automática de energía en tu núcleo.
El programa update
te permite configurar kflushd
y kswapd
.
Prueba update -h
para conseguir información.
El espacio de intercambio se activa con swapon
y se desactiva con
swapoff
. El script de init (/etc/rc.sysinit
o
/etc/rc.d/rc.sysinit
) normalmente llama a swapon
al arrancar el sistema.
Me han dicho que swapoff
va muy bien para ahorrar energía en los portátiles.
Haz un update -d
, fíjate en las jeremiadas de la última línea sobre "threshold
for buffer fratricide" (umbral para el fratricidio de buffers). ¡He aquí un concepto intrigante,
investígalo!
Cámbiate al directorio /proc/sys/vm
y haz un cat
de los archivos que
hay allá. Intenta enterarte de algo.
"The Linux Kernel" de The Linux Documentation Project (ver la sección El núcleo de Linux para ver un url)
El código fuente del núcleo de Linux, ¡si te atreves! El Código de kswapd
está en
linux/mm/vmscan.c
, y kflushd
y kupdate
están en
linux/fs/buffer.c
.