V tomto dílu budete svědky malého zázraku. Po dlouhé době snad zvládneme více než jeden soubor. Na druhou stranu dva není zase až takový rozdíl :). Pravda, je to hlavně tím, že druhý soubor odbudeme pár větami.
Jak velí tradice, nejprve výpis základního adresáře /proc. Tečka před názvem znamená, že už to máme za sebou:
.840 .devices .kcore modules stat ide/ .842 .dma .kmsg mounts swaps irq/ .847 .execdomains .ksyms mtrr uptime net/ .848 .filesystems .loadavg partitions version nv/ .apm .interrupts .locks pci bus/ sys/ .cmdline .iomem meminfo self@ driver/ sysvipc/ .cpuinfo .ioports misc slabinfo fs/ tty/
- meminfo
-
Přehledný způsob, jak získat (nejen úplně základní) informace o stavu paměti. První dva řádky jsou stejné (až na jednotky) jako výpis programu free:
total: used: free: shared: buffers: cached: Mem: 262213632 115609600 146604032 0 3411968 58961920 Swap: 133885952 0 133885952 MemTotal: 256068 kB MemFree: 143168 kB MemShared: 0 kB Buffers: 3332 kB Cached: 57580 kB SwapCached: 0 kB Active: 18352 kB Inact_dirty: 42560 kB Inact_clean: 0 kB Inact_target: 0 kB HighTotal: 0 kB HighFree: 0 kB LowTotal: 256068 kB LowFree: 143168 kB SwapTotal: 130748 kB SwapFree: 130748 kB
Pro jednotlivé velikosti platí většinou celkem intuitivní pravidla. Nejprve první dva řádky. Total je celkové množství dostupné fyzické paměti/swapu v bajtech. U fyzické paměti je od velikosti skutečné fyzické paměti odečteno množství alokované pro jádro při startu systému. To lze nalézt ve výpise při bootování jádra. Used je množství nějakým způsobem použité paměti/swapu. Free je množství paměti, která je nevyužita (ani pro cache nebo jiné účely). Celkem dle očekávání platí Total = Used + Free. Dále, jak bylo řečeno, Fyz.RAM = Total + KernelMem.
Poněkud pofidérní položka je Shared. Intuitivně bych očekával, že jde o počet stránek (krát jejich velikost), které jsou sdíleny více procesy (například kód programu mingetty nebo Eterm). Bohužel v architekturách ia32, ia64, m68k, arm, alpha, parisc, ppc, sparc i s390 je na tohle místo natvrdo dosazena nula. To může znamenat dvě věci. Buď je význam této položky jiný než můj odhad, nebo všechny tyhle architektury nemají potřebný HW k tomu, aby se tato informace dala (rozumně) spočítat. Jediný, kdo něco počítá, je mips a cris.
Dále se dostáváme k paměti použité pro vyrovnávací účely. Jde o „Buffers“ a „Cached“. Paměť označená jako „Buffers“ je použita jako vyrovnávací paměť pro vstupně/výstupní operace nad blokovými zařízeními. Jsou zde tedy především bloky dat z disků. V Linuxu (narozdíl třeba od mnoha komerčních Unixů) není její velikost (maximum) pevně dána, ale využívá se pro tento účel i dostupná volná paměť. Začne-li paměť docházet, část bufferů se aktualizuje na cílovém médiu (pokud byly modifikovány) a uvolní se pro potřeby uživatelských programů. „Cached“ je obdoba pro stránky fyzické paměti. Časem se přišlo na to, že pokud uživatel čte/zapisuje data z/na externí zařízení (jako disk), je druhým koncem komunikace paměť. Proto má smysl provádět uchovávání obsahu ne na úrovni bloků, ale na úrovni paměťových stránek. Existuje proto systém, jak efektivně vyhledávat a manipulovat s patřičnými stránkami. Opět, pokud potřebujeme volnou paměť, najde se stránka, která již není používána, aktualizuje se na médiu a uvolní. Prvním systémem vyrovnávacích pamětí byly buffery na úrovni bloků, pak ale přišla stránková cache a zjistilo se, že je obecnější a výhodnější. Proto dnes existují dvě úrovně vyrovnávacích pamětí.
V dalším výpise se ještě opakují stejné položky, a to jmenovitě: MemTotal, MemFree, MemShared, Buffers, Cached, SwapTotal, SwapFree. Jejich význam je zcela identický s odpovídajícími složkami popsanými výše.
Aktivní stránky paměti jsou ty, které jsou v daném okamžiku skutečně využívány běžícími procesy. Neaktivní se potom dělí na modifikované – před uvolněním je třeba zapsat je někam na disk (do swapu), čisté – nemodifikované, ty lze uvolnit okamžitě, a tzv. target. To je číslo (velikost paměti), které udává míru aktivity subsystému pro správu paměti. Zjednodušeně by se to dalo označit jako průměrné množství paměti požadované za poslední měřený interval (řádově sekundy). Tak jako loadavg určuje zatížení procesoru, tohle číslo určuje zatížení VM (Virtual Memory) subsystému.
V Linuxu je paměť rozdělena na tzv. Low a High. High paměť byla (pro pamětníky) i v DOSu, dokonce s podobným významem jako tady. Jen velikosti a hranice se „trošku“ posunuly. V Linuxu je jako High paměť označována fyzická paměť za hranicí normálního adresování v 32bitovém režimu (přes 4GB). Tato paměť není (jako v DOSu) přímo dostupná a musí se pro použití namapovat (viz třeba EMS) do adresovatelné oblasti. Linux tak dokáže pracovat až s 64GB fyzické paměti. Tento systém rozdělení paměti je charakteristický pro 32bitové architektury (konkrétně ia32). Alphy a ia64 už takové zbytečnosti díky svému rozsahu adres nepotřebují.
- misc
-
Soubor misc obsahuje výpis obsazených vedlejších čísel pro zařízení s hlavním číslem 10:
175 agpgart 135 rtc 134 apm_bios 1 psaux
Při výpisu adresáře /dev vidíme následující (pro klasický /dev bez devfs).
ls -l /dev | grep " 10," (zkráceno):crw-rw-r-- 1 root root 10, 175 srp 24 2000 agpgart crw-rw---- 1 root root 10, 4 srp 24 2000 amigamouse crw------- 1 root root 10, 134 čen 11 22:21 apm_bios crw-rw---- 1 root root 10, 1 srp 20 19:17 psaux crw-rw---- 1 root root 10, 1 srp 24 2000 psmouse crw-rw-r-- 1 root root 10, 135 srp 24 2000 rtc crw-rw---- 1 root root 10, 6 srp 24 2000 sunmouse crw-rw---- 1 root root 10, 165 srp 24 2000 vmmon
O co jde? V počítači existuje poměrně dost zařízení, která se (téměř) vždy vyskytují pouze jednou. Klasickým příkladem je apm_bios nebo RTC – Real Time Clock. Pro ty by bylo zbytečné vyhradit jedno celé hlavní číslo a mít pouze jedno vedlejší (0). Proto je pro tato speciální zařízení vyhrazeno jedno hlavní číslo a jednotlivá zařízení se pak rozlišují číslem vedlejším. Pro jednoduší přehled právě využívaných vedlejších čísel (ke kterým je natažen odpovídající ovladač) existuje právě tento soubor.
Přiznávám, že část pojednávající o vyrovnávajících pamětech je poněkud strohá, a tudíž i možná trochu nepřesná. Bohužel nemám momentálně dostatek potřebných materiálů, abych si to mohl detailněji nastudovat. Jakmile tak učiním, ještě se k tomuto tématu krátce vrátím.