thread que pthread_create pthread procesos pid_t hilos funcion ejercicios ejemplos linux multithreading stack

que - procesos hilos linux



MediciĆ³n del uso de la pila para la aplicaciĆ³n multihilo de Linux (3)

No conozco ninguna buena herramienta, pero como último recurso podría incluir algún código en su aplicación para verificarlo, similar al siguiente:

__thread void* stack_start; __thread long stack_max_size = 0L; void check_stack_size() { // address of ''nowhere'' approximates end of stack char nowhere; void* stack_end = (void*)&nowhere; // may want to double check stack grows downward on your platform long stack_size = (long)stack_start - (long)stack_end; // update max_stack_size for this thread if (stack_size > stack_max_size) stack_max_size = stack_size; }

La función check_stack_size () debería llamarse en algunas de las funciones que están más anidadas.

Luego, como último enunciado en el hilo, podrías enviar stack_max_size a alguna parte.

La variable stack_start debería inicializarse al inicio de su hilo:

void thread_proc() { char nowhere; stack_start = (void*)&nowhere; // do stuff including calls to check_stack_size() // in deeply nested functions // output stack_max_size here }

Estoy desarrollando una aplicación de subprocesos múltiples para una plataforma incrustada de Linux.

En este momento estoy configurando el tamaño de pila para cada subproceso (a través de pthread_set_attr) a un valor predeterminado bastante grande. Me gustaría ajustar el valor de cada hilo a algo más pequeño para reducir el uso de memoria de mi aplicación. Podría seguir la ruta de prueba y error de establecer el tamaño de pila de cada subproceso en valores progresivamente más pequeños hasta que el programa se bloquee, pero la aplicación utiliza ~ 15 subprocesos cada uno con funcionalidad / atributos completamente diferentes para que el enfoque consuma mucho tiempo.

Preferiría mucho poder medir directamente el uso de la pila de cada hilo. ¿Hay alguna utilidad que la gente pueda recomendar para hacer esto? (Por ejemplo, vengo de un fondo de vxWorks y el uso del comando ''ti'' del shell vxWorks proporciona estadísticas sobre el uso de la pila y otra información útil sobre el estado de la tarea).

Gracias


Hacer referencia a la respuesta de Tobi: puede usar pthread_attr_getstackaddr para obtener la base de la pila en cualquier momento, si es difícil establecer una variable en la inicialización del hilo. A continuación, puede obtener la dirección de una variable automática en su propia función para determinar qué tan profunda es la pila en ese momento.


Aquí hay dos herramientas que miden el uso de pila (pthreads nativos) en aplicaciones Linux:

Valgrind

Uso:

valgrind --tool=drd --show-stack-usage=yes PROG

Valgrind es una herramienta estable y potente, útil no solo para medir el uso de la pila. Sin embargo, es posible que no admita todos los modelos de CPU incorporados.

Stackusage

Uso:

stackusage PROG

Stackusage es una herramienta liviana diseñada específicamente para medir el uso de la pila de subprocesos que debería ser portátil para la mayoría de las plataformas Linux integradas equipadas con glibc. Es probable que no esté tan probado o maduro como Valgrind / drd en este punto.

Descripción completa: soy el autor de Stackusage.