2010-10-12 11 views
9

Vorrei (in * nix) allocare uno spazio di indirizzi ampio, contiguo, ma senza consumare risorse immediatamente, cioè voglio riservare un intervallo di indirizzi a cui assegnarlo successivamente.Come posso riservare gli indirizzi di memoria senza assegnarli

Supponiamo che io faccia foo = malloc (3 * 1024 * 1024 * 1024) per allocare 3G, ma su un computer 1G con 1G di file di scambio. Fallirà, giusto?

Quello che voglio fare è dire "Datemi un intervallo di indirizzi di memoria pippo pippo ... + 3G in cui io sarò l'allocazione" in modo da poter garantire tutte le allocazioni all'interno di questa zona sono contigui, ma senza in realtà l'assegnazione immediamente.

Nell'esempio sopra, voglio seguire la chiamata foo = reserve_memory (3G) con una chiamata bar = malloc (123) che dovrebbe essere accettata poiché reserve_memory non ha ancora consumato risorse, garantisce solo che la barra non essere nella gamma foo ... foo + 3G.

Successivamente vorrei fare qualcosa come allocate_for_real (foo, 0,234) per consumare byte 0..234 dell'intervallo di foo. A questo punto, il kernel alloca alcune pagine virtuali e le mappa a foo ... foo + 123 + N

E 'possibile in userspace?

(Il punto di questo è che gli oggetti in foo ... necessariamente contigue e non possono ragionevolmente essere spostati dopo la loro creazione.)

Grazie.

+0

Spero che tu sia su una piattaforma a 64 bit, o un'assegnazione di blocchi 3G difficilmente riuscirà. – MarkR

+0

virtualmente o fisicamente contigui? – shodanex

risposta

15

Risposta breve: funziona già in questo modo.

Risposta leggermente più lunga: la cattiva notizia è che non esiste un modo speciale di riservare un intervallo, ma non di assegnarlo. Tuttavia, le notizie buone sono che quando si assegna un intervallo, Linux in realtà non lo assegna, lo riserva solo per l'utilizzo da parte dell'utente, in un secondo momento.

Il comportamento predefinito di Linux è quello di accettare sempre una nuova allocazione, a patto che ci sia l'indirizzo intervallo lasciato. Tuttavia, quando in realtà inizi ad usare la memoria, è meglio che ci sia un po 'di memoria o almeno lo fai il backup. In caso contrario, il kernel ucciderà un processo per liberare memoria, solitamente il processo che ha assegnato più memoria.

Quindi il problema in Linux con le impostazioni predefinite viene spostata da "quanto posso allocare", in "quanto posso allocare e poi ancora vivo quando iniziare a utilizzare la memoria?"

Here is some info sull'argomento.

+0

Buono a sapersi.Puoi per favore dirmi come trovare la documentazione su questo? – spraff

+1

@spraff: some ---> http://www.ioremap.net/node/125 –

0

Penso che un modo semplice sarebbe farlo con un grande array static.

Su qualsiasi sistema moderno, questo non verrà mappato sulla memoria esistente (nel file eseguibile sul disco o nella RAM della macchina per l'esecuzione) a meno che non si acceda effettivamente ad esso. Una volta acceduto (e il sistema ha abbastanza risorse) sarà miracolosamente inizializzato a tutti gli zeri.

E il tuo programma rallenta seriamente una volta raggiunto il limite della memoria fisica e poi si blocca in modo casuale se si esaurisce lo scambio.

+0

Un array statico di grandi dimensioni funzionerà come anche un malloc, è lo stesso alla fine. –

Problemi correlati