2010-04-30 8 views

Respuesta

6

El valor predeterminado es 1 MB para ambos native y CLR hilos. Puedes modificarlo, aunque eso suele ser una mala idea.

+1

Solo reserva 1MB. Obtiene soporte físico hasta que se usa. ¿Por qué dices que es una mala idea modificarlo? La pila generalmente puede crecer más allá de la reserva inicial, y si 1MB es excesivo para un hilo simple, entonces estás cortando tu espacio de direcciones. –

+0

No dije que fuera una mala idea. Dije que, por lo general, es una mala idea. La creación de miles de millones de subprocesos suele ser la solución incorrecta para un problema, por lo que reducir el tamaño de la pila para que pueda crear miles de millones de subprocesos es casi seguro un error. Sí, hay circunstancias en las que ajustar el tamaño de la pila puede generar ganancias, pero esto solo lo deben hacer las personas que realmente saben lo que hacen. Además, no estoy seguro de a qué te refieres con "la pila generalmente puede crecer más allá de la reserva inicial". AFAIK, no hay API para hacer crecer la pila. –

+0

@Adrian que es un error común. [El CLR realidad ** comete ** 1 MB de RAM por hilo para la pila.] (Http://www.bluebytesoftware.com/blog/PermaLink,guid,733d7537-f982-4886-af62-66bed0f97ab5.aspx) –

1

La sobrecarga de memoria (en la RAM) habrá una página de memoria. Entonces (dependiendo de su plataforma) esto probablemente será de 4 KB.

El tamaño de pila predeterminado para ambos es 1 MB. Sin embargo, eso es solo memoria virtual, así que no hay sobrecarga de RAM a menos que se use.

+0

Esto no es cierto para el código administrado. El CLR siempre compromete previamente la pila de subprocesos de subprocesos administrados, por lo que para los subprocesos de CLR, la pila se calcula con el límite de compromiso. Por supuesto, esto todavía no es memoria física hasta que se toca. – Stewart

+2

Eso es lo que escribí (o quería). Aclaré la respuesta para dejar en claro que está describiendo la RAM de arriba. – Foxfire

3

Consulte el blog de Mark Russinovich sobre win32 kernel limits para obtener una descripción de lo grande que es un único subproceso y la cantidad de sobrecarga que se utiliza.

cuántos recursos los usos de rosca .NET pueden ser difíciles de predecir. Yo diría, no mucho más.

+0

@Christopher: +1 para el enlace –

1

Según las respuestas anteriores, la sobrecarga básica es de 1 MB por hilo. No entraré en los diversos matices, las otras respuestas los tienen cubiertos.

Para los subprocesos de Microsoft Visual C/C++ también tiene la sobrecarga por subproceso de cualquier espacio de trabajo de tiempo de ejecución de C asignado a petición (y almacenado mediante Thread Local Storage TlsAlloc()) para realizar trabajos como sprintf(), scanf(), strtol() etc. No tengo ninguna cifra exacta: necesitaría escanear el código fuente al CRT de Microsoft para calcular eso.

Para otros/tiempos de ejecución de C C++ (gcc/g ++/Borland/mars digitales) que puede o no puede ser similar datos por hilos mantenidas, su un detalle de implementación.

Ninguno de nosotros sabe la parte interna del motor de ejecución .Net, pero es probable que haya algunos datos por subproceso almacenados allí también. Sin embargo, va a ser difícil descubrir qué es lo que está por encima.

Cuestiones relacionadas