Se eseguite il comandops aux
, vedrete probabilmente qualcosa di
simile:
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
Questa è una lista dei processi in esecuzione sul sistema. Le
informazioni provengono dal filesystem /proc
che ho descritto
nella sezione precedente.
Notate che init
è il processo numero uno. I process 2, 3, 4 e 5
sono kflushd, kupdate, kpiod e kswapd. C'è tuttavia qualcosa di strano:
notate che in entrambe le colonne del Virtual Storage Size (SIZE) e del
Real Storage Size (RSS), questi processi hanno valori nulli. Come può un
processo non utilizzare memoria?
Questi processi sono i demoni del kernel. La maggior parte dei kernel non mostra affatto una lista dei processi attivi, e potete capire quanta memoria questi stanno utilizzando solamente sottraendo la memoria disponibile da quella totale del sistema. I demoni del kernel vengono avviati dopo init, e quindi prendono un numero di processo come fanno tutti gli altri processi. Ma il loro codice ed i loro dati risiedono nella parte di memoria riservata al kernel.
Intorno alle voci della colonna dei comandi ci sono le parentesi
perché il filesystem /proc
non contiene informazioni sulla
linea di comando per questi processi.
Ma allora a cosa servono questi demoni del kernel? Versioni precedenti di questo documento riportavano una richiesta di aiuto per questo paragrafo, dal momento che non sapevo molto sui demoni del kernel. La storia parziale che segue è stata realizzata combinando le diverse risposte a questa richiesta, per le quali sono veramente grato. Maggiori informazioni, riferimenti e correzioni sono benvenute!
L'input e l'output viene realizzato tramite i buffer in
memoria. Questo consente di far eseguire le cose più velocemente. Quello
che i programmi scrivono può essere tenuto in memoria, in un buffer, e
quindi scritto su blocchi di disco in modo molto più efficiente. I
demoni kflushd
e kupdate
hanno questo compito:
kupdate
viene eseguito periodicamente (5 secondi?) per
verificare se vi siano dei buffer utilizzati. Se ci sono, richiama
kflushd
per riversarli sul disco.
Spesso i processi non hanno nulla da fare, e spesso, quelli in
esecuzione non hanno bisogno di tenere in memoria tutto il loro codice
ed i loro dati. Questo significa che possiamo fare un utilizzo migliore
della memoria, spostando le porzioni inutilizzate dei programmi sulla(e)
partizione(i) di swap dell'hard disk.
Il trasferimento di questi dati da e verso la memoria a seconda della
necessità viene gestito di demoni kpiod
e kswapd
. Ogni
secondo circa, kswapd
si attiva e verifica lo stato della
memoria e, se qualcosa che era stato portato sul disco diventa
necessario alla memoria, o se non c'è memoria libera a sufficienza,
viene attivato kpiod
.
Sul vostro sistema potrebbe essere in esecuzione anche il demone
kapmd
, se avete configurato il kernel con la gestione
automatica dell'energia.
Il programma update
vi consente di configurare kflushd
e kswapd
. Provate il comando update -h
per avere
maggiori informazioni.
Lo spazio di swap viene attivato da swapon
, e disattivato da
swapoff
. Lo script di init (/etc/rc.sysinit
oppure
/etc/rc.d/rc.sysinit
) generalmente fa una chiamata a
swapon
quando il sistema si avvia.
Mi è stato detto che swapoff
è comodo per il risparmio
energetico sui portatili.
Eseguite un update -d
(NdT: al momento della traduzione,
l'opzione -d
non viene contemplata dal programma udate
,
e notate cosa viene blaterato nell'ultima riga riguardo al ``threshold
for buffer fratricide'' (NdT: ``punto limite per un fratricidio tra
buffer''). Ecco un argomento intrigante, provate ad investigare!
Entrate nella directory /proc/sys/vm
e visualizzate con
cat
i file ivi contenuti. Vedete cosa riuscite a scoprire.
Il documento ``The Linux Kernel'' su Linux Documentation Project (LDP) (vedete la sessione The Linux Kernel per la URL)
Il codice sorgente del kernel Linux, se siete abbastanza coraggiosi!
Il codice di kswapd
è in linux/mm/vmscan.c
,
quello di kflushd
e di kupdate
sono in
linux/fs/buffer.c
.