Fájl leképezése a memóriába

A fájl memóriába (memóriába)  való hozzárendelése bizonyos operációs rendszerekben a fájlokkal való munkavégzés módja, amelyben a teljes fájl vagy annak egy folyamatos része egy bizonyos memóriaterülethez (RAM-címek egy tartományához) van hozzárendelve. . Ebben az esetben az adatok olvasása ezekről a címekről valójában a leképezett fájlból való adatok kiolvasásához vezet, az adatok ezekre a címekre történő írása pedig ezeknek az adatoknak a fájlba írásához. Gyakran nemcsak a közönséges fájlokat, hanem az eszközfájlokat is hozzárendelheti a memóriához.

A módszer előnyei

A leképezés alternatívája a fájl közvetlen olvasása vagy írása a fájlba. Ez a munkamódszer kevésbé kényelmes a következő okok miatt:

  1. Folyamatosan emlékezni kell a fájl aktuális pozíciójára, és időben mozgatni kell arra a helyre, ahonnan az olvasás végrehajtásra kerül, vagy ahová a rögzítés megy.
  2. Minden hívás az aktuális pozíció megváltoztatására / olvasására, írására / olvasására rendszerhívás, amely időveszteséghez vezet.
  3. Az olvasási/írási munkához még mindig le kell foglalni egy bizonyos méretű puffert, így a munka általában három szakaszból áll: beolvasás a pufferbe -> a pufferben lévő adatok módosítása -> írás a fájlba. Megjelenítéskor a munka csak egy szakaszból áll: egy bizonyos memóriaterületen lévő adatok módosításából.

A leképezés használatának további előnye, hogy az olvasáshoz/íráshoz képest kisebb az operációs rendszer terhelése – tény, hogy leképezések használatakor az operációs rendszer nem tölti be egyszerre a teljes fájlt a memóriába, hanem igény szerint, blokkolja egy oldal memória méretét (általában 4 kilobájt). Így még kis mennyiségű fizikai memóriával (például 32 megabájt) is könnyedén megjeleníthet egy 100 megabájtos vagy nagyobb fájlt anélkül, hogy sok többletköltséget okozna a rendszernek. A nyereség akkor is jelentkezik, amikor a memóriából a lemezre ír: ha nagy mennyiségű adatot frissített a memóriában, akkor azokat egyszerre (egy lépéssel a lemezen) írhatja a lemezre.

A memórialeképezett fájl abból a szempontból is kényelmes, hogy könnyen változtathatja a méretét, és ezzel egyidejűleg (újraleképezés után) egy folyamatos, kívánt méretű memóriadarabot kaphat. A dinamikus memóriával egy ilyen trükk nem mindig lehetséges a töredezettség jelensége miatt. Amikor memória-leképezett fájllal dolgozunk, a memóriakezelő automatikusan úgy konfigurálja a processzort, hogy a fájl szomszédos töredékeit tároló RAM-oldalak folyamatos címtartományt alkossanak.

Hátrányok

A leképezés használatának fő oka a teljesítménynövekedés. Azonban tisztában kell lennie azokkal a kompromisszumokkal, amelyeket meg kell kötni. A normál I/O tele van plusz rendszerhívásokkal és szükségtelen adatok másolásával, a leképezések használata pedig az oldalelérési hibák miatti lassulásokkal. Tegyük fel, hogy a kívánt fájlhoz kapcsolódó oldal már a gyorsítótárban van, de nincs társítva ehhez a megjelenítéshez. Ha egy másik folyamat módosította, akkor a leképezéshez való társítási kísérlet meghiúsulhat, és az adatok újraolvasását a lemezről vagy lemezre kell mentenie. Így bár a program kevesebb műveletet hajt végre a térképen keresztüli eléréshez, a valóságban az adatok írása a fájl bizonyos helyére tovább tarthat, mint a fájl I / O műveletei (bár átlagosan a térképek használata erősítést ad).

További hátrány, hogy a kijelző mérete a használt architektúrától függ. Elméletileg a 32 bites architektúrák (Intel 386, ARM 9) nem hozhatnak létre 4 GB-nál nagyobb leképezéseket.

Alkalmazás

A fájl-memória leképezés talán legelterjedtebb alkalmazása egy folyamat memóriába való betöltése (ez igaz a Microsoft Windows és Unix -szerű rendszerekre is). A folyamat elindítása után az operációs rendszer leképezi a fájlját a végrehajtható memóriába (a végrehajtható attribútum). A legtöbb fájlleképezést használó rendszer a page-on-demand technikát használja , amelyben a fájl nem teljes egészében, hanem kis részletekben, egy oldalnyi memória méretében kerül a memóriába, miközben az oldal csak akkor töltődik be, amikor valóban szükség van rá. [1] . A végrehajtható fájlok esetében ez a technika lehetővé teszi, hogy az operációs rendszer a gépi kódnak csak azokat a részeit tartsa a memóriában, amelyekre a program végrehajtásához ténylegesen szükség van.

A leképezések másik gyakori felhasználási esete több folyamat által megosztott memóriadarabok létrehozása. A modern operációs rendszerekben ( védett módot használva ) egy folyamat általában nem teszi lehetővé, hogy más folyamatok hozzáférjenek "memóriájához". Azok a programok, amelyek a saját memóriájuktól eltérő memóriát próbálnak elérni, érvénytelen oldalhibákat vagy szegmentálássértési kivételeket dobnak ki .

A memórialeképezett fájlok használata az egyik legnépszerűbb és legbiztonságosabb (kivételek nélkül) módja annak, hogy a memóriát több folyamat számára elérhetővé tegyük. Két vagy több alkalmazás egyidejűleg leképezheti ugyanazt a fizikai fájlt a memóriájába, és hozzáférhet ahhoz a memóriához.

Memória-leképezett fájlokat támogató platformok

A legtöbb modern operációs rendszer vagy shell támogatja a memória-leképezett fájlkezelés valamilyen formáját. Például a POSIX specifikáció része az mmap () [2] függvény , amely egy adott deszkriptorral rendelkező fájlhoz egy leképezést hoz létre, a fájl bizonyos helyétől kezdve és bizonyos hosszúsággal . Így számos POSIX -kompatibilis rendszer, mint például a UNIX , a Linux , a FreeBSD , a Mac OS X [3] vagy az OpenVMS támogatja a közös fájlleképezési mechanizmust. A Microsoft Windows egy speciális API -t is támogat erre a célra, például a CreateFileMapping() [4] .

Példák

Python

import mmap import os fájlnév = "/tmp/1.txt" Fájl = open ( fájlnév , "r+b" ) size = os . útvonalat . getsize ( fájlnév ) data = mmap . mmap ( Fájl . fileno ( ), méret ) adatok nyomtatása [ 0 : 5 ] # a fájl első 5 karakterét nyomtatja ki . read ( size ) # kiírja a fájl teljes tartalmát string = "Üdv a Pythonból!!!" adatok . resize ( méret + len ( string )) # növelje a "megjelenített méretet" annak a karakterláncnak a méretével, amelyhez az adatokhoz illeszkedni szeretnénk . seek ( méret ) # Állítsa a kurzort a fájl adatok végére . írd ( karakterlánc ) # és fűzd hozzá a karakterláncot az adatfájl végéhez . bezárja () Fájl . bezár () ## Zárja be a fájlt

Linkek

  1. Igény szerinti lapozás  (lefelé irányuló kapcsolat)
  2. Memórialeképezett fájlok archiválva : 2007. február 9.
  3. Apple – Mac OS X Leopard – Technológia – UNIX Archiválva : 2009. április 23.
  4. CreateFileMapping Function (Windows) . Letöltve: 2010. április 29. Az eredetiből archiválva : 2008. október 10..