En el software integrado de subprocesos múltiples (escrito en C o C++), un subproceso debe tener suficiente espacio de pila para permitirle completar sus operaciones sin desbordamiento. El tamaño correcto de la pila es crítico en algunos entornos integrados en tiempo real, porque (al menos en algunos sistemas con los que he trabajado), el sistema operativo NO detectará esto por usted.Estimación del tamaño de pila
Por lo general, el tamaño de pila para un nuevo subproceso (que no sea el principal) se designa en el momento en que se crea el subproceso (es decir, en un argumento para pthread_create() o similar). A menudo, estos tamaños de pila están codificados de forma rígida con valores que se sabe que son buenos en el momento en que el código fue originalmente escrito o probado.
Sin embargo, los cambios futuros en el código a menudo rompen las suposiciones en las que se basan los tamaños de pila, y un día fatídico, su subproceso entra en una de las ramas más profundas de su gráfico de llamadas y desborda la pila. abajo de todo el sistema o corrompiendo silenciosamente la memoria.
He visto personalmente este problema en el caso en que el código ejecutado en el hilo declara instancias de estructura en la pila. Cuando la estructura se aumenta para contener datos adicionales, el tamaño de la pila se infla de forma correspondiente, lo que permite potencialmente que se produzcan desbordamientos de pila. Me imagino que esto podría ser un gran problema para las bases de código establecidas donde los efectos completos de agregar campos a una estructura no se pueden conocer de inmediato (demasiados hilos/funciones para encontrar todos los lugares donde se usa esa estructura).
Dado que la respuesta habitual a las preguntas sobre el "tamaño de la pila" es "no son portátiles", supongamos que el compilador, el sistema operativo y el procesador son cantidades conocidas para esta investigación. Supongamos también que la recursión no se utiliza, por lo que no se trata de la posibilidad de un escenario de "recursión infinita".
¿Cuáles son algunas formas confiables de estimar el tamaño de pila necesario para un hilo? Preferiría métodos que están fuera de línea (análisis estático) y automáticos, pero todas las ideas son bienvenidas.
Posibles duplicados: http://stackoverflow.com/questions/924430/, http://stackoverflow.com/questions/389219/ – sbi
Siendo un novato en esta área, tengo que preguntar: ¿no sería el más probable primer paso es eliminar el uso de estructuras como variables automáticas? El tamaño de un puntero no va a cambiar, no importa cuánto importe la estructura que apunta. Y una solicitud explícita de memoria (en lugar de la suposición de que el espacio de la pila está disponible) permitirá que el código maneje el caso donde la memoria no está disponible. – mlibby
o incluso mejor, la estructura en la pila debe almacenar poco más que el puntero a la memoria asignada dinámicamente. De esta forma, obtienes lo mejor de ambos mundos: gestión automática de la vida útil porque está en la pila, y todo lo que lleva más de unos pocos bytes puede asignarse al montón para ahorrar espacio en la pila. – jalf