¿Cuáles son las consecuencias de asignar y luego llenar un búfer extremadamente grande en C? ¿Puede una pila tener un tamaño máximo y, de ser así, cuáles son los mecanismos de seguridad que lo hacen cumplir?
¿Cuáles son las consecuencias de asignar y luego llenar un búfer extremadamente grande en C?
Si un proceso crece demasiado en la memoria virtual, puede dar como resultado thrashing .
¿Puede una pila tener un tamaño máximo y, en caso afirmativo, cuáles son los mecanismos de seguridad que lo hacen cumplir?
Esta pregunta ha sido formulada y respondida aquí: cómo funciona ¿El kernel de Linux impone límites de tamaño de pila?
Relacionados: Tamaños de pila de Linux
De la getrlimit
y setrlimit
man page :
RLIMIT_STACK
Este es el tamaño máximo de la pila de proceso, en bytes. Al alcanzar este límite, se genera una señal SIGSEGV. Para manejar esta señal, un proceso debe emplear una pila de señales alternativa ( sigaltstack (2) ).
Desde Linux 2.6.23, este límite también determina la cantidad de espacio utilizado para los argumentos de línea de comando y las variables de entorno del proceso; Para obtener más información, consulte execve (2) .
Los límites, como RLIMIT_STACK, son aplicados por el núcleo:
DESCRIPTION
Las llamadas al sistema getrlimit () y setrlimit () obtienen y configuran recursos límites respectivamente. Cada recurso tiene un soft y hard asociado. límite, según lo definido por la estructura rlimit:
struct rlimit {
rlim_t rlim_cur; /* Soft limit */
rlim_t rlim_max; /* Hard limit (ceiling for rlim_cur) */
};
El límite flexible es el valor que el kernel aplica para el recurso correspondiente. El límite duro actúa como un techo para el límite flexible: un proceso sin privilegios puede establecer solo su límite suave en un valor en el rango de 0 hasta el límite duro, y (irreversiblemente) baja su límite duro. Un proceso privilegiado (bajo Linux: uno con la capacidad CAP_SYS_RESOURCE) puede hacer cambios arbitrarios a cualquiera valor límite.
El valor RLIM_INFINITY denota ningún límite en un recurso (tanto en el estructura devuelta por getrlimit () y en la estructura pasada a setrlimit ()).