Comprensione della memoria di memoria
La velocità con cui le istruzioni di applicazione vengono elaborate su un sistema è proporzionata al numero di operazioni di accesso necessarie per ottenere dati al di fuori del programma - memoria indirizzabile.
Il sistema fornisce due metodi per ridurre la sovrapposizione transazionale associata a queste operazioni di lettura e scrittura esterne. È possibile associare i dati dei file all'indirizzo di processo. È inoltre possibile associare i processi alle regioni di memoria anonima che possono essere condivise dai processi cooperanti.
I file mappati della memoria forniscono un meccanismo per un processo di accesso ai file incorporando direttamente i dati dei file nello spazio di indirizzamento del processo. L'utilizzo dei file mappati può ridurre in modo significativo il movimento dei dati I/O poiché i dati del file non devono essere copiati in buffer di dati di processo, come avviene dalle subroutine read e write . Quando più di un processo le mappe lo stesso file, i suoi contenuti vengono condivisi tra di essi, fornendo un meccanismo a basso costo attraverso il quale i processi possono sincronizzare e comunicare.
Le regioni di memoria mappate, chiamate anche aree di memoria condivise, possono fungere da grande pool per lo scambio di dati tra i processi. Le subroutine disponibili non forniscono blocchi o controllo accessi tra i processi. Pertanto, i processi che utilizzano le aree di memoria condivise devono impostare un metodo di controllo del segnale o del semaforo per impedire conflitti di accesso e per mantenere un processo dal cambiamento dei dati che un altro sta utilizzando. Le aree di memoria condivise possono essere più vantaggiose quando la quantità di dati da scambiare tra i processi è troppo grande per trasferire con i messaggi o quando molti processi mantengono un comune database di grandi dimensioni.
Il sistema fornisce due metodi per la mappatura dei file e delle regioni di memoria anonima. Le seguenti sottoroutine, note collettivamente come i servizi shmat , sono tipicamente utilizzate per creare e utilizzare segmenti di memoria condivisi da un programma:
| Sottoroutine | Definizione |
|---|---|
| shmctl | Controlla le operazioni di memoria condivise |
| shmget | Ottiene o crea un segmento di memoria condivisa |
| shmat | Allega un segmento di memoria condivisa da un processo. Non consente di associare i dispositivi di blocco. |
| shmdt | Scollega un segmento di memoria condivisa da un processo |
| proteggere | Modifica le protezioni di accesso di un intervallo di indirizzi specificato all'interno di un segmento di memoria condivisa. |
| disclascopo | Rimuove una mappatura da un intervallo di indirizzi specificato all'interno di un segmento di memoria condivisa |
La sottoroutine ftok fornisce la chiave che la sottoroutine shmget utilizza per creare il segmento condiviso
La seconda serie di servizi, collettivamente noti come servizi mmap , è solitamente utilizzata per i file di mappatura, sebbene possa essere utilizzata anche per la creazione di segmenti di memoria condivisi.
Tutte le operazioni valide sulla memoria risultante da mmap () di un file sono valide sulla memoria risultante da mmap () di un dispositivo di blocco. Un dispositivo di blocco è un file speciale che fornisce l'accesso ad un driver di dispositivo che presenta un'interfaccia di blocco. Un'interfaccia di blocco a un driver di dispositivo richiede l'accesso dei dati in blocchi di dimensioni fisse. L'interfaccia è tipicamente utilizzata per i dispositivi di archiviazione dei dati.
I servizi di mmap includono le seguenti sottoroutine:
| Sottoroutine | Definizione |
|---|---|
| madvise | Consiglia il sistema di un comportamento di paging previsto da un processo |
| mincore | Determina residenza delle pagine di memoria |
| mmap | Assota un file oggetto nella memoria virtuale. Consente di mappare i dispositivi di blocco un processo alla volta. |
| proteggere | Modifica le protezioni di accesso della mappatura della memoria |
| msync | Sincronizza un file mappato con il relativo dispositivo di archiviazione sottostante |
| Munmap | Scollega una regione di memoria mappata |
Il msem_init, msem_lock, msem_unlock, msem_remove, mleep, e le subroutine mwakeup forniscono il controllo degli accessi per i processi mappati utilizzando i servizi mmap .
Fare riferimento alle seguenti sezioni per saperne di più sulla mappatura della memoria:
Confronto mmap con shmat
Come per i servizi shmat, la parte dello spazio di indirizzo di processo disponibile per la mappatura dei file con i servizi mmap dipende dal fatto che un processo sia un processo di 32 - bit o un processo del 64 - bit. Per 32 - bit processi, la parte di spazio di indirizzo disponibile per la mappatura è costituita da indirizzi nella gamma di0x30000000-0xCFFFFFFF, per un totale di 2.5G byte di spazio di indirizzo. La parte di spazio di indirizzo disponibile per i file di mappatura è costituita da indirizzi nel variegato0x30000000-0xCFFFFFFFe0xE0000000-0xEFFFFFFFper un totale di 2.75G byte di spazio di indirizzo. In AIX® 5.2 e successivi, un processo a 32 bit eseguito con il modello di spazio degli indirizzi molto grande ha a disposizione l'intervallo 0x30000000-0xFFFFFFFF per le mappature, con un totale di 3.25GB di spazio degli indirizzi.
Tutti gli intervalli disponibili all'interno dello spazio di indirizzo del processo 32 - bit sono disponibili sia per le mappature a posizione fissa che per le mappature di posizione variabile. Le mappature di posizione fissa si verificano quando le applicazioni specificano che una mappatura venga collocata in una posizione fissa all'interno dello spazio di indirizzo. Le mappature di posizione variabile si verificano quando le applicazioni specificano che il sistema deve decidere la posizione in cui inserire una mappatura.
Per 64 - bit processi, sono disponibili due serie di indirizzi con lo spazio di indirizzo del processo per le mappature mmap o shmat . Il primo, costituito dalla singola gamma0x07000000_00000000-0x07FFFFFF_FFFFFFFF, è disponibile sia per le mappature a posizione fissa che per quelle a posizione variabile. La seconda serie di intervalli di indirizzi è disponibile solo per le mappature a posizione fissa e consiste nelle gamme0x30000000-0xCFFFFFFF,0xE0000000-0xEFFFFFFFe ad0x10_00000000-0x06FFFFFF_FFFFFFFF. L'ultima gamma di questo set, composto da0x10_00000000-0x06FFFFFF_FFFFFFFF, è reso disponibile anche per il caricatore di sistema per tenere il testo del programma, i dati e l'heap, quindi solo le parti inutilizzate della gamma sono disponibili per le mappature di posizione fissa.
Sia i servizi mmap che shmat forniscono la funzionalità per più processi per mappare la stessa regione di un oggetto tale da condividere la indirizzabilità a quell' oggetto. Tuttavia, la sottoroutine mmap estende questa funzionalità oltre quella fornita dalla subroutine shmat permettendo di stabilire un numero relativamente illimitato di tali mappature. Mentre questa capacità aumenta il numero di mappature supportate per oggetto file o di memoria, può rivelarsi inefficiente per le applicazioni in cui molti processi mappano gli stessi dati del file nel loro spazio di indirizzo.
La sottoroutine mmap fornisce un indirizzo oggetto univoco per ogni processo che si associa ad un oggetto. Il software lo compie fornendo ogni processo con un indirizzo virtuale unico, noto come alias. La sottoroutine shmat consente ai processi di condividere gli indirizzi degli oggetti mappati.
Poiché solo uno degli alias esistenti per una determinata pagina in un oggetto ha una traduzione di indirizzo reale in qualsiasi momento, solo una delle mappature mmap può fare riferimento a quella pagina senza incorrere in un errore di pagina. Qualsiasi riferimento alla pagina tramite una diversa mappatura (e quindi un alias diverso) determina un errore di pagina che provoca l'invalidazione della traduzione in indirizzo reale esistente per la pagina. Di conseguenza, deve essere stabilita una nuova traduzione per esso sotto un alias diverso. I processi condividono le pagine spostandole tra queste diverse traduzioni.
Per le applicazioni in cui molti processi mappano gli stessi dati di file nel loro spazio di indirizzo, questo processo di toggling potrebbe avere un impatto negativo sulle prestazioni. In questi casi, la sottoroutine shmat può fornire funzionalità di mappatura dei file più efficienti.
Utilizzare i servizi shmat nelle seguenti circostanze:
- Per l'applicazione 32 - bit, undici o meno file vengono mappati contemporaneamente e ciascuno è più piccolo di 256MB.
- Quando si mappano file di dimensioni superiori a 256MB.
- Quando si mappano le regioni di memoria condivise che devono essere condivise tra i processi non correlati (nessun rapporto parent-child).
- Quando si mappano interi file.
Utilizzare mmap nelle seguenti circostanze:
- La portabilità dell'applicazione è una preoccupazione.
- Molti file vengono mappati contemporaneamente.
- Solo una parte di un file deve essere mappata.
- La protezione a livello di pagina deve essere impostata sulla mappatura.
- La mappatura privata è obbligatoria.
Una funzionalità "estesa shmat" è disponibile per 32 - bit applicazioni con i relativi spazi di indirizzo limitati. Se si definisce la variabile di ambiente EXTSHM=ON, allora i processi in esecuzione in tale ambiente possono creare e allegare più di undici segmenti di memoria condivisi. Il processo può allegare questi segmenti nello spazio di indirizzo per le dimensioni del segmento. Un altro segmento può essere collegato alla fine del primo nella stessa regione di byte 256M . L'indirizzo al quale un processo può allegare è a limiti di pagina, ovvero un multiplo di SHMLBA_EXTSHM byte.
Alcune limitazioni esistono sull'utilizzo della funzione estesa shmat . Queste regioni di memoria condivise non possono essere utilizzate come buffer I/O in cui l'unpinning del buffer si verifica in un gestore di interruzione. Le limitazioni all'utilizzo dei buffer I/O shmat estesi sono le stesse di quella dei buffer mmap .
La variabile di ambiente fornisce la possibilità di eseguire un'applicazione con la funzionalità aggiuntiva di allegare più di 11 segmenti quando EXTSHM=ONo l'accesso ad alte prestazioni a 11 o meno segmenti quando la variabile di ambiente non è impostata. Ancora, la funzionalità "estesa shmat" si applica solo a 32 - bit processi.
Considerazioni di compatibilità mmap
I servizi di mmap sono specificati da vari standard e comunemente utilizzati come interfaccia di mappatura dei file a scelta in altre implementazioni del sistema operativo. Tuttavia, l'implementazione del sistema della sottoroutine mmap potrebbe differire da altre implementazioni. La sottoroutine mmap incorpora le seguenti modifiche:
- La mappatura nell'area privata di processo non è supportata.
- Le mappature non sono implicitamente non mappate. Un'operazione mmap che specifica MAP_FIXED non mancherà se una mappatura già esiste all'interno dell'intervallo specificato.
- Per le mappature private, la semantica di scrittura di copia fa una copia di una pagina sul primo riferimento di scrittura.
- La mappatura della memoria I/O o del dispositivo non è supportata.
- La mappatura dei dispositivi di carattere o l'utilizzo di una regione mmap come buffer per un'operazione di lettura - scrittura ad un dispositivo di carattere non è supportata.
- La sottoroutine madvise viene fornita solo per la compatibilità. Il sistema non prende alcuna azione sui consigli specificati.
- La sottoroutine mprotect consente alla regione specificata di contenere pagine non mappate. In funzionamento, le pagine non mappate sono semplicemente saltate sopra.
- Le opzioni OSF/AES - specifiche per la mappatura esatta predefinita e per le bandiere MAP_EREDITIT, MAP_HASSEMAPHOREe MAP_UNALIGNED non sono supportate.
Utilizzo delle subroutine del semaforo
Il msem_init, msem_lock, msem_unlock, msem_remove, Le subroutine mleep e mwakeup sono conformi alla specifica OSF Application Environment. Forniscono un'alternativa alle interfacce IPC come le sottoroutine semget e semop . I vantaggi dell'utilizzo dei semafori includono un metodo di serializzazione efficiente e il sovraccarico ridotto di non dover effettuare una chiamata di sistema nei casi in cui non vi sia contenzioso per il semaforo.
I semafori dovrebbero essere collocati in una regione di memoria condivisa. I semafori sono specificati dalle strutture msemaforo . Tutti i valori in una struttura msemaforo dovrebbero derivare da una chiamata subroutine msem_init . Questa chiamata può essere seguita o meno da una sequenza di chiamate alla subroutine msem_lock o alla subroutine msem_unlock . Se un valore di struttura msemaforo è originato in un altro modo, i risultati delle subroutine del semaforo sono indefiniti.
L'indirizzo della struttura msemaforo è significativo. Attenzione a non modificare l'indirizzo della struttura. Se la struttura contiene valori copiati da una struttura msemafora ad un altro indirizzo, i risultati delle subroutine del semaforo sono indefiniti.
Le subroutine semaforiche possono rivelarsi meno efficienti quando le strutture semaforiche esistono in regioni di memoria anonima create con la subroutine mmap , in particolare nei casi in cui molti processi fanno riferimento agli stessi semafori. In queste istanze, le strutture di semaforo dovrebbero essere assegnate su regioni di memoria condivise create con le subroutine shmget e shmat .
Mappare i file con la subroutine shmat
La mappatura può essere utilizzata per ridurre il sovraccarico coinvolto nella scrittura e nella lettura del contenuto dei file. Una volta che il contenuto di un file viene mappato in un'area di memoria utente, il file può essere manipolato come se fossero dati in memoria, utilizzando puntini a quel dato invece di chiamate di input / output. La copia del file su disco serve anche come area di impaginazione per quel file, salvataggio dello spazio di paging.
Un programma può utilizzare qualsiasi file regolare come file di dati mappati. È anche possibile estendere le funzioni di file di dati mappati a file contenenti codice oggetto compilato ed eseguibile. Poiché ai file mappati è possibile accedere più rapidamente ai file regolari, il sistema può caricare un programma più velocemente se il suo file oggetto eseguibile viene mappato in un file.
Per creare un programma come file eseguibile mappato, compilare e collegare il programma utilizzando il flag -K con il comando cc o ld . Il flag -K racconta al linker di creare un file oggetto con un formato allineato alla pagina. Cioè ogni parte del file oggetto inizia su un limite di pagina (un indirizzo che può essere diviso da 2K byte senza alcun resto). Questa opzione si traduce in qualche spazio vuoto nel file oggetto ma consente di mappare il file eseguibile in memoria. Quando il sistema mappa un file oggetto in memoria, il testo e le porzioni dei dati vengono gestiti in modo diverso.
File mappati in scrittura su copia
Per impedire le modifiche apportate ai file mappati dall'apparire immediatamente nel file su disco, associare il file come file di copy - on - write. Questa opzione crea un file associato con modifiche che vengono salvate nello spazio di impaginazione del sistema, invece che alla copia del file su disco. È necessario scegliere di scrivere quelle modifiche alla copia su disco per salvare le modifiche. In caso contrario, si perdono le modifiche quando si chiude il file.
Poiché le modifiche non vengono immediatamente riflesse nella copia del file che altri utenti possono accedere, utilizzare file mappati su copy - on - write solo tra i processi che collaborano tra loro.
Il sistema non rileva la fine dei file mappati con la sottoroutine shmat . Pertanto, se un programma scrive oltre la fine corrente del file in un file mappato su copy - on - write memorizzando nel segmento di memoria corrispondente (dove viene mappato il file), il file effettivo su disco viene esteso con blocchi di zeri in preparazione dei nuovi dati. Se il programma non utilizza la sottoroutine fsync prima di chiudere il file, i dati scritti oltre la precedente fine del file non sono scritti su disco. Il file appare più grande, ma contiene solo gli zeri aggiunti. Pertanto, utilizzare sempre la subroutine fsync prima di chiudere un file mappato su copy - on - write per preservare eventuali dati aggiunti o modificati.
Mappare i segmenti di memoria condivisi con la subroutine shmat
Il sistema utilizza segmenti di memoria condivisi analogamente al modo in cui crea e utilizza i file. Definire i termini utilizzati per la memoria condivisa rispetto ai termini di file system più familiari è fondamentale per comprendere la memoria condivisa. Segue un elenco di definizione dei termini di memoria condivisa:
| Termine | Definizione |
|---|---|
| chiave | L'identificativo univoco di un determinato segmento condiviso. È associato al segmento condiviso fino a quando il segmento condiviso esiste. A tal proposito, è simile al nome file di un file. |
| timido | L'identificativo assegnato al segmento condiviso per l'utilizzo all'interno di un determinato processo. È simile in uso a un descrittore di file per un file. |
| allegare | Specifica che un processo deve allegare un segmento condiviso per utilizzarlo. Allegare un segmento condiviso è simile all'apertura di un file. |
| distaccare | Specifica che un processo deve staccare un segmento condiviso una volta finito di utilizzarlo. Staccare un segmento condiviso è simile alla chiusura di un file. |