Sdílení paměti pomocí mapování souborů (1. díl) - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



Delphi

Sdílení paměti pomocí mapování souborů (1. díl)

sdileni pameti

19. července 2002, 00.00 | V novém seriálu si ukážeme, jak sdílet ve Windows paměť mezi procesy pomocí mapování souborů. Dnes začneme vysvětlením, o co vlastě jde, proč je to potřeba a jaké jsou jiné alternativy.

Úvod

Dnes začnu trochu ze široka. Ve 32-bitových verzích Windows (a ve většině ostatních multitaskingových operačních systémů, jako je třeba Linux) mají jednotlivé běžící procesy oddělený paměťový prostor. To znamená, že pro jeden proces nemůže jinému "koukat přes rameno" do jeho paměti. Tento přístup má spoustu výhod (bezpečnost, stabilita), ale jednu podstatnou nevýhodu - ztěžuje totiž komunikaci mezi procesy.

Proč? Představte si, že chcete nějakému cizímu programu říct, aby zpracoval nějaká vaše data v paměti svou procedurou. Dejme tomu, že data jsou poměrně velká (řádově stovky kilobajtů až megabajty). Kdyby jste je chtěli zpracovat nějakou procedurou ve "svém" procesu, stačí předat ukazatel na jejich začátek a délku... ale ouha, přesně tohle mezi procesy nejde. Ukazatel z jednoho procesu neplatí v jiném procesu - ukazuje totiž do úplně jiného (samostatného) adresového prostoru.

Jak tedy situaci řešit? Uveďme si výčet několika možností, které by programátora mohly napadnout:

  • Zprávy Windows. Jsou vhodné jen pro přenášení krátkých dat řádově do desítek bajtů. Každopádně se dají ale dobře použít jako signalizace, že programu posíláme data jiným způsobem.
  • Uložení dat do souboru. Neefektivní, protože by se muselo přistupovat k disku. Můžete sice oprávněně namítnout, že systém má přeci diskovou cache, která by měla data na tu chvíli "podržet", ale její efektivita není také nejlepší a navíc Windows kvůli vašim datům budou muset možná její předchozí obsah (pokud v ní nějaký je) zapsat na disk - takže k I/O operacím stejně velmi pravděpodobně dojde.
  • Použití síťových socketů (TCP/IP). Tohle řešení je vcelku přijatelné. Prostě z jednoho programu uděláte server, který poslouchá na nějakém portu a druhý program mu může zaslat požadavky i se všemi daty. Pokud vám toto téma není blízké, tak si vše shematicky představte jako webový server a prohlížeč, který mu zasílá data (HTTP požadavky, čili žádané adresy stránek), na které server odpovídá (zasílá webové stránky, případně jiné dokumenty). Nevýhodou je trochu komplikovanější naprogramování (i když v Delphi to ještě jde :-), výhodou zas že oba programy nemusí být na stejném počítači. Efektivita je vcelku vysoká; pro náš případ, kdy jsou oba programy na jednom počítači, je to však střílení kanónem na vrabce.

Jak jste asi pochopili, žádnou z technik v předchozím výčtu nepoužijeme, máme totiž k dispozici možnost čtvrtou:

Mapování souborů (file mapping)

Tato technika spočívá v přidružení obsahu souboru k nějaké oblasti paměti. Jak to chápat? Trochu zjednodušeně (odborníci prominou) tak , že máte soubor v paměti a použijete na něj API funkce file mappingu, pak mu bude přiřazena určitá část paměti (bude na ni namapován). V podstatě obdržíte ukazatel na začátek jeho dat. Když cokoliv v namapované paměti změníte, změní se to i v souboru samotném.

Interně je vše uděláno pomocí systémové souborové cache, ale o to tu nejde. Podstatnou věcí je, že více aplikací si takhle může najednou namapovat jeden soubor. Mají k dispozici každá svůj kus namapované pamětí, kterou když změní, změní se i v ostatních aplikacích (protože je synchronizována s jedním otevřeným souborem). Už vám svítá? Stačí aby všechny aplikace, které chtějí komunikovat, namapovaly najednou jeden a ten samý soubor a komunikaci mezi procesy máme funkční.

Vývojáři Microsoftu šli ještě dál a umožnili mapovat i neexistující soubory (které tedy existují jen jako namapovaná paměť, nikoliv fyzicky na disku). To je přesně to, co hledáme a využijeme.

Ukázková aplikace

Využití celého API okolo file mappingu si ukážeme na jednoduché aplikaci (přesněji dvou aplikacích) - klonu okna textového editoru. Požijeme osvědčené schéma klient-server. Napíšeme jednoduchý textový editor (založený na komponentě TMemo), který bude zpřístupňovat napsaný text. Ten bude, jak jste už jistě uhodli, hrát roli serveru.. Klienti budou jednoduché aplikace (opět založené na komponentě TMemo), které budou tento text zobrazovat. Vše uděláme tak, aby se při jakékoliv změně v textu editoru tato změna zobrazila i v klientech, kterých bude možné spouštět teoreticky neomezené množství.

Tvorbu aplikace začneme v příštím dílu serverovou částí a v dalších dílech postupně zkompletujeme i klienta.

Obsah seriálu (více o seriálu):

Tématické zařazení:

 » Rubriky  » Delphi  

 » Rubriky  » Windows  

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: