Ha betölt egy programot, a Windowsnak a futtatáshoz be kell másolnia a futtatható fájlt a memóriába. Ha bezárja az alkalmazást, a program továbbra is létezik a RAM-ban. Ha újra futtatja a programot, a Windowsnak nem kell betöltenie semmit a lemezről – minden a RAM-ban fog ülni.
A felhasznált RAM a merevlemez gyorsítótárává válik. Mivel a lemez hat nagyságrenddel lassabb, mint a RAM, azt szeretné, ha a programok és adatfájlok minél nagyobb része a RAM-ban ülne. A fel nem használt RAM-od gyorsítótárrá válik. Ez a készenléti memória. Olyan memória, amelyet azonnal oda kell adni bármely alkalmazásnak, amelynek szüksége van rá, de ehelyett készenlétben áll arra az esetre, ha szükség lenne a tartalmára:
- https://i.imgur.com/NQwFGoB.png
A számítógépemen tehát jelenleg 8 GB memória van, amely nem csinál semmit, csak a merevlemez gyorsítótáraként szolgál.
Most, ha egy programnak szüksége van egy kis RAM-ra, a Windows ad neki egy kis memóriát. De mielőtt átadná a memóriát egy programnak, először biztosan ki kell nulláznia a memóriát.
Reader Quiz: Miért kell a Windowsnak lenulláznia a RAM-ot, mielőtt átadná egy másik folyamatnak?
A Windows fenntart némi memóriát, amelyet lustán lenullázott, és készen áll arra, hogy egy pillanat alatt átadja egy alkalmazásnak. Az Erőforrás-kezelőben ezt a nullázásra kész memóriát *Free memóriának nevezik; a fenti képernyőképen látható.
Ezt a memóriát nullázási laplistának is nevezik, mert a memória nullázva van, és semmi hasznosat nem csinál a számítógépen:
- https://i.imgur.com/47xDkzT.png
Mi a SuperFetch?
A SuperFetch a memóriakezelővel együttműködve proaktívan és lustán tölt be adatokat a szabad memóriába, hogy azok már a gyorsítótárban legyenek, amikor futtatni akarod őket. A SuperFetch tudja, hogy milyen alkalmazásokat, játékokat, fejlesztőeszközöket szoktál betölteni, és lustán előretölti őket a RAM-ba arra az esetre, ha szükség lenne rájuk.
Szóval amikor 3 perc múlva megyek betölteni a WoW-ot, az a 8 GB játéktextúra már a RAM-ban lesz. Használhatsz egy olyan eszközt, mint a RAMMap, hogy megnézd, milyen fájlokat tárol jelenleg a számítógéped összes RAM-ja.
Aki azt mondja, hogy tiltsd le a SuperFetch-et, az egy idióta, nem ért a számítógépekhez, és arra kényszeríti a Windowst, hogy lassabb legyen, mert nem érti a különbséget:
- Standby free memory
- Zerod free memory
És annak a személynek egy pofon kell a tarkójára, mert szándékosan lassítja a számítógépét.
Az alkalmazások használják a memóriát; nem a RAM-ot
A másik dolog, amit a legtöbb ember nem ért, az az elkötelezett és a munkakészlet közötti különbség. Ezt könnyebb volt megérteni annak idején, amikor a Windows 95 4 MB memóriában futott.
- Egy 16 MB RAM-mal rendelkező szörnygépen
- lehet olyan programom, amely 1,5 GB memóriát kötött le
- de csak 117 KB RAM-ot használ
Ez azért van, mert minden, ami a program működéséhez szükséges, teljes egészében elfér 117 KB-ban. A többi vagy a swap-fájlba íródott, vagy már egy fájl másolata volt (pl. egy 1,5 GB-os adatfájlt leképezhetek a címtartományomba, és 1,5 GB memóriát kötöttem le, miközben nem fogyaszt RAM-ot)
A Windows Vista/7 oldalsávjának egyik szerkentyűje például memóriaszivárgást mutatott… Ez azt jelentette, hogy a Sidebar.exe folyamat folyamatosan memóriát kötött le (egy 32 bites folyamat esetében a 2 GB-os határértékig), amíg a folyamat le nem zuhant, mert elfogyott a memória. De a Sidebar.exe csak kb. 700 KB RAM-ot fogyasztott, mert az összes kiszivárgott memóriát kiírta a swapfájlba (mert senki sem használta semmire).
Ez az oka annak, hogy miért nem kapcsolja ki a swapfájlt. A Window képes oldalakat másolni a RAM-ból a merevlemezre. Ha a RAM-lapokat ténylegesen nem használják, akkor másra (pl. a lemez gyorsítótárára) át lehet őket használni, mert az adatok biztonsági másolata a swapfájlban van. Ha a sidebar valaha is újra kérné ezt a memóriát (ami soha nem történne meg, mert elfelejtette), a Windows vissza tudja cserélni a RAM tartalmát a merevlemezről.
tl;dr: nekem 8.5 GB szabad memória:
- 8 GB valami hasznosat csinál, hogy a gépem gyorsabb legyen
- 0,5 GB kárba vész azzal, hogy nem csinál semmit
A SuperFetch-et akarod, hogy használja a memóriát – gyorsabbá teszi a gépet. Ne kapcsold ki.
Ezek az emberek olyanok, mint az apám. Azt hiszi, hogy épp eleget tud ahhoz, hogy veszélyes legyen. Felhívott és panaszkodott, hogy a Windows 7-es gépének 3 percig tart a bootolás. Mondtam neki:
- az összes vírusirtó szar miatt, amit futtat
- vegyen egy SSD-t, az 13 másodperc alatt bootol
Vesz egy SSD-t, és a Windows még mindig 3 percig tart a bootolás. Mondom neki, hogy a vírusirtó szarságai miatt van. Kézből elutasítja a véleményemet. Hat hónappal később újra telepíti a Windowst frissen, és most 13 másodperc alatt indul.
A SuperFetch letiltása olyan, mint a swapfile letiltása, vagy egy RAM-dubler telepítése, vagy egy registry cleaner használata: idiótának tűnsz tőle. Személyesen mosolygok és bólogatok. A hátad mögött szarságokat beszélek rólad a redditen.
Bónusz olvasmány
Még többet a témáról korábban:
- /r/ProgrammerHumor/comments/68ker6/ultimate_in_garbage_collection/dh071ep/
- /r/technológia/comments/1xbofp/ramdrive_to_improve_performance_and_prolong_ssd/cf9wbmf/
- /r/programozás/kommentek/4nvimz/john_carmack_on_memory_mapped_gpu_assets/d4818ep/
Update – SuperFetch merevlemez I/O nem árthat a játékomnak?
Valaki megkérdezte, én válaszoltam, de a láthatóság és az információ terjesztésének elősegítése érdekében bemásolom ide.
Azért komolyan, befolyásolhatja a játékteljesítményt?
Elég egyszerűen nem fogja.
A legnagyobb aggodalmad talán az, hogy a SuperFetch felforgatja a merevlemezt, és beolvas dolgokat, miközben próbálsz játszani a játékoddal. És ez a sok merevlemezes I/O károsítja a “valódi” merevlemezes dolgokat, amelyekre szükséged van a játékodhoz.
Nem fog.
Nézd meg az Erőforrásfigyelőt, a Lemez lapot. A Windows 7 hozzáadott egy olyan funkciót, amellyel az alkalmazások jelezhetik, hogy “háttérben” prioritással akarnak I/O műveleteket végezni.
- Egy SSD-nek 1-2 ms körüli a válaszideje
- Egy forgólemezes HDD-nek 10-20 ms körüli a válaszideje
És így az Erőforrásfigyelőben láthatja, hogy mennyi ideig tart a merevlemez I/O kiszolgálása. És a pörgős HDD-ken általában 10-30 ms:
- https://i.imgur.com/m4ogUc5.png
De amíg ez történik, addig más merevlemezes I/O műveletek is futnak Háttér prioritással. A Windows gondoskodik arról, hogy a Háttér I/O műveletek soha ne zavarják a rendszeres I/O műveleteket. A Background I/O olyannyira büntethető, hogy egy háttérben történő olvasás kiszolgálása 500-1000 ms-ig is eltarthat:
- https://i.imgur.com/3SATs9M.png
Szóval van:
ReadResponse timeSSD1 msHDD10 msBackground Priority I/O500 ms
Kár, hogy több fejlesztő nem ismeri a Background I/O Priority-t, rád nézek:
- Steam downloader
- uTorrent
- Battle.net updater
- Windows Update(!!)
Mert ez tényleg segít.