Näköjään se oli kiinteäksi muutettu, ei kyllä mitään muistikuvaa että olisin koskaan noita muutellut. Ei ollut oikestaan käsitystä edes että mikä tää koko virtuaalimuisti on mutta nyt sen käsitin googletuksen jälkeen että jos ram muisti loppuu niin sit käytetään tätä levylle asetettua muistitilaa. Kun pelailin äsken niin hwinfon mukaan ram muisti ei kuitenkaan ollut missään vaiheessa käynyt yli tuota 12.5GB, eli jotain sellasta on tapahtunut jota en vielä ihan ymmärrä.
Nykyaikaisissa käyttiksissä ohjelmat näkevät ainoastaan virtuaalisia muistiosoitteita, ei ollenkaan oikeita fyysisiä muistiosoitteita. Ja muistinhallinta toimii sivuperiaatteella, tyypillisesti neljän kilotavun sivu kerrallaan.
Käyttöjärjestelmä päättää, miten virtuaaliset osoitteet mäpätään fyysiseen muistiin, ja kertoo sen prosessorille. Muistiaccessia tehdessä prosessorin muistinhallintayksikkö muuttaa virtuaaliset osoitteet fyysisiksi osoitteiksi. Ja monta virtuaalista osoitetta voi osoittaa samaan fyysiseen osoitteeseen.
Ja virtuaalimuistisivun osoite voidaan merkata myös että se ei osoita mihinkään fyysiseen osoitteeseen, jolloin sitä käyttäessä kontrolli menee käyttöjärjestelmälle. Tällä mahdollistetaan se, että vähemmän käytettyä osia ohjelman muistista voidaan heittää käyttöjärjestelmän toimesta fyysisestä muistista pihalle kovalevylle "swapfileeseen", ja jos tätä dataa yritetään uudestaan käyttää, käyttöjärjestelmä sitten lataa sen levyltä takaisin fyysiseen muistiin (ja heittää jotain muuta pihalle fyysisestä muistista levylle sen tieltä)
Ja muistin varaamisesta:
Kun ohjelma pyytää muistia, sitä muistia ei heti fyysisesti varata, vaan se ohjelmalle annettu muisti mäpätään "nollasivuun" joka on täynnä nollia; sitä voi vapaasti lukea ja luku antaa aina nollan.
Ja monta eri virtuaalista ohjelman (jopa eri ohjelmien) muistisivua voi kaikki viitata samaan neljän kilotavun nollasivuun, eli ohjelmat voivat olla varanneet megatavuittain tai jopa gigatavuittain muistia, mutta jos ne eivät käytä sitä, ne kaikki viittaavat saman 4 kilotavun nollasivuun, fyysistä muistia kuluu näihin kaikkiin yhteensä vain 4 kilotavua. (*)
Vasta kun ohjelma oikeasti kirjoittaa siihen muistiin mitä se on varannut, käyttöjärjestelmä oikeasti varaa sen fyysisen muistin ja muuttaa sen muistisivun mäppäyksen pois nollasivulta, sille juuri varatulle sivulle.
Mutta: kun muistia varataan ohjelman toimesta, ja varattu muisti mäpätään nollasivulle, Windows tarkastaa että järjestelmässä riittää jonkinlainen talletustila (fyysinen RAM-muisti + kovalevyn swapfile) siihen, että JOS kaikki nollasivulle mapattu muisti pitäisikin mäpätä muualle, se pystyttäisiin tekemään.
Eli windowsissa voi olla tilanne, että meillä on vaikka 16 GiB fyysistä muistia + 8 gigaa swapfileä, ja fyysistä muistia on oikeasti käytössä vaikka vain 12 GiB mutta jos yritetään varata toiset >12 GiB muistia eikä käytetä sitä mihinkään, käytössä olevan fyysisen muistin määrä ei nouse yli 12 gigan, mutta muistinvaraus epäonnistuu, koska windows ei anna varata yli 24 gigaa muistia kokonaisuudessaan kun systeemissä on vain 24 gigaa kokonaisuudessaan muistitilaa.
Käsittääkseni Linuxissa oletuksena ei ole samanlaista tarkastusta kuin windowsissa, vaan Linux oletuksena antaa varata enemmän muistia kuin mitä järjestelmässä on, ja jos se sitten oikeasti loppuu kesken, Linux alkaa tappaa eniten muistia kuluttavia ohjelmia.
On Linux systems (including real time ones with PREEMPT-RT), C programs allocates memory using the system libc, usually using malloc(). On modern systems, the dynamic memory allocation uses the principle of overcommit. This is based on MMU and the interruption generated when accessing non-mapped...
www.linuxembedded.fr
Mutta näköjään linuxistakin tuon "overcommitin" saa pois päältä jolloin se käyttäytyy kuten Windows tuon suhteen
(*) Oikeasti sitä muistia kuluu hiukan enemmän, sivutauluihin eli kirjanpitodataan joilla nämä mäppäykset muodostetaan.