Mapování souborů do paměti
Mapování souborů do paměti je v informatice označení pro alternativní práci se soubory, kdy je jejich obsah promítnut jádrem systému do operační paměti. Některé operace se souborem mohou být efektivnější, protože je využívána existující podpora virtuální paměti a mechanismus výpadku stránky a tím je možné vynechat několikanásobné kopírování dat v paměti počítače.
Popis
Mapování souborů do paměti nahrazuje klasické rozhraní pro práci se soubory (tj. API) v podobě funkcí open, read, write, close a dalších, které pracují se souborovým deskriptorem). Při mapování souborů do paměti nastaví jádro operačního systému mapování virtuální paměti tak, že obsah souboru je možné číst z operační paměti běžnými strojovými instrukcemi pro práci s pamětí. Namapování souboru do paměti je provedeno patřičnou úpravou tabulky stránek, za kterou je v jádře zodpovědný modul správy paměti.
Díky použití stránkování paměti a jeho (typicky vysoce optimalizovaného) mechanismu obsluhy výpadku stránky může mapování souborů do paměti poskytnout v mnoha případech vyšší výkon, než při použití klasického rozhraní.[1] Navíc je tím eliminováno kopírování dat v paměti mezi vyrovnávací pamětí v jádře (kernel space), diskovou cache a paměťovým prostorem procesu (tzv. user space). Více viz privilegovaný režim.
V unixových systémech, kde je téměř vše soubor, je možné mapovat do paměti všechna vstupně/výstupní zařízení, se kterými je možné pracovat pomocí souborového deskriptoru.
Srovnání
Výhody
Hlavní výhodou mapování souborů do paměti je zvýšení I/O výkonu, zejména pokud je použito na velké soubory. Přístup k mapovaným souborům je rychlejší než za pomoci klasických systémových volání čtení a zápisu ze dvou důvodů:
- klasické systémové volání je řádově pomalejší než jednoduchá změna tabulky stránek
- není nutné kopírovat data mezi vyrovnávací pamětí v jádře, diskovou cache a uživatelským prostorem procesu
- ve většině operačních systémů je oblast se soubory mapovanými do paměti zároveň i cache pro disk
- několik změn v souboru může být sdruženo do jedné aktualizace celé 4 KiB stránky
- data souboru jsou do paměti načtena až v okamžiku, kdy jsou čtena (pomocí mechanismu výpadku stránky)[2]
- snadné sdílení souboru mezi více procesy (namapovaný soubor je sdílená paměť)
Nevýhody
Mapování malých souborů může vést k plýtvání místem, protože paměťové mapy jsou vždy uspořádány podle velikosti stránky, která je většinou 4 KiB.[3] U souboru o velikosti 5 KiB by byly přiděleny dvě stránky, takže by bylo zabráno 8 KiB paměti a z nich by byly 3 KiB nevyužity.
Některé počítačové platformy mají s mapováním souborů do paměti problémy z důvodu omezeného paměťového prostoru, což se týká zejména 32bitového režimu procesorů pro počítače IBM PC kompatibilní, které adresují maximálně 4 GiB RAM (v 32bitových systémech řady Windows NT je paměťový prostor procesů standardně omezen na 2 GiB, v 32bitovém jádře Linuxu závisí na konkrétní situaci). Z tohoto důvodu je vždy do paměti namapována jen část souboru, což významným způsobem ztěžuje práci programátorům.
Podpora různých platforem
Většina moderních OS nebo běhových prostředí podporuje nějakou formu mapování souborů do paměti. Funkce mmap()
mapuje zadaný soubor do paměti a vytváří POSIX deskriptor.[4] Volání je podporováno na POSIX kompatibilních systémech (UNIX, Linux, Mac OS X,[5] nebo OpenVMS).
Operační systém Microsoft Windows poskytuje ve svém API funkci CreateFileMapping()
.[6] Mapování souborů do paměti poskytuje až Microsoft .NET verze 4, pro předchozí verze jsou k dispozici knihovny třetích stran.[7]
Programovací jazyk Java poskytuje třídy a metody pro přístup k souborům mapovaným do paměti jako je FileChannel.
Programovací jazyk D podporuje soubory mapované do paměti ve standardní knihovně (std.mmfile modul).[8]
Python obsahuje od verze 1.6 standardní knihovny modul mmap
.[9] Detaily použití modulu se liší podle toho, zda je používán na platformě Microsoft Windows nebo Unix.
V Perlu je dostupných několik modulů pro mapování souborů do paměti z CPANu, jako například Sys::Mmap
.[10] a File::Map
.[11]
Reference
- "Co mohou mapované soubory nabídnout?".[nedostupný zdroj]
- "Stránkování". www.linux-tutorial.info [online]. [cit. 2011-06-23]. Dostupné v archivu pořízeném z originálu dne 2016-03-06.
- Using mmap() for Advanced File I/O | devshed. www.devshed.com [online]. [cit. 2011-06-23]. Dostupné v archivu pořízeném dne 2011-08-07.
- Memory Mapped Files. www.ecst.csuchico.edu [online]. [cit. 2011-06-23]. Dostupné v archivu pořízeném dne 2009-10-07.
- Apple – Mac OS X Leopard – Technology – UNIX. www.apple.com [online]. [cit. 2011-06-23]. Dostupné v archivu pořízeném dne 2008-07-26.
- CreateFileMapping Function (Windows)
- DotNet. winterdom.com [online]. [cit. 2011-06-23]. Dostupné v archivu pořízeném dne 2010-04-19.
- std.mmfile – D Programming Language – Digital Mars
- "New Modules in 1.6" [online]. [cit. 2008-12-23]. Dostupné v archivu pořízeném dne 2006-12-30. (anglicky)
- Sys::Mmap Perl Module [online]. Dostupné online. (anglicky)
- File::Map Perl Module [online]. Dostupné online. (anglicky)
V tomto článku byl použit překlad textu z článku Memory-mapped file na anglické Wikipedii.