Estructura de datos paginable

Para minimizar el conjunto de trabajo de datos, intente concentrar los datos utilizados frecuentemente y evite referencias innecesarias a páginas de almacenamiento virtual.

De manera específica:

  • Utilice las subrutinas malloc() o calloc() para solicitar solo el espacio que necesite realmente. No se recomienda solicitar e inicializar una matriz de tamaño máximo cuando la situación real solo vaya a utilizar una fracción de la misma. Al tocar en una nueva página para inicializar los elementos de matriz, se fuerza a VMM a robar una página de memoria real de alguien. Posteriormente, esto resulta en un error de página cuando el proceso que era el propietario de esa página intenta volver a a acceder a ella. La diferencia entre las subrutinas malloc() y calloc() no es solo la interfaz.
  • Debido a que la subrutina calloc() inicializa a cero el almacenamiento asignado, toca cada una de las páginas que tiene asignadas, mientras que la subrutina malloc() solo toca la primera página. Si utiliza la subrutina calloc() para asignar un área grande y después, al principio, solo utiliza una pequeña parte, pone una carga innecesaria en el sistema. No sólo deben inicializarse las páginas; si se reclaman sus marcos de memoria real, las páginas inicializadas que no se van a utilizar se tienen que escribir en el espacio de paginación. Esta situación desperdicia ranuras de E/S y espacio de paginación.
  • Las listas enlazadas de estructuras grandes (como los almacenamientos intermedios) pueden dar lugar a problemas similares. Si su programa realiza mucho seguimiento en cadena para buscar una clave en particular, considere la posibilidad de conservar los enlaces y las claves separados de los datos o de utilizar un método de tabla hash.
  • Localidad de referencia significa localidad en el tiempo, no solo en el espacio de direcciones. Inicialice las estructuras de datos justo antes de que se utilicen (si es que se utilizan). En un sistema muy cargado, las estructuras de datos que residen durante mucho tiempo entre la inicialización y el uso corren el riesgo de que les roben los marcos. Su programa experimentaría un error de página innecesario al comenzar a utilizar la estructura de datos.
  • Del mismo modo, si una estructura grande se usa pronto y luego se deja intacta durante el resto del programa, se debería liberar. No es suficiente con utilizar la subrutina free() para liberar el espacio que se ha asignado con las subrutinas malloc() o calloc(). La subrutina free() solo libera el rango de direcciones que ocupa la estructura. Para liberar la memoria real y el espacio de paginación, utilice la subrutina disclaim() para renunciar también al espacio. La llamada a disclaim() debe ser anterior a la llamada a free().