Mapování souboru do paměti (do paměti) je způsob práce se soubory v některých operačních systémech, ve kterém je celému souboru nebo nějaké jeho souvislé části přiřazena určitá oblast paměti (rozsah adres RAM) . V tomto případě čtení dat z těchto adres ve skutečnosti vede ke čtení dat z mapovaného souboru a zápis dat na tyto adresy vede k zápisu těchto dat do souboru. Do paměti můžete často mapovat nejen běžné soubory, ale i soubory zařízení.
Alternativou k mapování je přímé čtení souboru nebo zápis do souboru. Tento způsob práce je méně pohodlný z následujících důvodů:
Další výhodou použití mapování je nižší zátěž operačního systému oproti čtení/zápisu – faktem je, že při použití mapování operační systém nenačte celý soubor do paměti najednou, ale udělá to podle potřeby, v blokuje velikost stránky paměti (obvykle 4 kilobajty). I s malým množstvím fyzické paměti (například 32 megabajtů) tedy můžete snadno zobrazit soubor o velikosti 100 megabajtů nebo více, aniž by to systému způsobilo velké zatížení. K zisku dochází také při zápisu z paměti na disk: pokud jste aktualizovali velké množství dat v paměti, mohou být současně (v jednom průchodu hlavou přes disk) zapsána na disk.
Paměťově mapovaný soubor je výhodný i v tom, že můžete snadno měnit jeho velikost a zároveň (po přemapování) máte k dispozici souvislý kus paměti požadované velikosti. U dynamické paměti není takový trik vždy možný kvůli fenoménu fragmentace. Když pracujeme se souborem mapovaným do paměti, správce paměti automaticky nakonfiguruje procesor tak, aby stránky RAM, které ukládají sousední fragmenty souboru, tvořily souvislý rozsah adres.
Hlavním důvodem použití mapování je zvýšení výkonu. Musíte si však být vědomi kompromisů, které bude nutné udělat. Normální I/O je zatížen režií dodatečných systémových volání a zbytečného kopírování dat, použití mapování je zatíženo zpomalením kvůli chybám v přístupu ke stránce. Řekněme, že stránka související s požadovaným souborem je již v mezipaměti, ale není spojena s tímto zobrazením. Pokud byla změněna jiným procesem, pak může pokus o její přiřazení k mapování selhat a vést k nutnosti znovu načíst data z disku nebo uložit data na disk. I když tedy program provádí méně operací pro přístup přes mapu, ve skutečnosti může operace zápisu dat na nějaké místo v souboru trvat déle než použití souborových I/O operací (ačkoli v průměru použití map přináší zisk).
Další nevýhodou je, že velikost displeje závisí na použité architektuře. Teoreticky 32bitové architektury (Intel 386, ARM 9) nemohou vytvářet mapování větší než 4 GB.
Snad nejběžnějším použitím mapování souborů do paměti je načítání procesu do paměti (to platí pro systémy Microsoft Windows i systémy podobné Unixu ). Po spuštění procesu operační systém namapuje svůj soubor do paměti, kterou je povoleno spustit (atribut executable). Většina systémů, které používají mapování souborů, používá techniku page-on-demand , při které se soubor načte do paměti ne celý, ale po malých částech o velikosti stránky paměti, zatímco stránka se načte pouze tehdy, když je skutečně potřeba. [1] . V případě spustitelných souborů tato technika umožňuje operačnímu systému uchovat v paměti pouze ty části strojového kódu, které jsou skutečně potřebné ke spuštění programu.
Dalším běžným případem použití mapování je vytváření bloků paměti sdílených více procesy. V moderních operačních systémech (používajících chráněný režim ) proces obecně neumožňuje jiným procesům přistupovat ke „své“ paměti. Programy, které se pokoušejí o přístup k jiné paměti, než je jejich vlastní , vyvolávají neplatné chyby stránky nebo výjimky narušení segmentace .
Použití souborů mapovaných v paměti je jedním z nejoblíbenějších a nejbezpečnějších (bez vyvolání výjimek) způsobů, jak zpřístupnit paměť více procesům. Dvě nebo více aplikací mohou současně mapovat stejný fyzický soubor do své paměti a přistupovat k této paměti.
Většina moderních operačních systémů nebo shellů podporuje nějakou formu manipulace se soubory mapovanými v paměti. Například funkce mmap () [2] , která vytváří mapování pro soubor s daným deskriptorem, počínaje na nějakém místě v souboru as určitou délkou, je součástí specifikace POSIX . Velké množství systémů kompatibilních s POSIX , jako je UNIX , Linux , FreeBSD , Mac OS X [3] nebo OpenVMS , tedy podporuje společný mechanismus mapování souborů. Microsoft Windows také podporuje specifické API pro tento účel, jako je CreateFileMapping() [4] .