Ha kiadod a "ps aux
" parancsot, valami ehhez hasonlót fogsz látni:
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
Ez a rendszerben futó folyamatok listája. Az információ a /proc
fájlrendszerből (amit az előző részben már említettem)
származik. Figyeld meg, hogy az "init
" az egyes számú folyamat. A "kflushd", "kupdate", "kpiod" és a "kswapd" a 2, 3, 4 és 5-ös számú
folyamatok. Van azonban valami furcsa: nézd meg mind a virtuális tárolási méret (SIZE), mind a valódi tárolási méret (RSS)
nevű oszlopokat. Ezeknél a folyamatoknál nullák szerepelnek. Hogyhogy egy folyamat nem használ memóriát?
Ezek a folyamatok a kernel démonok. A kernel legnagyobb része egyáltalán nem mutatkozik a folyamatlistákon. Csak úgy találhatod ki mennyi memóriát használnak, ha kivonod a gépben lévő memóriából a rendelkezésre álló memória mennyiségét. A kernel démonok az "init" után indulnak el, így kapnak folyamatszámot ugyanúgy, mint a normál folyamatok. De a kódjuk és adataik a kernel részére lefoglalt memóriában van.
A COMMAND oszlop bejegyzéseinél zárójelek vannak, mivel a /proc
fájlrendszer nem tartalmaz parancssori
információkat ezekről a folyamatokról.
Tehát mire is valók ezek a kernel démonok? E dokumentum előző verzióiban volt egy segítségkérő rész, mivel nem tudtam sokat róluk. A következő történet az erre adott válaszokból (amiért nagyon hálás vagyok) lett összerakva. Szívesen fogadom a további okosításokat, referenciákat és kiigazításokat!
A bevitel és kivitel puffereken (buffers) keresztül történik a memóriában. Ettől gyorsabban mennek a dolgok.
Amit a programok írnak, a memóriában lehet tartan - egy pufferben - ezután nagyobb (hatékonyabb) darabokban lehet a lemezre írni.
A "kflushd
" és "kupdate
" démonok ezt a munkát végzik: a "kupdate
" periodikusan lefut
(5 másodpercenként?), hogy leellenőrizze van-e használt puffer (dirty buffers). Ha igen, utasítja a "kflushd
" démont,
hogy írja ki őket a lemezre.
A folyamatoknak gyakran semmi dolguk, és azoknak amik éppen futnak, gyakran nincs arra szükségük,
hogy az össszes kódjukat és adataikat a memóriában tartsák. Ez azt jelenti, hogy jobb hasznát vesszük a memóriánknak,
ha a futó programok éppen nem használt részeit kiírjuk a merevlemez csere (swap) partíciójára. Az adat szükséges ki- és
bemozgatását a memóriába (-ból) a "kpiod
" és a "kswapd
" végzi. Minden másodpercben vagy valahogy így,
a "kswapd
" felébred, hogy leellenőrizze a memória helyzetét, és ha szükség van valamire a memóriában -
ami a lemezen található - vagy nincs elég szabad memória, a "kpiod
" hívódik meg.
Lehet, hogy a "kapmd
" démon is fut a rendszereden, ha az automatikus áramgazdálkodás (automatic power management)
be van fordítva a kerneledbe.
Az "update
" programal lehet beállítani a "kflushd
" és a "kswapd
" démonokatt.
Próbáld az "update -h
" parancsot kiadni valami információért.
A csere partíciót be lehet kapcsolni a "swapon
", és ki lehet kapcsolni a "swapoff
" paranccsal.
Az init szkript (/etc/rc.sysinit
vagy /etc/rc.d/rc.sysinit
) általában meghívja a "swapon
"-t,
amint a rendszer elindul. Azt mondták nekem, hogy a "swapoff
" praktikus, ha áramot akarunk spórolni laptopon.
Csinálj egy update -d
-t, és figyeld a dumát az utolsó sorban a "threshold for buffer fratricide"-ről.
Most már van egy érdekes fogalmad, járj utána!
Lépj be a /proc/sys/vm
könyvtárba és adj ki egy "cat
" parancsot az ott lévő fájlokra.
Figyeld meg, mi mindenre tudsz rájönni ezáltal.
A Linux Dokumentációs Projekt "The Linux Kernel" dokumentuma (lásd A Linux kernel fejezetet URL-ért)
A Linux kernel forráskódja, ha elég bátor vagy!
A "kswapd
" kódja a linux/mm/vmscan.c
-ben,
a "kflushd
" és "kupdate
" kódja pedig a
linux/fs/buffer.c
fájlban van.