GNU/Linux >> Linux Esercitazione >  >> Linux

Quanto è portatile mmap?

Il principio di un file mappato in memoria è abbastanza portabile, ma non hai mmap() su Windows (ma esistono cose come MapViewOfFile()). Potresti dare un'occhiata al codice c dei moduli mmap di Python per vedere come lo fanno per varie piattaforme.


L'uso di mmap per leggere i file non è portabile se ti affidi alla mappatura di grandi bit di file di grandi dimensioni nel tuo spazio degli indirizzi:i sistemi a 32 bit possono facilmente non avere un unico grande spazio utilizzabile - diciamo 1G - di spazio degli indirizzi disponibile, quindi mmap fallirebbe del tutto spesso per una mappatura 1G.


Il mmap() funzione è una chiamata POSIX. Funziona bene su MacOS X (e Linux, HP-UX, AIX e Solaris).

L'area problematica sarà Windows. Non sono sicuro che ci sia un _mmap() chiamata nel sottosistema di "compatibilità" POSIX. È probabile che ci sia, ma avrà il nome con il trattino basso iniziale perché Microsoft ha una visione alternativa degli spazi dei nomi e considera mmap() per intromettersi nello spazio dei nomi utente, anche se richiedi la funzionalità POSIX. È possibile trovare una definizione di un'interfaccia Windows alternativa MapViewOfFile() e discussione sulle prestazioni in un'altra domanda SO (mmap() vs blocchi di lettura).

Se provi a mappare file di grandi dimensioni su un sistema a 32 bit, potresti scoprire che non c'è abbastanza spazio contiguo per allocare l'intero file in memoria, quindi la mappatura della memoria fallirà. Non dare per scontato che funzionerà; decidi qual è la tua strategia di fallback se fallisce.


Considero io mappato in memoria su UNIXsas non utilizzabile per applicazioni interattive, in quanto potrebbe risultare in un SIGSEGV/SIGBUS (nel caso in cui il file sia stato troncato nel frattempo da qualche altro processo). Ignorando "soluzioni" malate come setjmp/longjmp non c'è niente si può fare altro che terminare il processo dopo aver ottenuto SIGSEGV/SIGBUS. La nuova funzionalità G++ per convertire tali segnali in eccezioni sembra essere destinata principalmente al sistema operativo Apple, poiché la descrizione afferma che è necessario il supporto runtime per questa funzionalità G++ e non è informazioni su questa funzionalità di G++ si possono trovare ovunque. Probabilmente dovremo aspettare un paio d'anni, fino a quando la gestione strutturata delle eccezioni come quella che si può trovare su Windows da più di 20 anni non si farà strada negli UNIX.


Linux
  1. Come usare il comando sed di Linux

  2. Come diagnosticare e riparare lo spazio su disco mancante?

  3. Come aggiungere spazio di scambio su Debian 11

  4. Come aumentare lo spazio di swap su Linux

  5. Come eseguire il mmap di un buffer del kernel Linux nello spazio utente?

Come controllare l'utilizzo dello spazio su disco in Linux

Come aumentare lo spazio su disco virtuale della VM su VirtualBox

Come controllare lo spazio libero su disco su Linux

Come creare uno spazio di hosting in solidCP?

Come controllare lo spazio di scambio in Linux

Come rimuovere Swap Space da Centos 7.x?