Maparea unui fișier pe memorie

Maparea unui fișier la memorie (la memorie)  este o modalitate de a lucra cu fișiere în unele sisteme de operare, în care întregului fișier sau o parte continuă a acestuia îi este atribuită o anumită zonă de memorie (o serie de adrese RAM) . În acest caz, citirea datelor de la aceste adrese duce de fapt la citirea datelor din fișierul mapat, iar scrierea datelor la aceste adrese duce la scrierea acestor date în fișier. Adesea, puteți mapa în memorie nu numai fișierele obișnuite, ci și fișierele dispozitivului.

Avantajele metodei

O alternativă la mapare este să citiți direct fișierul sau să scrieți în fișier. Acest mod de lucru este mai puțin convenabil din următoarele motive:

  1. Este necesar să vă amintiți în mod constant poziția curentă a fișierului și să o mutați în timp în poziția de unde va fi efectuată citirea sau unde va merge înregistrarea.
  2. Fiecare apel de schimbare/citire a poziției curente, scriere/citire este un apel de sistem care duce la o pierdere de timp.
  3. Pentru a lucra prin citire/scriere, mai trebuie să alocați buffere de o anumită dimensiune, așa că, în general, munca constă din trei etape: citirea în buffer -> modificarea datelor din buffer -> scrierea în fișier. La afișare, lucrarea constă dintr-o singură etapă: modificarea datelor dintr-o anumită zonă de memorie.

Un avantaj suplimentar al utilizării unei mapări este încărcarea mai mică a sistemului de operare în comparație cu citirea/scrierea - faptul este că atunci când se utilizează mapări, sistemul de operare nu încarcă întregul fișier în memorie deodată, ci o face după cum este necesar, în blochează dimensiunea unei pagini de memorie (de obicei 4 kiloocteți). Astfel, chiar și cu o cantitate mică de memorie fizică (de exemplu, 32 de megaocteți), puteți afișa cu ușurință un fișier de 100 de megaocteți sau mai mult, fără a cauza multă supraîncărcare sistemului. De asemenea, câștigul apare atunci când scrieți de pe memorie pe disc: dacă ați actualizat o cantitate mare de date în memorie, acestea pot fi scrise simultan (într-o singură trecere a capului peste disc) pe disc.

Un fișier mapat cu memorie este, de asemenea, convenabil prin faptul că îi puteți modifica cu ușurință dimensiunea și în același timp (după remapare) puteți pune la dispoziție o bucată continuă de memorie de dimensiunea dorită. Cu memoria dinamică, un astfel de truc nu este întotdeauna posibil din cauza fenomenului de fragmentare. Când lucrăm cu un fișier mapat cu memorie, managerul de memorie configurează automat procesorul astfel încât paginile RAM care stochează fragmente adiacente ale fișierului să formeze o gamă continuă de adrese.

Dezavantaje

Motivul principal pentru a utiliza maparea este câștigul de performanță. Cu toate acestea, trebuie să fii conștient de compromisurile care vor trebui făcute. I/O obișnuit este plină de suprasolicitarea apelurilor suplimentare de sistem și copierea inutilă a datelor, utilizarea mapărilor este plină de încetiniri din cauza erorilor de acces la pagină. Să presupunem că pagina legată de fișierul dorit este deja în cache, dar nu este asociată cu acest afișaj. Dacă a fost modificat printr-un alt proces, atunci o încercare de a-l asocia cu maparea poate eșua și poate duce la necesitatea recitirii datelor de pe disc sau salvarea datelor pe disc. Astfel, deși programul face mai puține operațiuni pentru a accesa prin hartă, în realitate, operațiunea de scriere a datelor într-un loc din fișier poate dura mai mult decât utilizarea operațiunilor I/O de fișier (deși, în medie, folosirea hărților dă un câștig).

Un alt dezavantaj este că dimensiunea afișajului depinde de arhitectura utilizată. Teoretic, arhitecturile pe 32 de biți (Intel 386, ARM 9) nu pot crea mapări mai mari de 4 GB.

Aplicație

Poate cea mai comună utilizare a mapării fișier-la-memorie este încărcarea unui proces în memorie (acest lucru este valabil atât pentru sistemele Microsoft Windows , cât și pentru Unix ). După ce un proces este pornit, sistemul de operare mapează fișierul său la memoria care poate fi executată (atributul executabil). Majoritatea sistemelor care folosesc maparea fișierelor folosesc tehnica page-on-demand , în care fișierul este încărcat în memorie nu în întregime, ci în părți mici, de dimensiunea unei pagini de memorie, în timp ce pagina este încărcată doar atunci când este cu adevărat necesar. [1] . În cazul fișierelor executabile, această tehnică permite sistemului de operare să păstreze în memorie doar acele părți din codul mașinii care sunt efectiv necesare pentru a executa programul.

Un alt caz de utilizare obișnuit pentru mapări este crearea unor bucăți de memorie partajată de mai multe procese. În sistemele de operare moderne (folosind modul protejat ), un proces nu permite, în general, altor procese să acceseze memoria „sa”. Programele care încearcă să acceseze o altă memorie decât propria lor generează erori de pagină nevalide sau excepții de încălcare a segmentării .

Folosirea fișierelor mapate în memorie este una dintre cele mai populare și sigure (fără a face excepții) modalități de a face memoria disponibilă pentru mai multe procese. Două sau mai multe aplicații pot mapa simultan același fișier fizic în memoria lor și pot accesa acea memorie.

Platforme care acceptă fișiere mapate în memorie

Cele mai multe sisteme de operare sau shell-uri moderne acceptă o anumită formă de manipulare a fișierelor mapate în memorie. De exemplu, funcția mmap () [2] , care creează o mapare pentru un fișier cu un descriptor dat, începând de la o anumită locație din fișier și cu o anumită lungime, face parte din specificația POSIX . Astfel, un număr mare de sisteme compatibile cu POSIX , precum UNIX , Linux , FreeBSD , Mac OS X [3] sau OpenVMS , suportă un mecanism comun de mapare a fișierelor. Microsoft Windows acceptă, de asemenea, un API specific în acest scop, cum ar fi CreateFileMapping() [4] .

Exemple

Python

import mmap import os nume fișier = "/tmp/1.txt" Fișier = deschis ( nume fișier , "r+b" ) dimensiune = os . cale . getsize ( nume fișier ) data = mmap . mmap ( Fișier . fileno (), dimensiune ) print data [ 0 : 5 ] # tipărește primele 5 caractere ale fișierului de date de tipărire . read ( size ) # tipărește întregul conținut al fișierului string = "Bună ziua de la Python!!!" date . resize ( dimensiune + len ( șir )) # măriți „dimensiunea afișată” cu dimensiunea șirului în care vrem să se potrivească datelor . seek ( size ) # Setați cursorul la sfârșitul fișierului de date . scrieți ( șir ) # și adăugați șirul la sfârșitul fișierului de date . close () File . close () ## Închideți fișierul

Link -uri

  1. Pagină la cerere  (link descendent)
  2. Memory Mapped Files Arhivat 9 februarie 2007.
  3. Apple - Mac OS X Leopard - Tehnologie - UNIX Arhivat 23 aprilie 2009.
  4. Funcția CreateFileMapping (Windows) . Consultat la 29 aprilie 2010. Arhivat din original pe 10 octombrie 2008.