Seuraa 
Viestejä30866
Liittynyt16.3.2005

Miten se malloc oikien toimii? Jos varaan ison siivun muistia (sanotaan 200 megaa) ja käytän siitä osan (eli tallennan muistin alusta johonkin asti dataa), Task Manager näyttää vain sen käytetyn osan varatuksi. Mitä se sillä lopulla oikein tekee? Jos se tekee joka ohjelmalle noin, mitä sitten kun useampi käyttää yhtäkkiä koko varaamansa muistin? Bluescreeniä näyttöön? Käyttis on Win 7 pro ja kääntäjänä ilmainen Visual Studio 2012.

Tuollainen arvatenkin kuluttaa aikaa kun kone miettii paljonko muistia onkaan käytetty. Saako sen jotenkin pois päältä? Ja älkää inttäkö, tämä on liimatukkademokoodaamista, jossa jokainen kellojakso on arvossaan. Miksei tuollaisessa kääntäjässä voisi olla moodi, jossa kaikki tosielämässä turhat hienoudet heivataan romukoppaan ja tehdään brutaalisti vain oleellinen nopeus optimoiden.

Kommentit (10)

Simplex
Seuraa 
Viestejä3033
Liittynyt26.1.2010

Nopea vastaus: Muistihallintayksikkö ottaa käyttöön vain oikeasti käytössä olevat lohkot. Ohjelma voi siis kertoa käyttöjärjestelmälle, että tulen tarvitsemaan jossakin vaiheessa 200 megaa muistia (malloc), mutta käyttis ei kuitenkaan ota sitä kaikkea käyttöön vasta kuin ihan oikeasti tarvittaessa. Calloc myös nollaa varatun muistin, joten siinä tapauksessa käyttis taitaa ottaa koko allokoidun alueen käyttöönsä, minkä pitäisi näkyä myös Task managerissa. Olisiko niin, että käyttis ei anna kuitenkaan varata enempää kuin käytettävä RAM ja swap-file antavat myöten.

z
Seuraa 
Viestejä2918
Liittynyt8.9.2011

WInhotuksen sisäisistä syövereistä minulla ei ole sen kummempaa tietoa, mutta yleensä modernien käyttöjärjestelmien virtuaalimuistijärjestelmät toimivat siten, että ne allokoivat prosesseille fyysisiä muistisivuja vasta siinä vaiheessa kun niihin ensimmäisen kerran osoitetaan. Eli siis vaikka yksittäinen prosessi omasta mielestään "näkee" vaikka kuinka valtavan lineaarisen muistiavaruuden, niin oikeasti käytöjärjestelmä antaa sille käyttöön vain tarvittavat palat.

Sivujen ei myöskään tarvitse sijaita fyysisessä keskusmuistissa vaan niitä voidaan muistin käydessä vähiin heittää levylle "heittovaihto-osioon", jonka useimmat tuntenevat paremmin swappinä. Tietysti, jos koneessa pyörii samanaikaisesti useita muistinnälkäisiä ohjelmia, niin tämä voi johtaa nk. puimiseen - eli siis siihen, että kone ei käytännössä pysty tekemään muuta kuin kirjoittamaan ja lukemaan swapättyjä sivuja levyltä.

Sinänsä virtualimuistin loppumisesta ei yleensä kannata kantaa huolta. Jo jossain varhaisissa 32-bittisissä prosessoreissa virtuaalimuistinhallinta käytti > 40 bittisiä pointtereita ja nykyisin yleensä aika luonnollisesti 64-bittisiä.

Esim. omassa koneessa (Mac Pro) näyttää nyt olevan virtuaalimuistia allokoituna kaikkiaan 200 GB, mutta fyysistä muistia on kulunut vain 12 GB - ja muistia on 16 GB, niin levyllekään ei ole tarvinnut sivuttaa...

[code:14i811u4]Processes: 79 total, 5 running, 1 stuck, 73 sleeping, 485 threads 00:28:48
Load Avg: 3.39, 3.33, 2.98 CPU usage: 41.10% user, 17.68% sys, 41.21% idle
SharedLibs: 13M resident, 8936K data, 0B linkedit.
MemRegions: 362096 total, 5770M resident, 53M private, 1801M shared.
PhysMem: 1122M wired, 6733M active, 4945M inactive, 12G used, 3582M free.
VM: 200G vsize, 1127M framework vsize, 860364(0) pageins, 0(0) pageouts.
Networks: packets: 2025589/2206M in, 1629557/298M out.
Disks: 520716/9783M read, 1759387/67G written.
[/code:14i811u4]

zz

MaKo71
Seuraa 
Viestejä1479
Liittynyt15.11.2006
Neutroni
Saako sen jotenkin pois päältä?



Varmaksi en mene sanomaan, mutta sivujen lukitseminen muistiin saattaa auttaa. Niin, ja tietysti se, että viittaat jollain tavalla varaamaasi muistiin. Jos teet loopin, jolla käyt muistin läpi 4 kilon välein ja kirjoitat jotain kyseiseen osoitteeseen, niin koneen on pakko hakea fyysistä muistia osoitteiden taakse.

Neutroni
Ja älkää inttäkö, tämä on liimatukkademokoodaamista, jossa jokainen kellojakso on arvossaan. Miksei tuollaisessa kääntäjässä voisi olla moodi, jossa kaikki tosielämässä turhat hienoudet heivataan romukoppaan ja tehdään brutaalisti vain oleellinen nopeus optimoiden.



Olettaen, että kyseessä on tavallinen "lazy allocation", niin on vaikea sanoa, saako tuosta nopeuslisää, ja vaikka saisi, niin kuinka paljon. Joka tapauksessa muistia käyttäessä kone joutuu jossain vaiheessa hakemaan oikeaa fyysistä muistia osoitteiden taakse, ja se, tekeekö se sen heti vai vasta tarvittaessa ei välttämättä vaikuta kokonaissuoritusnopeuteen lainkaan. Siihen se toki vaikuttaa, että jos tuo varaaminen tehdään heti, niin ohjelma käynnistyy hitaammin, kun taas vasta tarvittaessa hakiessa tuo hidastus jakaantuu koko ohjelman suorituksen ajaksi.

Tuollainen laiska allokointi ei ole "tosielämän turha hienous", vaan vuosikymmenten aikana hyväksi havaittu tapa käyttää fyysistä RAM:ia tehokkaasti ohjelmien tarpeisiin, ainakin moniajojärjestelmissä.

Neutroni
Seuraa 
Viestejä30866
Liittynyt16.3.2005
MaKo71
Olettaen, että kyseessä on tavallinen "lazy allocation", niin on vaikea sanoa, saako tuosta nopeuslisää, ja vaikka saisi, niin kuinka paljon.



No olkoon sitten. On tämä uusi vehje kuitenkin taas hetken aikaa nopean oloinen.

Tuollainen laiska allokointi ei ole "tosielämän turha hienous", vaan vuosikymmenten aikana hyväksi havaittu tapa käyttää fyysistä RAM:ia tehokkaasti ohjelmien tarpeisiin, ainakin moniajojärjestelmissä.



Niin, tuollaisten järjestelmien vaatimukset ovat aivan toiset kuin yhden ohjelman suorituskyvyn maksimointi. Mutta kyllä minä kaipaisin välillä Windowsiin mahdollisuutta ottaa kone täysin haltuun niin kuin Amigassa aikanaan.

Simplex
Seuraa 
Viestejä3033
Liittynyt26.1.2010

Vaihda Linuxiin Kone pysyy nopeana ja voit virittää ja optimoida tarpeen mukaan, jos oletusasetukset eivät ole aivan mieleisiä. Linux - ja sinä määräät konettasi.

Volitans
Seuraa 
Viestejä10670
Liittynyt16.3.2005

Windowsin muisinhallinta on aina ollut enemmän tai vähemmän mysteeri - se yrittää käyttää muistia levycachenä jollain itselleni selviämättömällä tavalla. Omasta koneestani paukahti yksi muistikampa ja nyt on vaan 6 GB entisen 8 GB:n sijaan Win 7:ssa. Kone on nyt keskimäärin puolet hitaampi käytännössä. Kuitenkin nytkin on olevinaan 2 GB vapaata muistia - suorituskyky silti heikompi.

MaKo71
Seuraa 
Viestejä1479
Liittynyt15.11.2006
Volitans
Windowsin muisinhallinta on aina ollut enemmän tai vähemmän mysteeri - se yrittää käyttää muistia levycachenä jollain itselleni selviämättömällä tavalla. Omasta koneestani paukahti yksi muistikampa ja nyt on vaan 6 GB entisen 8 GB:n sijaan Win 7:ssa. Kone on nyt keskimäärin puolet hitaampi käytännössä. Kuitenkin nytkin on olevinaan 2 GB vapaata muistia - suorituskyky silti heikompi.



Periaatteessa käyttöjärjestelmän pitäisi aina pitää RAM niin täynnä kuin se vain pystyy. Käyttämätön RAM on koneen resurssien tuhlaamista. Windowsin muistinhallinnasta ei todellakaan ole tarjolla kauheasti tietoa, mutta olettaisin, että se toimii samoilla periaatteilla kuin Linuxissa, jossa "ylimääräinen" RAM toimii juuri mm. levypuskurina.

Vapaan muistin määräksi käyttöjärjestelmät usein ilmoittavat ne muistialueet, joita ei ole "korvamerkitty" millekään ohjelmalle, vaikka itse käyttäisivät sitä omiin tarkoituksiinsa.

subarctic
Seuraa 
Viestejä348
Liittynyt30.3.2013
Volitans
Windowsin muisinhallinta on aina ollut enemmän tai vähemmän mysteeri - se yrittää käyttää muistia levycachenä jollain itselleni selviämättömällä tavalla. Omasta koneestani paukahti yksi muistikampa ja nyt on vaan 6 GB entisen 8 GB:n sijaan Win 7:ssa. Kone on nyt keskimäärin puolet hitaampi käytännössä. Kuitenkin nytkin on olevinaan 2 GB vapaata muistia - suorituskyky silti heikompi.



Myös saattaa olla merkitystä sillä, että koneesi RAM-muisti saattaa nyt olla ns yksikanavaisessa moodissa, koska muistikampoja on nyt pariton määrä. Tämä hidastaa menoa. (Ei ole aprillia muuten vaikka oudolta kuulostaakin!)

Suomi uudelleen itsenäiseksi: https://www.kansalaisaloite.fi/fi/aloite/11

Neutroni
Seuraa 
Viestejä30866
Liittynyt16.3.2005
Simplex
Vaihda Linuxiin Kone pysyy nopeana ja voit virittää ja optimoida tarpeen mukaan, jos oletusasetukset eivät ole aivan mieleisiä. Linux - ja sinä määräät konettasi.



Olen kokeillut, mutta minulla on jonkin verran pelejä ja softaa Windowsille, joka ei ole korvattavissa ja paljon windowsin softilla tehtyjä dokumentteja. Joutuisin kuitenkin pitämään Wintoosaa muodossa tai toisessa mukana. Harkitsen uutta kokeilua Windowsin rinnalla, jos Adoben Lightroomin saa sille joskus. Ennen sitä haitat voittavat edut räikeästi.

MaKo71
Periaatteessa käyttöjärjestelmän pitäisi aina pitää RAM niin täynnä kuin se vain pystyy. Käyttämätön RAM on koneen resurssien tuhlaamista. Windowsin muistinhallinnasta ei todellakaan ole tarjolla kauheasti tietoa, mutta olettaisin, että se toimii samoilla periaatteilla kuin Linuxissa, jossa "ylimääräinen" RAM toimii juuri mm. levypuskurina.



Mihin ihmeeseen voidaan tarvita toista kymmentä gigaa levypuskuria? Varsinkin silloin, kun levyä ei käytetä kuin käyttiksen omiin kotkotuksiin. Levyäkään ei voi kovin kauaa puskuroida, ettei jonkin ongelman sattuessa jäisi tiedot kirjoittamatta.

MaKo71
Seuraa 
Viestejä1479
Liittynyt15.11.2006
Neutroni

MaKo71
Periaatteessa käyttöjärjestelmän pitäisi aina pitää RAM niin täynnä kuin se vain pystyy. Käyttämätön RAM on koneen resurssien tuhlaamista. Windowsin muistinhallinnasta ei todellakaan ole tarjolla kauheasti tietoa, mutta olettaisin, että se toimii samoilla periaatteilla kuin Linuxissa, jossa "ylimääräinen" RAM toimii juuri mm. levypuskurina.



Mihin ihmeeseen voidaan tarvita toista kymmentä gigaa levypuskuria? Varsinkin silloin, kun levyä ei käytetä kuin käyttiksen omiin kotkotuksiin.



No ei sitä RAM:ia käytetä levypuskurina enempää kuin on tarvis. Käytännössä kaikki tavara, mitä käyttöjärjestelmä lataa käynnistyksen jälkeen (kirjastot, exet, konfiguraatiotiedostot, jne) jäävät RAM:lle kököttämään kaiken varmuuden varalta, jos kukaan ei tarvitse RAM:ia. Kun sitten sovellukset alkavat sitä haukkaamaan, ladattu tavara vähitellen katoaa pois.

Neutroni

Levyäkään ei voi kovin kauaa puskuroida, ettei jonkin ongelman sattuessa jäisi tiedot kirjoittamatta.



Jos muistissa olevaa tiedostoa muokataan, niin tottahan se täytyy jossain vaiheessa kirjoittaa levylle talteen. Jos kyseessä on kuitenkin tiedosto, jota ei muokata (suurin osa tavarasta, kirjastot, exet ja sellaiset, joita muokataan vain harvoin), niin sitähän ei tarvitse kuin pitää RAM:lla valmiina, jos joku sattuisi tarvitsemaan.

Linuxissa on mekanismeja, jotka käyttävät prosessorin ja IO:n luppoaikaa muokattujen "likaisten" (dirty) sivujen kirjoittamiseen levylle, jotta sitten kuorman kasvaessa sivut voidaan vain hylätä muistista ilman muita toimenpiteitä. Tuossa on tietysti jonkin verran klappia, ja sitä varten Linuxissa nykyiset levyjärjestelmät ovat journaloivia, jottei mahdollinen sähkökatkos sekottaisi levyn kirjanpitoa. Toinen hyöty siitä on se, että kone käynnistyy tajuttoman nopeasti (verrattuna vanhoihin levyjärjestelmiin). Vaikka tässä Linuxista kerroin, niin uskon, että tilanne on melko lailla sama uusien Windowsien kanssa.

http://en.wikipedia.org/wiki/Journaling_file_system
http://www.westnet.com/~gsmith/content/ ... dflush.htm

Suosituimmat

Uusimmat

Uusimmat

Suosituimmat