Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!
Zadejte Vaši e-mailovou adresu:
Kamarád fotí rád?
Přihlas ho k odběru fotomagazínu!
Zadejte e-mailovou adresu kamaráda:
Software
Skutečný žrout paměti
5. prosince 2002, 00.00 | Minule jsme si ukázali jednoduchý prográmek, který sice alokuje obrovské množství paměti, ale nijak ji nevyužívá. Díky tomu také nijak neomezuje běh ostatních programů, protože nepotřebuje skoro žádnou fyzickou paměť. Daleko horší to ale je v případě, kdy aplikace nejen alokuje spoustu paměti, ale skutečně ji také využívá.
Skutečný žrout pamětiMinule jsme si ukázali jednoduchý prográmek, který sice alokuje obrovské množství paměti, ale nijak ji nevyužívá. Díky tomu také nijak neomezuje běh ostatních programů, protože nepotřebuje skoro žádnou fyzickou paměť; operační systém proto nemusí swapovat stránky paměti na disk a zpět, a nikomu je nemusí odebírat:
98 /tmp> >t.m
#include <stdlib.h>
int main() {
while (1) {
if (!malloc(100*1024*1024)) break;
usleep(100000);
}
return 0;
}
99 /tmp>
Daleko horší to ale je v případě, kdy aplikace nejen alokuje spoustu paměti, ale skutečně ji také využívá: v takovém případě samozřejmě roste rychle i její spotřeba reálné paměti — nejen virtuální. Po čase systém spotřebuje reálnou paměť, která je k dispozici, a začne odebírat stránky ostatním procesům; při tom samozřejmě musí swapovat, a práce s celým systémem se zřetelně zpomalí; někdy až na neúnosnou mez.
Máte-li chuť (a instalovanou vývojářskou podporu), můžete vyzkoušet následující jednoduchou variantu — nejprve pro jistotu uložte na disk všechny rozdělanou práci, pro případ, že by vás zpomalení systému přimělo restartovat. Na první pohled by se mohlo zdát, že mezi minulým a tímto příkladem není žádný zásadní rozdíl; jejich chování však bude diametrálně odlišné:
19 /tmp> <t.m
#include <stdlib.h>
int main() {
while (1) {
int size=100*1024*1024;
char *cp=malloc(size);
if (!cp) break;
while (size>0) cp[size-=4000]=0;
usleep(100000);
}
return 0;
}
20 /tmp> cc t.m && ( ./a.out & while (true) ; do ( ps -o ucomm,vsize,rss | fgrep a.out ) ; sleep 1 ; done )
a.out 103948 308
a.out 103948 91352
a.out 103948 102700
a.out 206348 115528
a.out 206348 128664
a.out 206348 137004
...
Hned na začátku vidíme, jak spotřeba fyzické paměti dohání virtuální paměť. Je také jasně vidět, že aplikace běží o poznání pomaleji. Jakmile začne operační systém odebírat stránky paměti ostatním procesům a swapovat — a to při rychlosti, s jakou náš prográmek paměť alokuje, bude velmi brzy — viditelně se zpomalí odezva systému jako taková; prosté přepnutí mezi dvěma okny bude trvat poměrně dlouho.
Po nějakém čase (závislém na tom, kolik a jakých aplikací zrovna běží, a také na velikosti fyzické paměti) systém vybere všechnu paměť od ostatních procesů, a začne odebírat stránky samotnému našem programu — to bude vypadat nějak takto:
...
a.out 308748 243492
a.out 308748 248764
a.out 308748 250624
a.out 411148 250284
a.out 411148 259476
a.out 411148 258292
a.out 411148 253100
a.out 411148 249848
...
Vidíme, že velikost fyzické paměti už se v zásadě nemění — víc jí prostě k dispozici není, a proto jí také program více nedostane. Jen se neustále odebírají stránky, jež momentálně nejsou zapotřebí, a ukládají se na disk.
Přepneme-li do jiné aplikace, uvidíme dokonce prudký pokles; tak tomu v mém případě bylo těsně před ukončením programu:
...
a.out 3585548 60908
a.out 3585548 61948
a.out 3585548 61936
*** malloc: vm_allocate(size=104857600) failed with 3
*** malloc[3058]: error: Can't allocate region
^C
21 /tmp>
Stojí za to si povšimnout dalšího důsledku stránkování: po ukončení našeho programu je samozřejmě všechna paměť opět volně k dispozici, ale stránky ostatním neaktivním aplikacím již jsou odebrány. Přepneme-li proto na některou z aplikací, jež jsme po celou dobu testu nepoužili, bude přepnutí zřetelně pomalejší než za normálních okolností: to proto, že aplikace musí nejprve načíst z disku do paměti prakticky všechny své stránky.
Obsah seriálu (více o seriálu):
- Obcování s ďáblem
- Obcování s ďáblem 2 - základy
- Obcování s ďáblem 3 - Práce se soubory
- Obcování s ďáblem 4 - Další práce se soubory
- Obcování s ďáblem 5 - Stále soubory, hlavně linky
- Obcování s ďáblem 6: Pár zbývajících drobností
- Obcování s ďáblem 7: Samá voda, přihořívá, hoří!
- Obcování s ďáblem 8: Jak se do shellu volá, tak se program ozývá
- Obcování s ďáblem 9: Nové finty na programy
- Obcování s ďáblem 10: Do fronty, pánové, do fronty!
- Obcování s ďáblem 11: Standardní vstup a výstup
- Obcování s ďáblem 13: Další triky
- Obcování s ďáblem 14: Vyšší škola hledání souborů
- Obcování s ďáblem 15: Příkaz find stokrát jinak
- Obcování s ďáblem 16: Co se ještě dá uvařit z příkazu find
- Obcování s ďáblem 17: Regulární výrazy
- Obcování s ďáblem 18: Speciální regulární výrazy
- Obcování s ďáblem 19: Skládání regulárních výrazů
- Obcování s ďáblem 20: Regulární výrazy se zpětnými odkazy
- Obcování s ďáblem 21:K čemu je dobrý grep...
- Zázraky ihned, nemožné na počkání: sed
- Obcování s ďáblem - další finty s příkazem sed
- Rozsáhlejší příklad se sedem
- Obcování s ďáblem: Další kouzla, aneb awk
- Awk a proměnné
- Obcování s ďáblem 27: Awk a výrazy
- Obcování s ďáblem: Awk a funkce
- Awk a příkazy
- Co je to vlastně "uživatel"?
- Vlastnictví objektů
- Přístupová práva
- Vlastník, skupina, ostatní...
- Jak je to se skupinami?
- Skupiny a uživatelé
- Scripty
- Komentáře, a volba shellu
- Pro skript může být shell cokoli!
- Shellové skripty a argumenty
- Skripty a proměnné: aritmetika
- Proměnné shellu, "dědění" hodnot
- Práce s proměnnými
- Práce se jmény souborů
- Pole hodnot
- Další triky kolem polí...
- Standardní proměnné shellu
- Základní příkazy pro skripty
- Příkaz if
- Speciální podmínkové příkazy
- Podmínky pro práci se soubory
- Jednoduchý cyklus
- Příkaz for a pomocné příkazy break a continue
- Příkaz case
- Příkazy exit a select
- Rejstřík a přehled
- Procesy
- Informace o procesech
- Další klíčová slova pro příkaz ps
- Příkaz ps: několik praktických přepínačů
- A k čemu že je "ps" dobré?
- Copak procesor, s pamětí je to horší
- Virtuální paměť
- A ještě jednou virtuální paměť
- Zpět k příkazu ps
- Skutečný žrout paměti
- Ještě jednou top
- Doplněk k topu: vm_stat
- Co to tedy všechno znamená?
- Nevychází nám dal a má dáti?
- Kam se stránky ukládají?
- Změna odkládacího disku
- Změna odkládacího disku / fstab
- Poslední poznámka k fstab
- A jak to je se soubory?
- Co vlastně příkaz lsof vypisuje?
- Příkaz lsof a obsah sloupce NAME
- SIPS - Terminál není jen pro nadšence UNIXu
- Tak nám zabili NetInfo, paní Müllerová