V sobotu 2. listopadu proběhla mohutná oslava naší plnoletosti !!
Multimediaexpo.cz je již 18 let na českém internetu !!
V tiskové zprávě k 18. narozeninám brzy najdete nové a zásadní informace.

Mapování souborů do paměti

Z Multimediaexpo.cz

Mapování souborů do paměti je v informatice označení pro alternativní přístup k datům v souboru, ke kterým je přistupováno tak, jako by soubor byl součástí paměti (místo používání klasického API s funkcemi open, read, write, close a dalších, které pracují se souborovým deskriptorem). Mapování souborů do paměti využívá v jádře již existující mechanismus virtuální paměti za využití stránkování paměti a mechanismu výpadku stránky.

Obsah

Popis

Mapování souborů do paměti využívá přidružení (korelaci) virtuální paměti se souborem, který je uložen na pevném disku. 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. Čtení a zápis do souboru se pak děje klasickými strojovými instrukcemi pro čtení a zápis do paměti. O kopírování obsahu souboru do paměti se stará mechanismus výpadku stránky, který je v jádře vysoce optimalizován, a tak je zejména opakované čtení částí namapovaného souboru vysoce efektivní.

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. Mapování malých souborů může vést k plýtvání místem,[1] protože paměťové mapy jsou vždy uspořádány podle velikosti stránky, která je většinou 4 KiB. Proto by bylo souboru o velikosti 5 KiB přiděleno 8 KiB, tím pádem by byly 3 KiB nevyužity. 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ů:

  1. systémové volání je řádově pomalejší než jednoduchá změna tabulky stránek
  2. ve většině operačních systémů je oblast se soubory mapovanými do paměti zároveň i cache pro disk, takže do uživatelského prostoru nemusí být nic kopírováno

Některé mapované soubory provádí operace lépe než jejich fyzické protějšky. Aplikace mohou přistupovat k souboru a aktualizovat jeho data přímo a na místě, místo toho aby hledaly od začátku souboru nebo jej celý přepisovaly na dočasné umístění. Jelikož je mapování souborů řešeno interně ve stránkách, lineární přístup k souboru (jako je například vidět u „flat file“ při ukládání dat nebo u konfiguračních souborů) vyžaduje přístup k disku pouze tehdy, když je překročena hranice nové stránky a může zapisovat větší části souborů na disk v jediné operaci. Jednou z možných výhod mapování souborů je „líné načítání“, tedy použití malé paměti RAM i pro velmi velký soubor. Načítáním celého obsahu souboru, výrazně většího než je velikost dostupné paměti, může dojít k vážnému zahlcení: tzn. že operační systém načte stánky z disku do paměti a zároveň stránky z paměti načte zpátky na disk. Mapování souborů může nejen zcela obejít stránkování paměti, ale systém potřebuje pouze načíst menší části stránek roztříděných do sekcí jako upravená data, podobně jako Stránkování paměti používané v programech. Proces mapování souborů do paměti je ovládán správcem virtuální paměti, což je stejný subsystém který je odpovědný za komunikaci se stránkováním paměti. Mapované soubory jsou do paměti načteny najednou a vcelku z jediné stránky. Velikost stránky je vybrána podle operačního systému pro maximální výkon. Vzhledem k tomu, že stránka pro správu souborů je jedním z nejdůležitějších prvků virtuální paměti systému, je načítání stránky velkých částí souboru do fyzické paměti obvykle vysoce optimalizovanou funkcí systému.[2]

Nevýhody

Hlavní výhodou mapování I/O souborů do paměti je výkon, ale existuje i pár vyjímek. Standardní I/O přístup je náročný vzhledem k režii systémových volání a paměti kopírování. Přístup k paměťovému mapování má své nedostatky v podobě drobných chyb stránek – mohou nastat když je blok dat načten v cache stánky, ale ještě není mapován do prostoru virtuální paměti. V některých případech může být mapování I/O souborů do paměti podstatně pomalejší než standardní I/O soubor který není mapován.[3] Další nevýhoda paměťového mapování souvisí s danou architekturou adresního prostoru: soubor větší než je adresní prostor může obsahovat pouze části mapované najednou. Například 32bitová architektura jako je IA-32 od Intelu může přímo adresovat pouze 4 GiB nebo menší soubory. Této nevýhodě se dá předejít použitím IOMMU.

Použití

Snad nejčastěji se mapování souborů do paměti používá ve většině moderních operačních systémů (včetně Microsoft Windows a Unixových systémů) k zavádění programů. Po spuštění procesu používá operační systém mapované soubory k přenášení spustitelných souborů společně s načítanými moduly do paměti za účelem zpracování nebo spuštění. Většina systémů s paměťovým mapováním používá techniku zvanou požadavek stránkování, kde je soubor načten do fyzické paměti v podmnožinách a jen v případě že je na stránku odkazováno.[4] V konkrétním případě spustitelných souborů umožňuje OS selektivně načíst jen ty části které potřebuje proces spustit. Paměťově mapované soubory se dále používají ke sdílení paměti mezi více procesy. Chráněný režim v moderních operačních systémech zpravidla nedovoluje procesům přístup k paměťovému prostoru který je přidělen jinému procesu (programový přístup způsobí neplatnost stránky nebo porušení segmentace). Je zde celá řada dostupných technik umožňující bezpečné sdílení paměti a paměťové mapování I/O souborů je jedním z nejoblíbenějších. Dvě nebo více aplikací může současně mapovat jeden fyzický soubor do paměti a přistupovat do této paměti. Například operační systém Microsoft Windows poskytuje aplikacím mechanismus k paměťovému mapování společných částí systémových stránkovacích souborů a sdílení dat.

Podpora různých platforem

Většina moderních OS nebo běhových prostředí podporuje některé formy přístupu k mapovaným souborům. Funkce mmap(),[5] která mapováním souboru vytváří deskriptor daného souboru, který obsahuje umístění v souboru, délku, která je součástí POSIX specifikace i kompatibilitu s POSIX systémy (například UNIX, Linux, Mac OS X,[6] nebo OpenVMS) které podporují společný mechanismus pro paměťově mapované soubory. Operační systém Microsoft Windows podporuje pro tento účel skupinu API funkcí, jako je CreateFileMapping().[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] Od verze 1.6 je v Pythonu součástí standardní knihovny modul mmap.[9] Podrobnosti modulu se liší podle toho zda je na platformě Windows nebo Unix. V Perlu je několik modulů dostupných pro soubory mapované do paměti pro CPAN jako například Sys::Mmap [10] a File::Map.[11] Microsoft .NET poskytuje řízený přístup k paměťově mapovaným souborům ve verzi 4. Pro předchozí verze jsou k dispozici knihovny třetích stran.[12]

Reference

  1. http://www.devshed.com/c/a/BrainDump/Using-mmap-for-Advanced-File-IO/
  2. http://msdn2.microsoft.com/en-us/library/ms810613.aspx, "Co mohou mapované soubory nabídnout?".
  3. http://lists.freebsd.org/pipermail/freebsd-questions/2004-June/050371.html, čtení versus mmap (nebo I/O versus chyby stránek) by Matthew Dillon
  4. http://www.linux-tutorial.info/modules.php?name=Tutorial&pageid=89, "Stránkování"
  5. Memory Mapped Files
  6. Apple - Mac OS X Leopard - Technology - UNIX
  7. CreateFileMapping Function (Windows)
  8. http://www.digitalmars.com/d/2.0/phobos/std_mmfile.html
  9. . Dostupné online.  
  10. . Dostupné online.  
  11. . Dostupné online.  
  12. DotNet