Soubor mapovaný do paměti - Memory-mapped file

Soubor mapovaný do paměti je segment virtuální paměti , kterému byla přiřazena přímá korelace bajtů za bajty s určitou částí souboru nebo prostředkem podobným souboru. Tento prostředek je obvykle soubor, který je fyzicky přítomen na disku, ale může to být také zařízení, objekt sdílené paměti nebo jiný prostředek, na který může operační systém odkazovat prostřednictvím deskriptoru souboru . Jakmile je tato korelace mezi souborem a paměťovým prostorem k dispozici, umožňuje aplikacím zacházet s mapovanou částí, jako by šlo o primární paměť.

Dějiny

TOPS-20 PMAP

Časný ( c.  1969 implementace) tohoto byl PMAP systémové volání na DEC-20 ‚s TOPS-20 operační systém, funkce použitý softwarový dům v databázovém systému System-1022 .

SunOS 4 mmap

SunOS 4 představil Unix ‚s mmap , což je dovoleno programy‚mapovat soubory do paměti.‘

Soubory mapovatelné v paměti Windows (GMMF)

Dvě desetiletí po vydání PMAP TOPS-20 dostal Windows NT Growable Memory-Mapped Files (GMMF).

Protože „ CreateFileMapping funkce vyžaduje, aby jí byla předána velikost“ a změna velikosti souboru není snadno přizpůsobena, bylo vyvinuto API GMMF. Použití GMMF vyžaduje deklaraci maxima, na které může velikost souboru narůst, ale nevyužito je nevyužité místo.

Výhody

Výhodou mapování paměti souboru je zvýšení výkonu I / O, zejména při použití u velkých souborů. U malých souborů mohou soubory mapované do paměti způsobit ztrátu volného místa, protože mapy paměti jsou vždy zarovnány podle velikosti stránky, což je většinou 4 KiB. Proto soubor 5 KiB přidělí 8 KiB, a tedy 3 KiB jsou zbytečné. Přístup k souborům namapovaným do paměti je rychlejší než použití operací přímého čtení a zápisu ze dvou důvodů. Zaprvé je systémové volání řádově pomalejší než jednoduchá změna lokální paměti programu. Za druhé, ve většině operačních systémů je region mapované do paměti ve skutečnosti je , že jádro je stránka Cache (Vyrovnávací paměť), což znamená, že žádné kopie musí být vytvořena v uživatelském prostoru.

Některé operace se soubory mapovanými na paměti na úrovni aplikace také fungují lépe než jejich fyzické protějšky. Aplikace mohou přistupovat a aktualizovat data v souboru přímo a na místě, na rozdíl od hledání od začátku souboru nebo přepsání celého upraveného obsahu do dočasného umístění. Vzhledem k tomu, že se soubor mapovaný v paměti zpracovává interně na stránkách, vyžaduje lineární přístup k souborům (jak je vidět například v datových úložištích nebo konfiguračních souborech plochých souborů) přístup na disk pouze v případě, že je překročena nová hranice stránky, a může psát větší části soubor na disk v jedné operaci.

Možnou výhodou souborů mapovaných do paměti je „líné načítání“, tedy využití malého množství paměti RAM i pro velmi velký soubor. Pokus o načtení celého obsahu souboru, který je podstatně větší než množství dostupné paměti, může způsobit vážné mlácení, protože operační systém čte z disku do paměti a současně zapisuje stránky z paměti zpět na disk. Mapování paměti může nejen zcela obejít soubor stránky, ale také umožňuje načítání menších sekcí o velikosti stránky při úpravách dat, podobně jako u stránkování vyžadovaného pro programy.

Proces mapování paměti zpracovává správce virtuální paměti , což je stejný subsystém odpovědný za práci se souborem stránky . Soubory mapované do paměti se načítají do paměti po jedné celé stránce najednou. Velikost stránky je vybrána operačním systémem pro maximální výkon. Vzhledem k tomu, že správa souborů stránek je jedním z nejdůležitějších prvků systému virtuální paměti, je načítání částí souboru o velikosti stránky do fyzické paměti obvykle velmi vysoce optimalizovanou funkcí systému.

Typy

Existují dva typy souborů mapovaných do paměti:

Trvalý

Trvalé soubory jsou přidruženy ke zdrojovému souboru na disku. Po dokončení posledního procesu se data uloží do zdrojového souboru na disku. Tyto soubory mapované do paměti jsou vhodné pro práci s extrémně velkými zdrojovými soubory.

Nepřetrvávající

Netrvalé soubory nejsou spojeny se souborem na disku. Když poslední proces dokončí práci se souborem, dojde ke ztrátě dat. Tyto soubory jsou vhodné pro vytváření sdílené paměti pro meziprocesovou komunikaci (IPC).

Nevýhody

Hlavním důvodem pro výběr I / O souboru mapovaného do paměti je výkon. Přesto mohou existovat kompromisy. Standardní přístup I / O je nákladný kvůli režii systémových volání a kopírování paměti. Přístup mapovaný v paměti má své náklady v menších chybách stránky - když je do mezipaměti stránek načten blok dat , ale ještě není mapován do prostoru virtuální paměti procesu. Za určitých okolností může být I / O souboru mapovaného do paměti podstatně pomalejší než standardní I / O souboru.

Další nevýhoda souborů mapovaných do paměti se týká adresního prostoru dané architektury : soubor větší než adresovatelný prostor může mít současně mapovány pouze části, což zkomplikuje jeho čtení. Například 32bitová architektura, jako je Intel IA-32, může přímo adresovat pouze 4 GiB nebo menší části souborů. Ještě menší množství adresovatelného prostoru je k dispozici jednotlivým programům - obvykle v rozmezí 2 až 3 GiB, v závislosti na jádře operačního systému. Tato nevýhoda je však na moderní 64bitové architektuře prakticky vyloučena .

mmap má také tendenci být méně škálovatelné než standardní prostředky pro vstupně-výstupní operace se soubory, protože mnoho operačních systémů, včetně Linuxu, má omezený počet chyb zpracovávajících jádra. Extrémně rychlá zařízení, jako jsou moderní disky NVM Express SSD, jsou schopna učinit režii skutečným problémem.

Chyby I / O základního souboru (např. Odpojitelná vyměnitelná jednotka nebo vysunutí optického média, plný disk při zápisu atd.) Při přístupu k jeho mapované paměti jsou hlášeny do aplikace jako signály SIGSEGV / SIGBUS na POSIXu a EXECUTE_IN_PAGE_ERROR strukturovaná výjimka pro Windows. Veškerý kód pro přístup k namapované paměti musí být připraven na zpracování těchto chyb, ke kterým při přístupu k paměti obvykle nedochází.

Pouze hardwarové architektury s MMU mohou podporovat soubory mapované do paměti. Na architekturách bez MMU může operační systém zkopírovat celý soubor do paměti, když je podán požadavek na jeho mapování, ale je to extrémně nehospodárné a pomalé, pokud bude přístup jen k malému množství souboru, a může fungovat pouze pro soubory který se vejde do dostupné paměti.

Běžné použití

Snad nejběžnějším použitím souboru mapovaného do paměti je zavaděč procesů ve většině moderních operačních systémů (včetně systémů Microsoft Windows a Unix ). Když je proces spuštěn, operační systém použije soubor namapovaný na paměť k získání spustitelného souboru , spolu s libovolnými načtitelnými moduly, do paměti k provedení. Většina systémů pro mapování paměti používá techniku ​​zvanou stránkování poptávky , kdy je soubor načten do fyzické paměti v podmnožinách (každá po jedné stránce), a to pouze v případě, že je na tuto stránku skutečně odkazováno. V konkrétním případě spustitelných souborů to OS umožňuje selektivně načíst pouze ty části obrazu procesu, které je skutečně potřeba provést.

Dalším běžným používáním souborů mapovaných do paměti je sdílení paměti mezi více procesy. V moderních operačních systémech s chráněným režimem nemají procesy obecně povolen přístup k paměťovému prostoru, který je přidělen pro použití jiným procesem. (Pokus programu o to způsobí neplatné chyby na stránce nebo narušení segmentace .) K bezpečnému sdílení paměti je k dispozici řada technik a I / O souboru mapovaného do paměti je jedním z nejpopulárnějších. Dvě nebo více aplikací může současně mapovat jeden fyzický soubor do paměti a přistupovat k této paměti. Například operační systém Microsoft Windows poskytuje aplikacím mechanismus pro mapování paměti sdíleného segmentu samotného souboru stránky systému a sdílení dat prostřednictvím této sekce.

Podpora platformy

Většina moderních operačních systémů nebo běhových prostředí podporuje určitou formu přístupu k souborům mapovaným v paměti. Funkce mmap () , která vytváří mapování souboru s daným deskriptorem souboru, počátečním umístěním v souboru a délkou, je součástí specifikace POSIX , takže široká škála systémů kompatibilních s POSIX, jako je UNIX , Linux Mac OS X nebo OpenVMS podporují běžný mechanismus pro soubory mapování paměti. Operační systémy Microsoft Windows pro tento účel také podporují skupinu funkcí API , například CreateFileMapping () .

Některé bezplatné přenosné implementace souborů mapovaných do paměti pro platformy kompatibilní s Microsoft Windows a POSIX jsou:

Java programovací jazyk poskytuje třídy a metody pro přístup do paměti mapované soubory, například FileChannel .

D programovací jazyk podporuje paměťové soubory mapované do své standardní knihovny (std.mmfile modulu).

Ruby má klenot (knihovnu) s názvem Mmap, který implementuje soubory mapované do paměti.

Od verze 1.6 zahrnoval Python modul mmap do své standardní knihovny. Podrobnosti o modulu se liší podle toho, zda je hostitelská platforma podobná systému Windows nebo Unix .

Pro Perl je k dispozici několik modulů pro soubory mapování paměti na CPAN , například Sys :: Mmap a File :: Map .

V prostředí Microsoft .NET runtime lze P / Invoke použít k použití souborů mapovaných do paměti přímo prostřednictvím rozhraní Windows API . Ve verzi 4 modulu runtime byl zaveden spravovaný přístup (P / Invoke není nutný) k souborům mapovaným do paměti (viz Soubory mapované do paměti ). U předchozích verzí existují knihovny třetích stran, které poskytují spravovaná rozhraní API.

PHP podporovalo techniky mapování paměti v řadě nativních funkcí přístupu k souborům, jako je file_get_contents (), ale toto odstranilo v 5.3 (viz protokol revizí ).

Pro programovací jazyk R existuje knihovna CRAN s názvem bigmemory, která používá knihovnu Boost a poskytuje paměťově mapovaná zálohovaná pole přímo v R. Balíček ff nabízí paměťově mapované vektory, matice, pole a datové rámce.

Programovací jazyk J podporuje paměťové soubory mapované protože přinejmenším 2005. To zahrnuje podporu pro krabici dat pole a jednotlivé datový typ souborů. Podporu lze načíst z „data / jmf“ Databázové moduly Jdb a JD společnosti J používají soubory paměti mapované pro úložiště sloupců.

Reference