Haku ( englanniksi pageing ; termiä swap from swap , /swɔp/ käytetään joskus ) on yksi virtuaalimuistin mekanismeista , jossa yksittäisiä muistin fragmentteja (yleensä ei-aktiivisia) siirretään RAM -muistista toissijaiseen tallennustilaan ( kiintolevylle tai muulle ). ulkoinen asema, kuten flash-muisti ), vapauttaa RAM-muistia muiden aktiivisten muistiosien lataamista varten. Tällaiset fragmentit nykyaikaisissa tietokoneissa ovat muistisivuja.
Muistista väliaikaisesti puretut sivut voidaan tallentaa ulkoisille tallennuslaitteille sekä tiedostoina että kiintolevyn erityisosioon (osio), joita kutsutaan swap-tiedostoiksi ja sivuosioksiksi. Jos RAM-muistista on tarpeen purkaa sivuja, jotka vastaavat kiintolevyllä olevan tiedoston sisältöä (esimerkiksi muistiin yhdistetyt tiedostot), niitä ei saa purkaa, vaan ne voidaan yksinkertaisesti poistaa. Kun tällaista sivua pyydetään, se voidaan lukea alkuperäisestä tiedostosta.
Kun sovellus käyttää sivua, joka ei ole RAM-muistissa, tapahtuu PageFault-poikkeus. Tämän tapahtuman käsittelijän tulee tarkistaa, onko pyydetty sivu vaihdettu aiemmin, ja jos se on swap-tiedostossa, lataa se takaisin muistiin.
Alun perin swapilla ymmärrettiin prosessin purkaminen RAM-muistista kokonaisuutena, minkä seurauksena ei-aktiiviset prosessit saattoivat olla kokonaan poissa RAM:ista. Kun prosessin aktivointiehdot täyttyivät, muistinhallinta latasi prosessikuvan takaisin.
Käsitteen merkitys muuttui 60-luvulla , kun käyttöjärjestelmiin ilmestyi tuki virtuaaliselle muistille : vaihtaminen alkoi tarkoittaa yksittäisten sivujen lataamista ja purkamista. Haku otettiin ensimmäisen kerran käyttöön Atlas -tietokoneessa , joka julkaistiin vuonna 1962.
Hakumekanismin päätoiminnot suoritetaan, kun ohjelma yrittää päästä sivuille, joita ei ole tällä hetkellä yhdistetty fyysiseen muistiin (RAM). Tätä tilannetta kutsutaan sivuvirheeksi . Tässä vaiheessa käyttöjärjestelmän tulee ottaa hallintaansa ja käsitellä sivuvirhe ohjelmalle läpinäkyvällä tavalla. Näin ollen käyttöjärjestelmä tarvitsee:
Jos tyhjän sivukehyksen vastaanotettaessa vapaata RAM-muistia ei ole tarpeeksi, suoritetaan sivunvaihtoalgoritmi, joka valitsee yhden käytetyistä sivukehyksistä purettavaksi. Jos sivuttava sivukehys on allokoitu dynaamisesti ohjelman suorituksen aikana tai jos se on osa ohjelman datasegmenttiä ja on muuttunut sen jälkeen, kun se luettiin muistiin (eli jos se on "likautunut"), se on tallennettu toissijaiseen tallennustilaan ennen purkamista. Muuten sivukehyksen sisältö RAM-muistissa on sama kuin sivun sisältö toissijaisessa tallennustilassa, joten sitä ei tarvitse sivuttaa. Jos lataamattomalle sivulle päästään myöhemmin ajon aikana, tapahtuu uusi sivuvirhe ja sivukehys on varattava uudelleen, jotta sivun sisältö toissijaisessa tallennustilassa voidaan ladata uudelleen RAM-muistiin.
Tehokkaan toiminnan varmistamiseksi hakujärjestelmän on valittava sivuttaviksi ne sivukehykset, joihin on vähiten pääsy lähitulevaisuudessa. Sivujen vaihtoalgoritmeja on useita . Käyttöjärjestelmät käyttävät LRU- ( viimeksi käytetty ) -, FIFO- ( First In First Out ) -algoritmeja tai algoritmeja ottaen huomioon prosessin työjoukon [1] .
Parantaakseen vasteaikaa edelleen hakujärjestelmät voivat käyttää erilaisia strategioita seuraavan sivun osumien ennustamiseen. Tällaiset järjestelmät yrittävät ladata sivut päämuistiin hyvissä ajoin ennen kuin ohjelma pääsee niihin.
Kun varaat tilaa uudelle sivulle, voi olla tarpeen poistaa mikä tahansa muistissa oleva sivu. Sivun korvaussääntöjä käytetään päättämään, mikä sivu poistetaan muistista. Ihanteellinen ehdokas on "kuollut" sivu, jota kukaan ei enää tarvitse (esim. viittaa päättyneeseen prosessiin). Jos muistissa ei ole tällaisia sivuja (tai niitä ei ole tarpeeksi), käytetään paikallisen tai globaalin sivun korvaamisen sääntöä:
Yleisimmin käytetyt hakukriteerit:
Useimmat ohjelmat eivät käytä kaikkea niille varattua muistia kerralla, vaan vain osaa siitä, mikä määräytyy parhaillaan suoritettavien ohjeiden ja niiden tarvitsemien tietojen mukaan. Mikäli ohjelma noudattaa paikallisuusperiaatetta , muistin osuus voi olla huomattavasti pienempi kuin koko ohjelmalle varattu muisti. Tämän käyttökelpoisen osan koko heijastaa ohjelman saavuttamista jonkin verran vakaan tilan muistinkulutuksessa, ja sitä kutsutaan usein työjoukoksi .
Virtuaalimuistijärjestelmät toimivat tehokkaasti, kun kaikkien prosessien työsarjojen summa ei ylitä fyysisen RAM-muistin kokoa. Tässä tapauksessa sivuvirheiden käsittelyyn kuluvalla ajalla ei ole paljon vaikutusta suorituskykyyn. Suurien tietorakenteiden kanssa toimivan ohjelman toimintajoukko voi kuitenkin olla liian suuri, jotta swap-järjestelmä palvelisi tehokkaasti. Tämä johtaa jatkuvaan sivuvirhevirtaan ja tietokoneen suorituskyvyn jyrkkään laskuun. Tätä tilannetta kutsutaan thrashingiksi : sivuja puretaan jatkuvasti ja sitten niitä käytetään, mikä aiheuttaa usein sivuvirheitä.
Kiinnostava piirre pussituksessa on, että tiettyyn kriittiseen pisteeseen asti sivuvirheiden määrä kasvaa hitaasti työskentelyjoukon kasvaessa. Tämän kriittisen pisteen saavuttamisen jälkeen sivuvirheiden määrä kasvaa dramaattisesti ja suurin osa prosessointitehosta kuluu niiden käsittelyyn.
Liukastumisen välttämiseksi käyttäjä voi suorittaa seuraavat toimet:
Ulkoisilla tallennuslaitteilla (esimerkiksi kiintolevyillä) sijaitsevien virtuaalimuistitietojen tapauksessa, kuten useimmiten tapahtuu, muistin käyttö hidastuu (verrattuna hajasaantimuistilaitteisiin).
SSD-asemien vaihtaminen (joilla on rajoitettu määrä kirjoitusjaksoja) lyhentää suurella todennäköisyydellä niiden käyttöikää. Mutta se lisää huomattavasti vaihtonopeutta. Jos SSD-levyä ei ole suunniteltu perittäväksi, tämä on hyödyllistä.
32-bittisissä Windows XP-, Vista- ja 7-käyttöjärjestelmissä swap-tiedosto voi käyttää yli 3 gigatavua RAM-muistia käyttämällä kolmannen osapuolen muistilevyn luontiohjelmistoa .
Linux tukee samanlaista mekanismia, zswap , joka sijoittaa swapin muistiin pakatussa muodossa.
Virtuaalisen tiedon tallennuksen toteutus eri käyttöjärjestelmissä eroaa niiden ytimien ja tiedostojärjestelmien arkkitehtonisista ominaisuuksista johtuen.
Käytön aikana sivutustiedosto (levyosio tai tiedosto osiossa) voi pirstoutua, eli vierekkäiset virtuaalimuistialueet koostuvat useista erillisistä (epäjatkuvista) alueista sivutustiedostossa. Kun luetaan ja kirjoitetaan sivutietoja, jotka sijaitsevat lineaarisesti virtuaalimuistissa, mutta hajallaan sivutustiedoston yli, kiintolevypäiden siirtäminen seuraavan alueen alkuun vie paljon aikaa. Tämä voi johtaa koko järjestelmän suorituskyvyn laskuun hitaiden I/O-pyyntöjen runsauden vuoksi.
Swap-tiedostosta (osiosta) on usein mahdollista poimia luottamuksellisia tietoja , joita käytetään laskentajärjestelmän toiminnassa. Siksi salaisia tietoja käytettäessä swap yleensä tyhjennetään - esimerkiksi käyttämällä suojatun poistopaketin swap-apuohjelmaa .
Myös monet arvokasta tietoa tai salausta käyttävät ohjelmat voivat valikoivasti poistaa muistinpalasten pumppaamisen pois käytöstä.
Linuxissa voit salata sivutustiedoston tai osion (esimerkiksi Ubuntu-jakelussa tämä tapahtuu automaattisesti, kun valitset vaihtoehdon salata käyttäjän kotihakemisto käyttöjärjestelmän asennuksen aikana). Tämä ratkaisu lisää jonkin verran prosessorin kuormitusta, mutta takaa luottamuksellisten tietojen turvallisuuden myös äkillisen sähkökatkon sattuessa.
Sivutustiedoston käyttö voi johtaa joidenkin käyttöjärjestelmien saastumiseen tietokoneviruksilla , koska siinä on haavoittuvuus , jonka avulla voit työntää käynnissä olevia ohjelmia virtuaalimuistiin ja muuttaa käynnissä olevaa koodia käyttämällä suoraa pääsyä kiintolevylle.
Unixissa ja vastaavissa käyttöjärjestelmissä swap sijoitetaan yleensä erilliseen kiintolevyosioon, mikä aiemmin teki tiedon saamisesta nopeampaa kuin swap-paikannus tavallisessa osiossa. Linux-ytimissä 2.6 ja uudemmissa swap-tiedoston suorituskyky on yhtä hyvä kuin sivutusosion [2] [3] .
Esimerkki sivutustiedoston luomisesta GNU/Linuxille:
# dd jos=/dev/nolla =/swap bs=1024 count=128K # mkswap /swap # synkronointi # vaihto / vaihtoOracle Solaris voi käyttää ZFS- asemia swap-osioina:
# zfs luo -V 2G pool/swap # swap -a /dev/zvol/dsk/pool/swapSen lisäksi, että niitä käytetään järjestelmän ollessa käynnissä, jotkin GNU/Linux-jakelut käyttävät swap-osiota järjestääkseen lepotilan ("lepotila", "lepotila tai "suspend to disk" - S4 ACPI -tila ). Tämän tilan tukemiseksi swapin koko on asetettava yhtä suureksi kuin RAM-muistin koko, lisättynä 10-15%.
Kiintolevyn vaihtoon tarkoitettu alue sijaitsee erillisessä tiedostossa nimeltä swap file , swap file ( englanniksi swap file ). Sitä kutsutaan nimellä pagefile.sys , ja järjestelmä luo sen oletusarvoisesti C: -aseman juurihakemistoon . Jatkossa käyttäjä voi hallita sivutustiedoston kokoa ja sijoittelua esimerkiksi ohjauspaneelin kohdassa Järjestelmä .
Windows 9x:ssä sivutustiedoston nimi on win386.swp ja se sijaitsee Windows-hakemistossa. Muokkaamalla system.ini-tiedostoa se voidaan kuitenkin siirtää juurihakemistoon myöhempää jakamista varten Windows NT:n kanssa.
Lisäksi Windows Vistasta alkaen tuli mahdolliseksi luoda oma sivutusosio, joka on samanlainen kuin UNIX-järjestelmissä käytetyt osiot.
Käyttöjärjestelmien näkökohdat | |||||
---|---|---|---|---|---|
| |||||
Tyypit |
| ||||
Nucleus |
| ||||
Prosessien hallinta |
| ||||
Muistinhallinta ja osoitus |
| ||||
Lataus- ja alustustyökalut | |||||
kuori | |||||
Muut | |||||
Luokka Wikimedia Commons Wikikirjat Wikisanakirja |