2009-02-04 30 views
5

La mayor parte de la literatura sobre memoria virtual señala que, como desarrollador de aplicaciones, comprender la memoria virtual puede ayudarme a aprovechar sus poderosas capacidades. He estado involucrado en el desarrollo de aplicaciones en Linux por algún tiempo, pero no me importaron las complejidades de la memoria virtual mientras codifico. ¿Me estoy perdiendo de algo? Si es así, arroja algo de luz sobre cómo puedo aprovechar el funcionamiento de la memoria virtual. De lo contrario, avíseme si no tengo sentido con la pregunta.Memoria virtual

Respuesta

4

Bueno, el concepto es bastante simple en realidad. No lo repetiré aquí, pero debes buscar cualquier libro sobre diseño de SO y se explicará allí. Recomiendo los "Conceptos del sistema operativo" de Silberscahtz y Galvin, es lo que tuve que usar en la Universidad y es bueno.

Un par de cosas que se me ocurre de qué conocimientos memoria virtual podría darle son:

  • aprendizaje para asignar memoria en los límites de página para evitar el desperdicio (sólo se aplica a la memoria virtual, no el montón de costumbre/memoria de pila);
  • Bloquea algunas páginas en la memoria RAM para que no se intercambien a la unidad de disco duro;
  • páginas de Guardian;
  • Reservando un rango de direcciones y confirmando la memoria real más tarde;
  • Quizás usando el bit NX (no ejecutable) para aumentar la seguridad, pero no estoy seguro de esto.
  • PAE para acceder a> 4 GB en un sistema de 32 bits.

Aún así, todas estas cosas tendrían usos solo en escenarios bastante específicos. De hecho, el 99% de las aplicaciones no necesitan preocuparse por esto.

Agregado: Dicho esto, definitivamente es bueno saber todas estas cosas, para que pueda identificar esos escenarios cuando surjan. Solo ten cuidado, con el poder viene la responsabilidad.

+0

También; La memoria virtual le ofrece la posibilidad de enmascarar la fragmentación de la memoria física. – RandomNickName42

+0

@ RandomNickName42 - También se utiliza para archivos mapeados en memoria y carga parcial de archivos .exe/.dll, pero saber eso no ayuda mucho en la vida cotidiana, excepto para comprender un poco más acerca de la compleja bestia que es la computadora de hoy. –

1

Para la mayoría de las aplicaciones actuales, el programador puede permanecer ajeno al funcionamiento de la memoria de la computadora sin ningún daño. Pero a veces, por ejemplo, cuando desea mejorar la huella de su programa, termina teniendo que manipular la memoria usted mismo. En tales situaciones, saber cómo la memoria está diseñada para funcionar es esencial.

En otras palabras, aunque puede sobrevivir sin él, aprender acerca de la memoria virtual solo lo hará un mejor programador.

Y creo que el Wikipedia article puede ser un buen comienzo.

1

Puede haber 9 de cada 10 casos en los que no tenga que preocuparse por la administración de la memoria virtual. Ese es el trabajo del kernel. Puede ser que en algunas aplicaciones altamente especializadas necesite ajustarlas.

Conozco un artículo que habla sobre la administración de memoria de computadora con énfasis en Linux [http://lwn.net/Articles/250967]. Espero que esto ayude.

2

Es una pregunta vaga.

La forma en que puede usar la memoria virtual, es principalmente a través del uso de archivos mapeados en memoria. Consulte la página man de mmap() para obtener más detalles.

Aunque, probablemente lo esté usando implícitamente de todos modos, ya que cualquier biblioteca dinámica se implementa como un archivo asignado, y muchas bibliotecas de bases de datos también las usan.

La interfaz para utilizar archivos asignados de idiomas de nivel superior suele ser bastante inconveniente, lo que los hace menos útiles.

Los principales beneficios del uso de archivos asignados son:

  • Sin sobrecarga llamada al sistema cuando se accede a las partes del archivo (esto en realidad podría ser una desventaja, ya que un fallo de página, probablemente tiene tanta sobrecarga de todos modos, si sucede)
  • No es necesario copiar los datos de los búferes del sistema operativo a los búferes de la aplicación; esto puede mejorar el rendimiento
  • Posibilidad de compartir memoria entre procesos.

Algunos inconvenientes son:

  • 32-bit máquinas pueden funcionar sin espacio de direcciones fácilmente
  • Difícil de manejar archivos que se extiende correctamente
  • hay manera fácil de ver cuántos/qué páginas son residente actual (puede haber algunas formas)
  • No es bueno para aplicaciones en tiempo real, ya que un error de página puede causar una solicitud de IO, que bloquea el hilo (sin embargo, el archivo puede bloquearse en la memoria, pero solo si suficiente).
1

Si le preocupa el rendimiento, es importante comprender la jerarquía de la memoria.

Para los conjuntos de datos pequeños que están completamente contenidos en la memoria física, debe preocuparse por el almacenamiento en caché (el acceso a la memoria desde la memoria caché es mucho más rápido).

Cuando se trata de grandes conjuntos de datos, que pueden ser paginado debido a la falta de memoria física, debe tener cuidado de mantener sus patrones de acceso localizados.

Por ejemplo, si declara una matriz en C (int a[rows][cols]), se asigna por filas. Por lo tanto, al escanear la matriz, debe escanear por filas en lugar de por columnas. De lo contrario, estará buscando los mismos datos dentro y fuera muchas veces.

Otra cuestión es la diferencia entre sucio y limpio los datos almacenados en la memoria. Los datos limpios son información cargada desde un archivo que no fue modificado por el programa. El sistema operativo puede enviar datos limpios (quizás dependiendo de cómo se cargó) sin escribirlos en el disco. Las páginas sucias deben escribirse primero en el archivo de intercambio.

Cuestiones relacionadas