2010-10-12 9 views
9

me gustaría (en * nix) para asignar un espacio de direcciones grande, contigious, pero sin consumir recursos de inmediato, es decir, quiero reservar un rango de direcciones de una asignación de él más tarde.¿Cómo puedo reservar direcciones de memoria y sin asignarlos

Supongamos que hago foo = malloc (3 * 1024 * 1024 * 1024) para asignar 3G, pero en una computadora 1G con 1G de archivo de intercambio. Fallará, ¿verdad?

Lo que quiero hacer es decir "Dame un rango de direcciones de memoria foo foo ... + 3G en el que voy a ser la asignación de" por lo que puedo garantizar todas las asignaciones dentro de esta área son contiguas, pero sin llegar a la asignación inmediatamente.

En el ejemplo anterior, deseo seguir la llamada foo = reserve_memory (3G) con una llamada bar = malloc (123) que debe tener éxito ya que reserve_memory aún no ha consumido recursos, simplemente garantiza que la barra no estar en el rango foo ... foo + 3G.

Más tarde me gustaría hacer algo como allocate_for_real (foo, 0234) para consumir bytes 0..234 del rango de foo. En este punto, el núcleo asignaría algunas páginas virtuales y asignarlos a foo foo ... + 123 + N

Es esto posible en el espacio de usuario?

(El punto de esto es que los objetos en foo ... necesidad de ser contiguas y no pueden razonablemente ser movidos después de su creación.)

Gracias.

+0

Espero que esté en una plataforma de 64 bits, o que una asignación de bloques 3G no sea probable que tenga éxito. – MarkR

+0

virtual o contiguo físicamente? – shodanex

Respuesta

15

Respuesta corta: ya funciona de esa manera.

Respuesta un poco más larga: la mala noticia es que no hay una forma especial de reservar un rango, pero no asignarlo. Sin embargo, la buena noticia es que cuando asigna un rango, Linux no lo asigna, simplemente lo reserva para su uso posterior.

El comportamiento predeterminado de Linux es aceptar siempre una nueva asignación, siempre que haya una dirección rango a la izquierda. Sin embargo, cuando realmente comiences a usar la memoria, será mejor que tengas memoria o al menos intercambie la copia de seguridad. Si no, el núcleo matará un proceso para liberar memoria, generalmente el proceso que asignó la mayor cantidad de memoria.

Entonces, el problema en Linux con la configuración predeterminada se desplaza de "¿cuánto puedo asignar?" A "¿cuánto puedo asignar y y aún estar vivo cuando comienzo a usar la memoria?"

Here is some info sobre el tema.

+0

Eso es bueno saber.¿Puedes decirme cómo encontrar documentación sobre esto? – spraff

+1

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

0

Creo que, una manera simple sería hacer eso con una gran matriz static.

En cualquier sistema moderno esto no va a ser mapeada a memoria existente (en el archivo ejecutable en el disco o en la memoria RAM de la máquina de ejecución), a menos que realmente va a acceder a él. Una vez que acceda a él (y el sistema tenga suficientes recursos) se inicializará milagrosamente a todos los ceros.

Y su programa serio bajará una vez que se alcanza el límite de memoria física y luego se estrella al azar si se le acaba el intercambio.

+0

Una gran matriz estática funcionará como también un malloc, al final es lo mismo. –

Cuestiones relacionadas