4 Mäluhaldus
See peatükk kirjeldab Linuxi mäluhaldusvõimalusi, st virtuaalmälu ja ketta puhvermälu kasutamist. Siin on selgitatud eesmärke ja tegevusi, mida süsteemiülem peab oma töös arvestama.
4.1 Mis on virtuaalmälu
Linux toetab virtuaalmälu (st ketta kasutamist RAM-i laiendina), nii et käideldava mälu suurus kasvab oluliselt. Tuum kirjutab kasutamata mäluploki sisu kõvakettale, et mälu saaks kasutada muuks otstarbeks. Kui esialgset sisu vaja läheb, loetakse ta mällu tagasi. Kogu protseduur on tehtud kasutajale täiesti läbipaistvaks. Linuxi all töötavad programmid näevad ainult vaba mälu ja ei märka, et osa sellest paikneb aeg-ajalt kettal. Loomulikult on lugemine ja kirjutamine kõvakettal aeglasem (umbes tuhat korda) kui päris mälu, mistõttu programmid ei tööta sama kiiresti. Virtuaalmäluna kasutatavat kõvaketta osa nimetatakse saalealaks.
Linux saab rakendada saalealana failisüsteemi tavalist faili või eraldi sektsiooni. Saalesektsioon on kiirem, kuid saalefaili suurust saab hõlpsamini muuta (ei ole vajadust terve kõvaketta ümberjaotamiseks ja võib-olla ka taasinstalleerimiseks). Kui saaleala suurus on teada, siis valige saalesektsioon, aga kui see pole kindel, tuleks kõigepealt kasutada saalefaili. Saaleala suurusest annab ettekujutuse töö süsteemiga ning pärast seda saab vajaduse korral luua ka sobiva saalesektsiooni.
Ärge unustage, et Linux lubab kasutada mitut saalesektsiooni ja/või saalefaili samal ajal. See tähendab, et kui kohati on vaja erandlikult suurt saaleala, võib moodustada täiendava ajutise saalefaili.
4.2 Saaleala loomine
Saalefail on tavaline fail ta ei tähenda tuuma jaoks midagi erilist. Tuumale on oluline, et selles failis pole avasid, ta peab paiknema kohalikul kettal ning olema valmis kasutamiseks koos programmiga mkswap.
Avade kohta käiv bitt on väga oluline. Saalefail reserveerib kettaruumi nii, et tuum saaks kiiresti täita kõik failile ketta sektori eraldamiseks vajalikud sammud. Tuum kasutab ainult neid sektoreid, mis on juba failile eraldatud. Ava failis tähendab, et selle koha jaoks pole ketta sektoreid määratud ja tuum ei peaks neid kasutama.
Hea moodus avadeta saalefaili loomiseks on järgnev käsk:
$ dd if=/dev/zero of=/extra-swap bs=1024 count=1024 1024+0 records in 1024+0 records out $
/extra-swap on saalefaili nimi ja parameeter count määrab faili suuruse. Sobiv suurus on neljakordne, sest tuum kirjutab kettale 4 KB-sed mäluleheküljed. Kui suurus pole neljakordne, võivad viimased kilobaidid kasutamata jääda.
Saalesektsioon pole samuti millegipoolest eriline, sest ta luuakse täpselt samamoodi kui iga teine sektsioon. Ainus erinevus seisneb selles, et saalesektsiooni kasutatakse puhta sektsioonina (st ta ei sisalda ühtki failisüsteemi). On soovitav tähistada saalesektsioonid tüübiga 82 (Linuxi saale). See teeb sektsioonide loendi selgemaks isegi juhul, kui tuum loendit otseselt ei kasuta.
Pärast saalefaili või saalesektsiooni loomist tuleb algusse kirjutada signatuur, mis sisaldab teatud haldusteavet tuuma jaoks. Käsk signatuuri loomiseks on mkswp, mida kasutatakse järgnevalt:
$ mkswap /extra-swap 1024
Setting up swapspace, size = 1044480 bytes
$
Sellega on saaleala loodud, aga tuum ei kasuta teda veel virtuaalmäluna.
Käsu mkswap rakendamisega peab olema väga ettevaatlik, kuna puudub kontroll ja ülevaade faili või sektsiooni kasutamise kohta. Tähtsad failid ja sektsioonid saab käsuga mkswap hõlpsasti üle kirjutada! Õnneks peaks seda käsku vaja minema vaid süsteemi installeerimisel.
Linuxi mäluhaldur piirab saaleala suuruse umbes127 MB-ga (erinevatel tehnilistel põhjustel, täpne piir on (4096 - 10) × 8 × 4096 = 133890048 baiti ehk 127,6875 MB). Korraga saab kasutada kuni 16 saaleala suurusega kokku peaaegu 2 GB.
4.3 Saaleala kasutamine
Loodud saaleala võetakse kasutusele käsuga swapon. See käsk teatab tuumale, et saaleala saab kasutada. Saalefaili pöördustee on antud argumendina, seega saalimise alustamiseks ajutise saalefailiga võib kasutada järgmist käsku:
$ swapon /extra_swap
Saalealad võetakse automaatselt kasutusele vastavalt failis /etc/fstab sisalduvale loendile.
/dev/hda8 none swap sw 0 0 /swapfile none swap sw 0 0
Alglaadeskriptid täidavad käsu swapon -a, mis käivitab saalimise kõigil failis /etc/fstab loetletud aladel. Seetõttu kasutatakse käsku swapon tavaliselt täiendava saalevajaduse korral.
Saalealade kasutamist saab jälgida programmiga free, mis teatab kogu kasutatava saaleala suuruse.
$ free
total used free shared buffers
Mem: 15152 14896 256 12404 2528
-/+ buffers: 12368 2784
Swap: 32452 6684 25768
$
Esimese rea väljund (Mem:) näitab füüsilist mälu. Veerg total ei näita tuuma kasutatavat füüsilist mälu, mis on umbes üks megabait. Veerg used esitab kasutatud mälumahu (teine rida ei loe puhvreid). Veerg free näitab täielikult kasutamata mälu, veerg shared aga erinevate protsesside ühiskasutusega mälu. Veerg buffers sisaldab ketta jooksva vahemälu mahu.
Viimane rida (Swap:) esitab sama teavet saalealade kohta. Kui see rida sisaldab vaid nulle, siis pole saalealad aktiveeritud.
Analoogilist informatsiooni võib saada käsuga top või failisüsteemi proc failist /proc/meminfo. Täpseid andmeid konkreetse saaleala hetkeseisu kohta on raske anda.
Saaleala saab kõrvaldada käsuga swapoff. Tavaliselt pole see vajalik, välja arvatud ajutiste saalealade puhul. Kõik saalealas kasutatavad leheküljed on kõigepealt sisse saalitud; kui pole piisavalt mälu lehekülgede hoidmiseks, saalitakse nad välja (mõnda teise saalealasse). Piisava virtuaalmälu puudus kõigi lehekülgede säilitamiseks paneb Linuxi "tõmblema". Mõne aja pärast peaks normaalne olukord taastuma, aga senikaua on süsteem kasutuskõlbmatu. Enne saaleala kõrvaldamist tuleb käsuga free kontrollida, kas vaba mälu jätkub.
Kõik käsuga swapon -a automaatselt kasutatavad saalealad saab kõrvaldada käsu swapoff -a abil. Viimane otsib failist /etc/fstab ise saalealad, mis tuleks kõrvaldada (kõik loodud saalealad jäävad seejuures alles).
Mõnikord kasutatakse suurt saaleala isegi piisava füüsilise mälu olemasolul (näiteks juhul, kui mingil hetkel on vaja saalida, aga veidi hiljem lõpetab palju füüsilist mälu nõudev protsess töö ja vabastab mälu). Väljasaalitud mälu ei saalita automaatselt sisse, seega võib füüsiline mälu püsida vabana pikka aega.
4.4 Saalealade ühiskasutus teiste operatsioonisüsteemidega
Virtuaalmälu kuulub mitme operatsioonisüsteemi koosseisu. Kuna iga operatsioonisüsteem vajab virtuaalmälu ainult oma töö ajal (st mitte kunagi korraga), siis teiste saalealade säilitamine peale hetkel töötava süsteemi oma on ilmne ruumi raiskamine. Palju tõhusam oleks ühe ja sama saaleala ühiskasutus. Taoline variant on võimalik, kuid vajab veidi häkkerioskusi. Tips-HOWTO pakub mõningaid juhiseid selle realiseerimiseks.
4.5 Saaleala suuruse hindamine
Mõned väidavad, et saalealale peaks eraldama kaks korda enam kilobaite kui on füüsilist mälu, aga sellest reeglist pole mingit abi. Kuidas peaks saaleala suurust korralikult hindama:
Näiteks X-i vajaduseks hinnake umbes 8 MB, gcc'le paar megabaiti jne (mõned failid vajavad haruldaselt palju, kuni kümme megabaiti, aga tavaliselt piisab neljast). Tuum ise kasutab umbes üht megabaiti ja standardsed kestad ning teised väikesed utiliidid võib-olla paarsada kilobaiti (kokku ligikaudu ühe megabaidi). Liigne täpsus pole vajalik, piisab umbkaudsetest hinnangutest (soovitame püsida pessimistlikul poolel).
Pidage meeles, et kui mitu inimest kasutab süsteemi samaaegselt, tarbivad nad kõik mälu. Seejuures kui kaks kasutajat töötavad sama programmiga üheaegselt, siis kogu mäluvajadus ei ole reeglina kahekordne, kuna programmikoodi leheküljed ja ühiskasutusteegid eksisteerivad vaid ühes eksemplaris.
Mäluvajaduse hindamiseks sobivad käsud free ja ps.
On soovitav omada vähemalt veidigi saaleala, isegi kui arvutuste tulemused seda ei nõua. Linux kasutab saaleala teatud määral agressiivselt, et säilitada võimalikult palju füüsilist mälu vabana. Linux saalib välja mäluleheküljed, mida ei kasutata isegi siis, kui mälu pole millekski muuks vaja. See vähendab saalimise ooteaega, sest saalimine sooritatakse varem (kui ketas on muidu tegevuseta).
Saaleala saab jaotada mitme ketta vahel, mis lubab mõnikord jõudlust tõsta (olenevalt ketaste suhtelistest kiirustest ja pääsutingimustest).
4.6 Puhvervahemälu
Kettalt lugemine (välja arvatud loomulikult RAM-kettad) on väga aeglane võrreldes juurdepääsuga (päris) mälule. Lisaks loetakse tavaliselt ketta sama osa mitu korda järjest suhteliselt lühikese aja jooksul. Näiteks võib kasutaja kõigepealt vaadata oma meili, seejärel saata meilisõnumi redaktorisse vastamiseks ning lõpuks lasta postiprogrammil sõnum kausta kopeerida. Teine näide: arvestage, kui tihti käsku ls võidakse käivitada mitme kasutajaga süsteemis. Kui lugeda informatsiooni kettalt ainult korra ning hoida teda edaspidi mälus kuni enam vaja pole, kiirenevad kõik sammud peale esimese lugemise. Seda nimetatakse ketta puhverdamiseks ning vastav mälu on puhvervahemälu.
Kuna mälu on kahjuks piiratud (või isegi defitsiitne) ressurss, ei saa puhvermälu kunagi olla piisavalt suur (pole võimalik hoida kõiki andmeid, mida keegi võiks kunagi kasutada). Kui vahemälu saab täis, siis kasutamata andmed (st need, mida ei ole pikemat aega kasutatud) jäetakse kõrvale ja vabanevasse mällu salvestatakse uued andmed.
Kettapuhverdus töötab ka kirjutamise puhul. Teisest küljest, kirjutatud andmed loetakse sageli kohe uuesti (näiteks programmi lähtetekst salvestatakse faili ja kompilaator loeb kohe teksti). Seega kettale kirjutatud andmete salvestamine vahemällu on mõistlik. Kui panna andmed vahemällu (mitte neid kohe kettale kirjutada), töötab ka kirjutav programm kiiremini. Kirjutamise saab teha tausttööna, mis ei aeglusta teisi programme.
Paljud operatsioonisüsteemid omavad puhvervahemälu (võib-olla eri nimede all), aga mitte kõik neist ei tööta ülaltoodud põhimõtete järgi. Mõned vahemälud on nn write-through: andmed kirjutatakse kettale kohe (ja hoitakse ka vahemälus). Teisi kutsutakse nn write-back: kirjutamised tehakse hiljem. Write-back on palju tõhusam kui write-through, aga samal ajal rohkem veatundlik. Krahhi, voolukatkestuse või disketi enneaegse väljavõtmise korral läheb vahemälus tavaliselt osa andmeid kaotsi. See võib isegi failisüsteemi töökorrast välja viia, kui kirjutamata andmed sisaldasid olulisi muutusi süsteemihaldusteabes.
Seetõttu ei tohiks voolu välja lülitada süsteemi õiget sulgemisprotseduuri kasutamata või võtta disketti draivist välja enne lahutamist (kui ta oli ühendatud) või töötava programmi märguannet ja disketidraivi tule kustumist. Käsk sync puhastab puhvri, st tagab kõigi andmete kirjutamise kettale. Traditsioonilises Unix-süsteemis on programm nimega update, mis käivitab tausttööna programmi sync iga 30 sekundi tagant (seega pole tavaliselt endal vaja muretseda). Linuxil on lisadeemon bdflush, mis käitab programmi sync sagedamini, vältimaks süsteemi ootamatut tardumist ketta suure lugemis-kirjutuskoormuse tõttu. Linuxi bdflush kuulub programmi update koosseisu.
Vahemälu ei puhverda tegelikult mitte faile, vaid ketta vähimaid sisend-väljund-ühikuid ehk plokke (Linuxis tavaliselt 1 KB). Seega on vahemällu salvestatud ka kataloogid, superblock'id, failisüsteemi haldusandmed ja failisüsteemita kettad.
Vahemälu efektiivsus sõltub põhiliselt tema suurusest. Väikese vahemälu kasutussagedus on kõrge. Sinna mahub niivõrd vähe andmeid, et kõik andmed kaovad sealt enne taaskasutamist. Kriitiline suurus sõltub oluliselt sellest, kuipalju andmeid loetakse ja kirjutatakse ning kui tihti samade andmete poole pöördutakse.
Fikseeritud suurusega vahemälu puhul pole liigne maht hea, sest see võib võtta liiga palju mälu ja vähendada vaba mälumahtu, mis põhjustab omakorda saalimist ja aeglustab tööd. Mälu töö tõhustamiseks kasutab Linux automaatselt kogu vaba RAM-i puhvervahemäluna, kuid vabastab selle vajaduse korral ise.
Linuxis pole endal vaja vahemälu kasutamiseks midagi teha, kõik toimub täiesti automaatselt. Peale süsteemi õigete sulgemisprotseduuride järgimise ja diskettide korraliku väljavõtmise ei ole vaja millegi pärast muretseda.