Mapování souboru do paměti

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í.

Výhody metody

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ů:

  1. Je potřeba si neustále pamatovat aktuální polohu souboru a posouvat jej v čase do pozice, odkud se bude provádět čtení nebo kam půjde záznam.
  2. Každé volání změny / čtení aktuální pozice, zápis / čtení je systémové volání, které vede ke ztrátě času.
  3. Chcete-li projít čtením / zápisem, musíte ještě alokovat vyrovnávací paměti určité velikosti, takže obecně se práce skládá ze tří fází: čtení do vyrovnávací paměti -> úprava dat ve vyrovnávací paměti -> zápis do souboru. Při zobrazování se práce skládá pouze z jedné fáze: úpravy dat v určité oblasti paměti.

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.

Nevýhody

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.

Aplikace

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.

Platformy, které podporují soubory mapované v 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] .

Příklady

Python

import mmap import os filename = "/tmp/1.txt" File = open ( filename , "r+b" ) size = os . cesta . getize ( název souboru ) data = mmap . mmap ( Soubor . fileno (), velikost ) tisková data [ 0 : 5 ] # vytiskne prvních 5 znaků souboru tiskových dat . read ( size ) # vytiskne celý obsah souboru string = "Ahoj z Pythonu!!!" údaje . resize ( size + len ( string )) # zvětšit "zobrazenou velikost" o velikost řetězce, do kterého se chceme vejít data . seek ( velikost ) # Nastavte kurzor na konec dat souboru . napište ( string ) # a připojte řetězec na konec datového souboru . zavřít () Soubor . close () ## Zavřete soubor

Odkazy

  1. Poptávkové stránkování  (downlink)
  2. Soubory mapované v paměti archivovány 9. února 2007.
  3. Apple – Mac OS X Leopard – Technologie – UNIX Archivováno 23. dubna 2009.
  4. Funkce CreateFileMapping (Windows) . Získáno 29. dubna 2010. Archivováno z originálu 10. října 2008.