Quiero mantener el espacio de direcciones virtuales reservado en mi proceso para la memoria que se usaba anteriormente, pero que actualmente no se necesita. Estoy interesado en la situación en la que el kernel de host es Linux y está configurado para evitar el exceso de compromiso (lo cual ocurre mediante la contabilidad detallada de toda la memoria comprometida).¿Mmap/mprotect-readonly cero páginas cuentan hacia la memoria comprometida?
Si sólo quiero evitar que los datos que mi aplicación ya no está utilizando de ocupar la memoria física o conseguir intercambiado en el disco (el desperdicio de recursos en ambos sentidos), puedo madvise
el kernel que es innecesaria, o mmap
nuevos cero páginas durante encima de eso. Pero ninguno de estos enfoques necesariamente reducirá la cantidad de memoria que cuenta como comprometida, lo que otros procesos no pueden usar.
¿Qué sucede si reemplazo las páginas con cero páginas nuevas que están marcadas como de solo lectura? Mi intención es que no cuenten para la memoria comprometida, y que luego pueda usar mprotect
para hacerlos escribibles, y que fallaría si hacerlos escribibles superara el límite de memoria comprometida. Es mi entendimiento correcto? esto funcionara?
Una página de solo lectura no se debe considerar en un cargo de confirmación de proceso (no tengo una referencia disponible, por lo que esta no es una respuesta), y Linux proporciona la bandera MAP_NORESERVE que debería proporcionarle un garantía. Pero tengo que preguntar: ¿por qué sientes la necesidad de reservar memoria que no está en uso? – Anon
Cosas malas (tm) ocurrirían si las mismas direcciones virtuales fueran asignadas por 'mmap' (al azar) sin que el programa lo supiera. :-) En cuanto a 'MAP_NORESERVE', me preocupa que pueda evitar que las páginas se cuenten incluso después de que' mprotect' escribo más tarde. Supongo que podría simplemente 'mmap'-sobre ellos de nuevo con cero páginas nuevas. –
¿Qué cosas malas pasarían? ¿Por qué su programa necesita nunca volver a utilizar el espacio de direcciones que se utilizó anteriormente? Eso parece muy inusual. – Angus