2008-11-01 11 views
8

Entiendo que crear demasiados subprocesos en una aplicación no es lo que podría llamar un "buen vecino" para otros procesos en ejecución, ya que los recursos de CPU y memoria se consumen incluso si estos subprocesos están en un estado de suspensión eficiente.¿Cuánta memoria consume un hilo cuando se creó por primera vez?

Lo que me interesa es esto: ¿Cuánta memoria (plataforma win32) está siendo consumida por un hilo de dormir?

Teóricamente, supongo que en algún lugar en la región de 1 mb (ya que este es el tamaño de pila predeterminado), pero estoy bastante seguro de que es menor que esto, pero no estoy seguro de por qué.

Cualquier ayuda sobre esto será apreciada.

() La razón por la que estoy preguntando es que estoy considerando introducir un grupo de subprocesos, y me gustaría entender cuánta memoria puedo guardar creando un grupo de 5 subprocesos, en comparación con 20 creados manualmente. hilos)

+0

Corrección de potencial rápida: según tengo entendido, 1MB es el tamaño del tamaño de pila reservado predeterminado. Cualquier marco de pila individual es mucho más pequeño que eso. –

+0

¡Gracias por eso, no estoy seguro de lo que estaba pensando cuando escribí eso! – Alan

+1

Tu premisa es falsa. Crear demasiados hilos se considera ser un mal vecino porque crea muchos cambios de contexto adicionales y contaminación del caché que hacen que todo el sistema sea más lento. A menos que esté hablando de cantidades ridículas de hilos (decenas de miles), el consumo de memoria es insignificante en los sistemas modernos. –

Respuesta

7

tengo una aplicación de servidor que es pesada en el uso de hilo, se utiliza un grupo de subprocesos configurable que está configurado por el cliente, y en al menos un sitio que tiene más de 1000 hilos, y cuando puso en marcha Utiliza solo 50 MB. La razón es que Windows reserva 1MB para la pila (asigna su espacio de direcciones), pero no está necesariamente asignada en la memoria física, solo una parte más pequeña de la misma. Si la pila crece más que eso, se genera un error de página y se asigna más memoria física. No sé cuál es la asignación inicial, pero supongo que es igual a la granularidad de la página del sistema (generalmente 64 KB). Por supuesto, el hilo también usaría un poco más de memoria para otras cosas cuando se creara (TLS, TSS, etc.), pero supongo que el total sería de aproximadamente 200 KB. Y tenga en cuenta que cualquier memoria que no se use con frecuencia sería descargada por el administrador de memoria virtual.

+0

El tamaño de página para x86 y x64 es de 4 KB, para ia64 suele ser de 8 KB pero se puede configurar. –

+0

La granularidad de asignación (como se devuelve de GetSystemInfo()) es de 64 KB en x86 y x64. La documentación de VirtualAlloc() parece decir que las reservas están restringidas por la granularidad de asignación, pero las páginas en un bloque de memoria reservada se pueden comprometer individualmente. – bk1e

+0

Además, Raymond Chen publicó un blog sobre el tamaño de la pila de subprocesos hace unos años: http://blogs.msdn.com/oldnewthing/archive/2005/07/29/444912.aspx – bk1e

0

Creo que tendrías dificultades para detectar cualquier impacto de hacer este tipo de cambio en el código de trabajo - 20 hilos hasta 5. Y luego agrega la complejidad (y gastos generales) añadida de la gestión del grupo de hilos Tal vez vale la pena considerarlo en un sistema integrado, ¿pero Win32?

Y puede establecer el tamaño de la pila a lo que desee.

0

Esto depende en gran medida del sistema:

Pero por lo general, cada uno de los procesos es independiente. Por lo general, el planificador del sistema se asegura de que cada proceso obtenga el mismo acceso al procesador disponible. Por lo tanto, se multiplexa un tiempo de aplicación de múltiples hilos entre los hilos disponibles.

La memoria asignada a un hilo afectará a la memoria disponible para los procesos pero no a la memoria disponible para otros procesos. Un buen SO sacará espacio en la pila no utilizada para que no esté en la memoria física. Sin embargo, si los subprocesos asignan suficiente memoria mientras está en directo, podría causar problemas ya que la memoria de cada procesador se envía a/desde el dispositivo secundario.

Dudo que un hilo de dormir tenga ningún (muy poco) impacto en el sistema.

  • No está utilizando cualquier CPU
  • Cualquier memoria está usando puede ser paginado fuera a un dispositivo secundario.
0

supongo que esto se puede medir con bastante facilidad.

  1. Obtener la cantidad de recursos utilizados por el sistema antes de crear un hilo
  2. Crear un hilo con los valores por defecto del sistema (tamaño de la pila por defecto y otros)
  3. obtener la cantidad de recursos después de crear un hilo y hacer la diferencia (con el paso 1).

Tenga en cuenta que algunos subprocesos deben especificarse valores diferentes a los predeterminados.

Puede intentar y encontrar un uso de memoria promedio creando varios números de subprocesos (paso 2).

La memoria asignada por el sistema operativo cuando se crea un hilo formado por hilos de datos local: TCBTLS ...

De wikipedia: "Hilos hacen los recursos no propios a excepción de una pila, una copia de los registros, incluyendo el contador de programa y almacenamiento local de subprocesos (si hay alguno) ".

4

Agregando comentarios Fabios:

memoria es su segunda preocupación, no la primera. El propósito de un subproceso de subprocesos es, por lo general, restringir la sobrecarga de conmutación de contexto entre subprocesos que se desean ejecutar simultáneamente, idealmente para la cantidad de núcleos de CPU disponibles.

Un cambio de contexto es muy caro, a menudo se cotiza en unos pocos miles a más de 10.000 ciclos de CPU.

Una pequeña prueba en WinXP (32 bit) relojes en aproximadamente 15k bytes privados por subproceso (999 subprocesos creados). Este es el tamaño de pila comprometido inicial, más cualquier otro dato administrado por el sistema operativo.

Cuestiones relacionadas