Per mmap RAM non è concesso. Lo spazio indirizzo è concesso.
Quando si accede allo spazio di indirizzi, si verifica un errore di pagina. Durante l'errore di pagina nella dimensione della pagina, in genere 4096 byte, viene fornita la RAM .
Anche il contenuto di RAM è fornito. Se da un file viene supportato lo spazio indirizzo apparirà il contenuto del file. Se per MAP_ANONYMOUS viene eseguito il backup dello spazio indirizzo , viene visualizzata la RAM inizializzata a zero.
Con i due precedenti sono descritti. Innanzitutto, è possibile inizializzare esattamente la RAM desiderata. Secondo, fino a quando non viene fornita la RAM richiesta.
Per una richiesta di indirizzo inferiore a 2 megabyte da malloc viene estesa l'interruzione di programma. Mentre gli indirizzi vicini all'interruzione del programma vengono forniti , l'interruzione di programma non può essere interrotta. Pertanto, la RAM liberata dal kernel potrebbe non essere restituita. Segue un'analogia. Le calze possono essere rimosse prima delle scarpe?
Con l'invocazione di munmap nel kernel, la RAM viene immediatamente restituita. Con mmap e munmap la probabilità di swap viene mitigata. La probabilità di swap di espansione del programma di malloc viene incitata.
Con malloc inferiore alla dimensione della pagina, è possibile allocare memoria. La memoria discontinua diventa. La memoria del kernel può anche frammentare. Nessuno dei due è perfetto.
Su qualsiasi processore inattivo da parte del kernel, la RAM può essere sbrigliata. Vengono create pagine enormi trasparenti di 2 megabyte. Rispetto a 512 errori di pagina per fornire 2M Quando da un singolo errore di pagina 2M può essere fornito diventa un vantaggio di prestazioni significativo.
Per mmap esiste almeno un alone notevole. Per il backing di mmap è possibile utilizzare un descrittore di file pipe. Un errore non diventa. Tuttavia, nell'indirizzo di memoria i dati forniti dal tubo non vengono visualizzati.
Tuttavia, se MAP_ANONYMOUS viene utilizzato quindi dal descrittore di file pipe nell'indirizzo fornito da mmap, i dati possono essere letti. Anche se non è così efficiente, il risultato desiderato diventa. Da un lseek fallito return e errno è possibile identificare un descrittore di file collegato alla pipa.
Da computer che possono indirizzare un intero megabyte e eseguire un sistema operativo basato su disco quindi l'uso di malloc è essenziale. Se si utilizza la libreria C fornita la funzione getline , sarà probabilmente utilizzato malloc e free.
Su un sistema operativo controllato da kernel invece di mmap perché utilizzare malloc? Rispetto a malloc; mmap sembra complicato? Per invocare munmap deve essere fornito anche l'importo dello spazio di indirizzo richiesto in precedenza . l'uso di malloc è più portatile? malloc sembra più conveniente?
Tuttavia, se si desidera ottenere prestazioni, viene utilizzato mmap.
Ultimo, ma non meno importante, se MAP_SHARED quindi con i processi di progenie i dati possono essere condivisi. Evitare i pthreads è fondamentale. A volte il clone può anche essere evitato.
Sebbene personale, metodi di allocazione variabile elencate in più al meno preferito segue: registro/pila; mmap; globale; malloc. A mano a mano che diversi divieti e divieti diventano. Da un programma sufficientemente complicato; vengono utilizzati tre o forse tutti e quattro i metodi.
Posso supporre che il tuo programma malloc utilizzi read/write o fread/fwrite per fare un po 'di I/O sul file che hai mmap nell'altro caso? – Suppressingfire
Sì, in realtà sto utilizzando lettura/scrittura con malloc, mmap e l'utilizzo delle normali chiamate R/W. utilizzando le chiamate R/W è più veloce rispetto all'utilizzo di malloc, suppongo sia perché l'accesso al disco è più veloce della memoria. – Peter
Non è che l'accesso al disco sia più veloce della memoria. Quasi sempre, la memoria è molto più veloce del disco e malloc non è ciò che costa tempo. Il codice mmap è più veloce perché per il tuo programma, mmap ha comportato un minore accesso al disco o un accesso al disco più efficiente rispetto a qualsiasi altra lettura o scrittura confrontata. Ad esempio, "scriver" l'intero file invia effettivamente tutti quei byte su disco. mmap significa semplicemente * se * si modificano i dati di 'mmap', * quindi * il sistema operativo scriverà le modifiche. Quindi se finisci per non modificare l'intero file, potresti sempre scriverne solo una parte. –