getrlimit (2) tiene la siguiente definición en las páginas del manual:
RLIMIT_AS El tamaño máximo de la memoria virtual del proceso (espacio de direcciones) en bytes. Este límite afecta las llamadas a brk (2), mmap (2) y mremap (2), que fallan con el error ENOMEM al exceder este límite. También la expansión automática de la pila fallará (y generará un SIGSEGV que mata el proceso si no se ha puesto a disposición una pila alternativa a través de sigaltstack (2)). Como el valor es largo, en máquinas con una longitud de 32 bits, este límite es como máximo 2 GiB o este recurso es ilimitado.
¿Qué se entiende por "expansión automática de pila" aquí? ¿La pila en un entorno Linux / UNIX crece según sea necesario? En caso afirmativo, ¿cuál es el mecanismo exacto?
ulimit -s
).El mecanismo exacto se da aquí, en Linux: al manejar un error de página en asignaciones anónimas , verifica si es una "asignación de crecimiento" que debe expandirse como una pila. Si el registro del área VM dice que debería hacerlo, entonces ajusta la dirección de inicio para expandir la pila.
Cuando se produce un error de página, dependiendo de la dirección, se puede reparar (y anular el error) mediante la expansión de la pila. Este comportamiento de "crecimiento descendente en caso de falla" para la memoria virtual puede solicitarse mediante programas de usuario arbitrarios con el
MAP_GROWSDOWN
indicador que se pasa a lammap
llamada al sistema.También puede jugar con este mecanismo en un programa de usuario:
Cuando se le solicite, encuentre el pid del programa (vía
ps
) y mire/proc/$THAT_PID/maps
para ver cómo ha crecido el área original.fuente