2012-04-25 20 views
5

En un sistema Linux de 32 bits, un proceso puede acceder a hasta 4 GB de espacio de direcciones virtuales; sin embargo, los procesos parecen ser conservadores en diversos grados al reservar cualquiera de estos. Por lo tanto, un programa que utiliza malloc ocasionalmente aumentará su segmento de datos mediante syscall sbrk/brk. Incluso esas páginas aún no se reclaman en la memoria física. Lo que no entiendo completamente es por qué necesitamos hacerlo, ¿por qué no solo darme 4 GB de espacio de direcciones evitando cualquier llamada sbrk, ya que hasta que toque/reclame esos bloques, es esencialmente una operación gratuita, ¿no?Memoria virtual y sbrk

Respuesta

5

¿Qué sucede si hace un mapa de memoria de un archivo (algo muy común en Linux)? Tiene que ir a algún lugar en el espacio de direcciones, por lo que debe haber algunos medios para definir partes "usadas" y "no usadas".
La memoria compartida (que en realidad solo corresponde a un archivo sin un archivo real) es la misma. Tiene que ir a alguna parte, y el sistema operativo debe estar seguro de poder colocarlo sin sobreescribir algo.

Además, es preferible mantener la localidad de referencia por razones de eficiencia obvias (y menos obvias). Si se le permitiera simplemente escribir y leer desde cualquier ubicación en su espacio de direcciones, puede apostar que algunas personas harían precisamente eso.

+0

"memoria compartida (que en realidad es sólo la asignación de un archivo sin un archivo real) es el mismo. Tiene que ir a alguna parte, y el sistema operativo debe estar seguro de que puede colocarlo sin sobreescribir algo. "Veo lo que dices (creo), como malloc llama a mmap (con anónimo y privado) Creo y eso puede o puede no llame a sbrk, pero si en el programa init malloc ha hecho brk (4gb), elimina el syscall de sbrk, etc. Pero ya no puede mapear archivos de mapas de memoria adicionales o crear memoria compartida con diferentes indicadores. Bien ... Creo que Estoy comenzando a entender –

+0

"Además, es preferible mantener la localidad de referencia por razones de eficiencia obvias (y menos obvias)" Pero si tomo algo de memoria de digamos 1 gb en un bloque de 4 gb y digamos 3.9 gb en el bloque de 4 gb, probablemente lo haga estar cerca en la memoria física una vez que la nueva asignación se segrega por error (simplemente poner a cero a la derecha)? –

+0

Podría, podría no. Usted no puede saber. – Damon

4

Hay un par de razones por las que vienen a la mente:

  • Se podría ya no se consigue segfaults cuando se accede a la memoria no asignada
  • El Translation lookaside buffer (TLB) sería mayor, posiblemente requiriendo más tiempo para configurarlo hasta
  • Habría que desasignar algunos de que la memoria de todas formas si se carga en una nueva biblioteca o mmap compartida() algo
Cuestiones relacionadas