# Fitxer mapejat a memòria

Un fitxer assignat a memòria és un segment de memòria virtual al qual se li ha assignat una correlació directa byte per byte amb alguna part d'un fitxer o recurs semblant a un fitxer. Aquest recurs sol ser un fitxer que està físicament present al disc, però també pot ser un dispositiu, un objecte de memòria compartida o un altre recurs al qual el sistema operatiu pot fer referència a través d'un descriptor de fitxer. Un cop present, aquesta correlació entre el fitxer i l'espai de memòria permet a les aplicacions tractar la part mapejada com si fos memòria primària.

## Història

Un primerenc (c. 1969) la implementació d'aquesta va ser la trucada al sistema PMAP al sistema operatiu TOPS -20 del DEC-20, una característica utilitzada pel sistema de base de dades System-1022 de Software House.
SunOS 4 va introduir mmap d'Unix, que permetia als programes "mapar fitxers a la memòria".
Dues dècades després del llançament del PMAP de TOPS-20, a Windows NT se li van donar fitxers de mapa de memòria creixent (GMMF).
Atès que la "funció CreateFileMapping requereix que se li passi una mida" i l'alteració de la mida d'un fitxer no s'adapta fàcilment, es va desenvolupar una API GMMF. L'ús de GMMF requereix declarar el màxim fins al qual la mida del fitxer pot créixer, però no es malgasta cap espai no utilitzat.

## Beneficis

L'avantatge de l'assignació de memòria d'un fitxer és augmentar el rendiment d'E/S, especialment quan s'utilitza en fitxers grans. Per als fitxers petits, els fitxers assignats a la memòria poden provocar una pèrdua d'espai lliure, ja que els mapes de memòria sempre estan alineats amb la mida de la pàgina, que és majoritàriament 4 KiB. Per tant, un fitxer de 5 KiB assignarà 8 KiB i, per tant, es malbaraten 3 KiB. L'accés als fitxers assignats a la memòria és més ràpid que utilitzar operacions directes de lectura i escriptura per dos motius. En primer lloc, una trucada al sistema és ordres de magnitud més lenta que un simple canvi a la memòria local d'un programa. En segon lloc, a la majoria de sistemes operatius, la regió de memòria assignada és la memòria cau de la pàgina del nucli (caché de fitxers), el que significa que no cal crear còpies a l'espai de l'usuari.

## Tipus

Hi ha dos tipus de fitxers assignats a la memòria:

### Persistent

Els fitxers persistents s'associen amb un fitxer font en un disc. Les dades es guarden al fitxer font del disc un cop finalitzat l'últim procés. Aquests fitxers assignats a memòria són adequats per treballar amb fitxers font extremadament grans.

### No persistent

Els fitxers no persistents no estan associats amb un fitxer en un disc. Quan l'últim procés ha acabat de treballar amb el fitxer, les dades es perden. Aquests fitxers són adequats per crear memòria compartida per a comunicacions entre processos (IPC).

## Inconvenients

El motiu principal per triar l'E/S de fitxers assignats a la memòria és el rendiment. No obstant això, hi pot haver intercanvis. L'enfocament estàndard d'E/S és costós a causa de la sobrecàrrega de la trucada del sistema i la còpia de memòria. L'enfocament de mapeig de memòria té el seu cost en errors de pàgina menors, quan un bloc de dades es carrega a la memòria cau de la pàgina, però encara no s'ha assignat a l'espai de memòria virtual del procés. En algunes circumstàncies, l'E/S dels fitxers assignats a la memòria pot ser substancialment més lenta que les E/S de fitxers estàndard.

## Referències

* ↑ Chris Siebenmann. «The history of Unix's confusing set of low-level ways to allocate memory» (en anglès), 07-06-2018.
* ↑ «TOPS-20 Monitor Calls Reference Manual» (en anglès).
* ↑ «System 1022 Database System» (en anglès).
* ↑ Chris Siebenmann. «The history of Unix's confusing set of low-level ways to allocate memory» (en anglès), 07-06-2018.
* ↑ «Using mmap for Advanced File I/O - BrainDump» (en anglès). Arxivat de l'original el 7 agost 2011. [Consulta: 21 maig 2011].
* ↑ «Memory-Mapped Files» (en anglès). Microsoft Developer Network. [Consulta: 4 gener 2016].
* ↑ «Memory-Mapped Files» (en anglès). Microsoft Developer Network. [Consulta: 4 gener 2016].